Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 74 additions & 9 deletions scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -381,6 +381,71 @@ export { isExtractConfigPath, isMetadataFormModulePath };

const ROOT = new URL('../..', import.meta.url).pathname;

// ── The source maskers are memoised, because discovery masks each file ~12x ──
//
// PROFILED, not guessed. `discoverFamilies` hands the SAME source string to six
// analysers in one pass of its per-family loop — `extractWatchHints`,
// `readProgramTargetsInSource`, `payloadEnvDependence`, `firstPartyImportTargets`,
// `spawnedProgramTargets` and `packageManifestTargets` — and every one of them
// re-derives the masked body from scratch, two of them twice (they mask, then
// hand the masked text to `anchoredReadTargets`, which masks again). One source
// therefore pays `maskComments` about seven times and `maskSelfTests` about five,
// per discovery, for bytes that cannot have changed in between.
//
// The cost that buys: a V8 CPU profile of ONE `discoverFamilies()` call on this
// tree — 201 families, 196 distinct gate sources, 11.8 MB of them — spent 14.3 s,
// of which `maskSelfTests` was 4.5 s of self time (31.7%) and the `maskComments`
// inside those six analysers most of another 5.2 s. That is the largest single
// entry in the profile, and all of it above the first pass is repetition.
//
// So the maskers are memoised on their INPUT STRING. Both are pure functions of
// that string, and JavaScript strings are immutable, so a memo is
// observationally identical to calling through: same bytes in, same bytes out,
// and no caller can edit the shared result under another. ⛔ This changes
// nothing about WHAT is masked, scanned or discovered — it is the same
// derivation run once instead of a dozen times, which is the only kind of
// speed-up this tool may take.
//
// The bound is in BYTES rather than entries because the corpora these run over
// differ by three orders of magnitude: the gate set is ~12 MB and fits whole, so
// repeated discoveries in one process reuse it, while a tracked-corpus sweep
// would otherwise grow the cache without limit. Eviction is oldest-first, and a
// miss after eviction is a recomputation — never a different answer.
const MASK_MEMO_BYTE_BUDGET = 32 * 1024 * 1024;

function memoiseMask(compute) {
const cache = new Map();
let bytes = 0;
return (source) => {
// A non-string argument is passed straight through: today's behaviour is
// whatever the masker does with it, and a memo must not be the thing that
// decides otherwise.
if (typeof source !== 'string') return compute(source);
const hit = cache.get(source);
if (hit !== undefined) return hit;
const value = compute(source);
cache.set(source, value);
bytes += source.length + value.length;
// `Map` iterates in insertion order, so the first key is the oldest.
while (bytes > MASK_MEMO_BYTE_BUDGET && cache.size > 1) {
const oldest = cache.keys().next().value;
bytes -= oldest.length + cache.get(oldest).length;
cache.delete(oldest);
}
return value;
};
}

/** `maskComments`, memoised — see the block above. */
const maskedComments = memoiseMask((source) => maskComments(source));

/**
* `maskSelfTests(maskComments(source))`, memoised — see the block above. It
* composes through `maskedComments` rather than calling `maskComments` again, so
* the comment mask is derived once for the callers that want each half.
*/
const maskedModuleBody = memoiseMask((source) => maskSelfTests(maskedComments(source)));

// ── What a gate that IMPORTS this module inherits (#11556) ─────────────────
//
// This module is importable and is NOT a discovered gate file — `check:pm-dispatch-gates`
Expand DownExpand Up@@ -1538,7 +1603,7 @@ const PAYLOAD_ENV_ACCESS = new RegExp(
* the difference between classifying a gate and classifying its docblock.
*/
export function payloadEnvDependence(scriptSource) {
const body = maskSelfTests(maskComments(String(scriptSource)));
const body = maskedModuleBody(String(scriptSource));
return PAYLOAD_ENV_ACCESS.test(body) ? WORKFLOW_PAYLOAD_ENV : null;
}

Expand DownExpand Up@@ -2366,7 +2431,7 @@ export const COMPOUND_ANCHOR_KEYS = new Map(
*/
export function compoundAnchorDecls(source) {
const scan = scanSource(source);
const decommented = maskComments(source);
const decommented = maskedComments(source);
const out = [];
for (const m of decommented.matchAll(SELF_TEST_DECL)) {
if (scan.comment[m.index] || scan.literal[m.index]) continue;
Expand DownExpand Up@@ -2959,7 +3024,7 @@ export function packageRootAnchoredHint(hint, base, tree, files) {
* have to remember to do it.
*/
export function extractWatchHints(scriptSource, scriptPath = null, { tree = null } = {}) {
const moduleBody = maskSelfTests(maskComments(scriptSource));
const moduleBody = maskedModuleBody(scriptSource);
const hints = new Set();
for (const m of moduleBody.matchAll(/['"`]([^'"`\n]{2,120})['"`]/g)) {
const raw = m[1];
Expand DownExpand Up@@ -3175,7 +3240,7 @@ export function firstPartyImportTargets(scriptPath, source, { root = ROOT } = {}
// The same masking hint extraction uses, for the same reason: an import
// written out in a docblock, or one inside a self-test fixture, is a
// specifier this script NAMES rather than one it loads.
const body = maskSelfTests(maskComments(String(source)));
const body = maskedModuleBody(String(source));
const specifiers = new Set();
for (const m of body.matchAll(IMPORT_FROM_SPECIFIER)) specifiers.add(m[2]);
for (const m of body.matchAll(SIDE_EFFECT_IMPORT)) specifiers.add(m[2]);
Expand DownExpand Up@@ -5234,7 +5299,7 @@ function combineReadings(readings, name) {
* own repo-relative path — the anchor spellings resolve against it.
*/
export function scratchDirSitesInSource(rel, source) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
// A call spelled inside a STRING is a fixture, not a call — this module's own
// self-test plants fixture sources as string literals, and read as code they
// reported four sites in a file that creates none of them. Comments are
Expand DownExpand Up@@ -5394,7 +5459,7 @@ export function readProgramTargetsInSource(rel, source, isTracked) {

/** Every TRACKED file the source opens at a path anchored to its own location. */
export function anchoredReadTargets(rel, source, isTracked) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5533,7 +5598,7 @@ export function spawnedProgramTargets(rel, source, isTracked) {
// follow inherits a POPULATION, and a spawn written inside a self-test body
// is a fixture the self-test drives rather than the gate's work. The read
// scan next door wants the opposite from the same bytes, and says so.
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5717,7 +5782,7 @@ const PACKAGE_MANIFEST_TARGET = /(?:^|\/)package\.json$/;
const MANIFEST_EXPORTS_READ = /(?<!\bmodule)\.exports\b|\[\s*(['"`])exports\1\s*\]|\bexports\s*[:?]/;

export function packageManifestTargets(rel, source, isTracked) {
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
if (!MANIFEST_EXPORTS_READ.test(masked)) return [];
return anchoredReadTargets(rel, masked, isTracked).filter((t) => PACKAGE_MANIFEST_TARGET.test(t));
}
Expand DownExpand Up@@ -6635,7 +6700,7 @@ export function stampsAnErrorCodeLiteral(path, readSource = readTrackedSource) {
// Comments are masked for the reason the gate masks them: a code DISCUSSED in
// prose is not a code stamped in source. This narrows nothing the gate would
// have reported, so it costs no recall in the expensive direction.
const masked = maskComments(source);
const masked = maskedComments(source);
return CODE_STAMP_POSITION.test(masked) || CODE_CONSTANT_BINDING.test(masked);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 74 additions & 9 deletions scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -381,6 +381,71 @@ export { isExtractConfigPath, isMetadataFormModulePath };

const ROOT = new URL('../..', import.meta.url).pathname;

// ── The source maskers are memoised, because discovery masks each file ~12x ──
//
// PROFILED, not guessed. `discoverFamilies` hands the SAME source string to six
// analysers in one pass of its per-family loop — `extractWatchHints`,
// `readProgramTargetsInSource`, `payloadEnvDependence`, `firstPartyImportTargets`,
// `spawnedProgramTargets` and `packageManifestTargets` — and every one of them
// re-derives the masked body from scratch, two of them twice (they mask, then
// hand the masked text to `anchoredReadTargets`, which masks again). One source
// therefore pays `maskComments` about seven times and `maskSelfTests` about five,
// per discovery, for bytes that cannot have changed in between.
//
// The cost that buys: a V8 CPU profile of ONE `discoverFamilies()` call on this
// tree — 201 families, 196 distinct gate sources, 11.8 MB of them — spent 14.3 s,
// of which `maskSelfTests` was 4.5 s of self time (31.7%) and the `maskComments`
// inside those six analysers most of another 5.2 s. That is the largest single
// entry in the profile, and all of it above the first pass is repetition.
//
// So the maskers are memoised on their INPUT STRING. Both are pure functions of
// that string, and JavaScript strings are immutable, so a memo is
// observationally identical to calling through: same bytes in, same bytes out,
// and no caller can edit the shared result under another. ⛔ This changes
// nothing about WHAT is masked, scanned or discovered — it is the same
// derivation run once instead of a dozen times, which is the only kind of
// speed-up this tool may take.
//
// The bound is in BYTES rather than entries because the corpora these run over
// differ by three orders of magnitude: the gate set is ~12 MB and fits whole, so
// repeated discoveries in one process reuse it, while a tracked-corpus sweep
// would otherwise grow the cache without limit. Eviction is oldest-first, and a
// miss after eviction is a recomputation — never a different answer.
const MASK_MEMO_BYTE_BUDGET = 32 * 1024 * 1024;

function memoiseMask(compute) {
const cache = new Map();
let bytes = 0;
return (source) => {
// A non-string argument is passed straight through: today's behaviour is
// whatever the masker does with it, and a memo must not be the thing that
// decides otherwise.
if (typeof source !== 'string') return compute(source);
const hit = cache.get(source);
if (hit !== undefined) return hit;
const value = compute(source);
cache.set(source, value);
bytes += source.length + value.length;
// `Map` iterates in insertion order, so the first key is the oldest.
while (bytes > MASK_MEMO_BYTE_BUDGET && cache.size > 1) {
const oldest = cache.keys().next().value;
bytes -= oldest.length + cache.get(oldest).length;
cache.delete(oldest);
}
return value;
};
}

/** `maskComments`, memoised — see the block above. */
const maskedComments = memoiseMask((source) => maskComments(source));

/**
* `maskSelfTests(maskComments(source))`, memoised — see the block above. It
* composes through `maskedComments` rather than calling `maskComments` again, so
* the comment mask is derived once for the callers that want each half.
*/
const maskedModuleBody = memoiseMask((source) => maskSelfTests(maskedComments(source)));

// ── What a gate that IMPORTS this module inherits (#11556) ─────────────────
//
// This module is importable and is NOT a discovered gate file — `check:pm-dispatch-gates`
Expand DownExpand Up@@ -1538,7 +1603,7 @@ const PAYLOAD_ENV_ACCESS = new RegExp(
* the difference between classifying a gate and classifying its docblock.
*/
export function payloadEnvDependence(scriptSource) {
const body = maskSelfTests(maskComments(String(scriptSource)));
const body = maskedModuleBody(String(scriptSource));
return PAYLOAD_ENV_ACCESS.test(body) ? WORKFLOW_PAYLOAD_ENV : null;
}

Expand DownExpand Up@@ -2366,7 +2431,7 @@ export const COMPOUND_ANCHOR_KEYS = new Map(
*/
export function compoundAnchorDecls(source) {
const scan = scanSource(source);
const decommented = maskComments(source);
const decommented = maskedComments(source);
const out = [];
for (const m of decommented.matchAll(SELF_TEST_DECL)) {
if (scan.comment[m.index] || scan.literal[m.index]) continue;
Expand DownExpand Up@@ -2959,7 +3024,7 @@ export function packageRootAnchoredHint(hint, base, tree, files) {
* have to remember to do it.
*/
export function extractWatchHints(scriptSource, scriptPath = null, { tree = null } = {}) {
const moduleBody = maskSelfTests(maskComments(scriptSource));
const moduleBody = maskedModuleBody(scriptSource);
const hints = new Set();
for (const m of moduleBody.matchAll(/['"`]([^'"`\n]{2,120})['"`]/g)) {
const raw = m[1];
Expand DownExpand Up@@ -3175,7 +3240,7 @@ export function firstPartyImportTargets(scriptPath, source, { root = ROOT } = {}
// The same masking hint extraction uses, for the same reason: an import
// written out in a docblock, or one inside a self-test fixture, is a
// specifier this script NAMES rather than one it loads.
const body = maskSelfTests(maskComments(String(source)));
const body = maskedModuleBody(String(source));
const specifiers = new Set();
for (const m of body.matchAll(IMPORT_FROM_SPECIFIER)) specifiers.add(m[2]);
for (const m of body.matchAll(SIDE_EFFECT_IMPORT)) specifiers.add(m[2]);
Expand DownExpand Up@@ -5234,7 +5299,7 @@ function combineReadings(readings, name) {
* own repo-relative path — the anchor spellings resolve against it.
*/
export function scratchDirSitesInSource(rel, source) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
// A call spelled inside a STRING is a fixture, not a call — this module's own
// self-test plants fixture sources as string literals, and read as code they
// reported four sites in a file that creates none of them. Comments are
Expand DownExpand Up@@ -5394,7 +5459,7 @@ export function readProgramTargetsInSource(rel, source, isTracked) {

/** Every TRACKED file the source opens at a path anchored to its own location. */
export function anchoredReadTargets(rel, source, isTracked) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5533,7 +5598,7 @@ export function spawnedProgramTargets(rel, source, isTracked) {
// follow inherits a POPULATION, and a spawn written inside a self-test body
// is a fixture the self-test drives rather than the gate's work. The read
// scan next door wants the opposite from the same bytes, and says so.
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5717,7 +5782,7 @@ const PACKAGE_MANIFEST_TARGET = /(?:^|\/)package\.json$/;
const MANIFEST_EXPORTS_READ = /(?<!\bmodule)\.exports\b|\[\s*(['"`])exports\1\s*\]|\bexports\s*[:?]/;

export function packageManifestTargets(rel, source, isTracked) {
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
if (!MANIFEST_EXPORTS_READ.test(masked)) return [];
return anchoredReadTargets(rel, masked, isTracked).filter((t) => PACKAGE_MANIFEST_TARGET.test(t));
}
Expand DownExpand Up@@ -6635,7 +6700,7 @@ export function stampsAnErrorCodeLiteral(path, readSource = readTrackedSource) {
// Comments are masked for the reason the gate masks them: a code DISCUSSED in
// prose is not a code stamped in source. This narrows nothing the gate would
// have reported, so it costs no recall in the expensive direction.
const masked = maskComments(source);
const masked = maskedComments(source);
return CODE_STAMP_POSITION.test(masked) || CODE_CONSTANT_BINDING.test(masked);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 74 additions & 9 deletions scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -381,6 +381,71 @@ export { isExtractConfigPath, isMetadataFormModulePath };

const ROOT = new URL('../..', import.meta.url).pathname;

// ── The source maskers are memoised, because discovery masks each file ~12x ──
//
// PROFILED, not guessed. `discoverFamilies` hands the SAME source string to six
// analysers in one pass of its per-family loop — `extractWatchHints`,
// `readProgramTargetsInSource`, `payloadEnvDependence`, `firstPartyImportTargets`,
// `spawnedProgramTargets` and `packageManifestTargets` — and every one of them
// re-derives the masked body from scratch, two of them twice (they mask, then
// hand the masked text to `anchoredReadTargets`, which masks again). One source
// therefore pays `maskComments` about seven times and `maskSelfTests` about five,
// per discovery, for bytes that cannot have changed in between.
//
// The cost that buys: a V8 CPU profile of ONE `discoverFamilies()` call on this
// tree — 201 families, 196 distinct gate sources, 11.8 MB of them — spent 14.3 s,
// of which `maskSelfTests` was 4.5 s of self time (31.7%) and the `maskComments`
// inside those six analysers most of another 5.2 s. That is the largest single
// entry in the profile, and all of it above the first pass is repetition.
//
// So the maskers are memoised on their INPUT STRING. Both are pure functions of
// that string, and JavaScript strings are immutable, so a memo is
// observationally identical to calling through: same bytes in, same bytes out,
// and no caller can edit the shared result under another. ⛔ This changes
// nothing about WHAT is masked, scanned or discovered — it is the same
// derivation run once instead of a dozen times, which is the only kind of
// speed-up this tool may take.
//
// The bound is in BYTES rather than entries because the corpora these run over
// differ by three orders of magnitude: the gate set is ~12 MB and fits whole, so
// repeated discoveries in one process reuse it, while a tracked-corpus sweep
// would otherwise grow the cache without limit. Eviction is oldest-first, and a
// miss after eviction is a recomputation — never a different answer.
const MASK_MEMO_BYTE_BUDGET = 32 * 1024 * 1024;

function memoiseMask(compute) {
const cache = new Map();
let bytes = 0;
return (source) => {
// A non-string argument is passed straight through: today's behaviour is
// whatever the masker does with it, and a memo must not be the thing that
// decides otherwise.
if (typeof source !== 'string') return compute(source);
const hit = cache.get(source);
if (hit !== undefined) return hit;
const value = compute(source);
cache.set(source, value);
bytes += source.length + value.length;
// `Map` iterates in insertion order, so the first key is the oldest.
while (bytes > MASK_MEMO_BYTE_BUDGET && cache.size > 1) {
const oldest = cache.keys().next().value;
bytes -= oldest.length + cache.get(oldest).length;
cache.delete(oldest);
}
return value;
};
}

/** `maskComments`, memoised — see the block above. */
const maskedComments = memoiseMask((source) => maskComments(source));

/**
* `maskSelfTests(maskComments(source))`, memoised — see the block above. It
* composes through `maskedComments` rather than calling `maskComments` again, so
* the comment mask is derived once for the callers that want each half.
*/
const maskedModuleBody = memoiseMask((source) => maskSelfTests(maskedComments(source)));

// ── What a gate that IMPORTS this module inherits (#11556) ─────────────────
//
// This module is importable and is NOT a discovered gate file — `check:pm-dispatch-gates`
Expand DownExpand Up@@ -1538,7 +1603,7 @@ const PAYLOAD_ENV_ACCESS = new RegExp(
* the difference between classifying a gate and classifying its docblock.
*/
export function payloadEnvDependence(scriptSource) {
const body = maskSelfTests(maskComments(String(scriptSource)));
const body = maskedModuleBody(String(scriptSource));
return PAYLOAD_ENV_ACCESS.test(body) ? WORKFLOW_PAYLOAD_ENV : null;
}

Expand DownExpand Up@@ -2366,7 +2431,7 @@ export const COMPOUND_ANCHOR_KEYS = new Map(
*/
export function compoundAnchorDecls(source) {
const scan = scanSource(source);
const decommented = maskComments(source);
const decommented = maskedComments(source);
const out = [];
for (const m of decommented.matchAll(SELF_TEST_DECL)) {
if (scan.comment[m.index] || scan.literal[m.index]) continue;
Expand DownExpand Up@@ -2959,7 +3024,7 @@ export function packageRootAnchoredHint(hint, base, tree, files) {
* have to remember to do it.
*/
export function extractWatchHints(scriptSource, scriptPath = null, { tree = null } = {}) {
const moduleBody = maskSelfTests(maskComments(scriptSource));
const moduleBody = maskedModuleBody(scriptSource);
const hints = new Set();
for (const m of moduleBody.matchAll(/['"`]([^'"`\n]{2,120})['"`]/g)) {
const raw = m[1];
Expand DownExpand Up@@ -3175,7 +3240,7 @@ export function firstPartyImportTargets(scriptPath, source, { root = ROOT } = {}
// The same masking hint extraction uses, for the same reason: an import
// written out in a docblock, or one inside a self-test fixture, is a
// specifier this script NAMES rather than one it loads.
const body = maskSelfTests(maskComments(String(source)));
const body = maskedModuleBody(String(source));
const specifiers = new Set();
for (const m of body.matchAll(IMPORT_FROM_SPECIFIER)) specifiers.add(m[2]);
for (const m of body.matchAll(SIDE_EFFECT_IMPORT)) specifiers.add(m[2]);
Expand DownExpand Up@@ -5234,7 +5299,7 @@ function combineReadings(readings, name) {
* own repo-relative path — the anchor spellings resolve against it.
*/
export function scratchDirSitesInSource(rel, source) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
// A call spelled inside a STRING is a fixture, not a call — this module's own
// self-test plants fixture sources as string literals, and read as code they
// reported four sites in a file that creates none of them. Comments are
Expand DownExpand Up@@ -5394,7 +5459,7 @@ export function readProgramTargetsInSource(rel, source, isTracked) {

/** Every TRACKED file the source opens at a path anchored to its own location. */
export function anchoredReadTargets(rel, source, isTracked) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5533,7 +5598,7 @@ export function spawnedProgramTargets(rel, source, isTracked) {
// follow inherits a POPULATION, and a spawn written inside a self-test body
// is a fixture the self-test drives rather than the gate's work. The read
// scan next door wants the opposite from the same bytes, and says so.
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5717,7 +5782,7 @@ const PACKAGE_MANIFEST_TARGET = /(?:^|\/)package\.json$/;
const MANIFEST_EXPORTS_READ = /(?<!\bmodule)\.exports\b|\[\s*(['"`])exports\1\s*\]|\bexports\s*[:?]/;

export function packageManifestTargets(rel, source, isTracked) {
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
if (!MANIFEST_EXPORTS_READ.test(masked)) return [];
return anchoredReadTargets(rel, masked, isTracked).filter((t) => PACKAGE_MANIFEST_TARGET.test(t));
}
Expand DownExpand Up@@ -6635,7 +6700,7 @@ export function stampsAnErrorCodeLiteral(path, readSource = readTrackedSource) {
// Comments are masked for the reason the gate masks them: a code DISCUSSED in
// prose is not a code stamped in source. This narrows nothing the gate would
// have reported, so it costs no recall in the expensive direction.
const masked = maskComments(source);
const masked = maskedComments(source);
return CODE_STAMP_POSITION.test(masked) || CODE_CONSTANT_BINDING.test(masked);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 74 additions & 9 deletions scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -381,6 +381,71 @@ export { isExtractConfigPath, isMetadataFormModulePath };

const ROOT = new URL('../..', import.meta.url).pathname;

// ── The source maskers are memoised, because discovery masks each file ~12x ──
//
// PROFILED, not guessed. `discoverFamilies` hands the SAME source string to six
// analysers in one pass of its per-family loop — `extractWatchHints`,
// `readProgramTargetsInSource`, `payloadEnvDependence`, `firstPartyImportTargets`,
// `spawnedProgramTargets` and `packageManifestTargets` — and every one of them
// re-derives the masked body from scratch, two of them twice (they mask, then
// hand the masked text to `anchoredReadTargets`, which masks again). One source
// therefore pays `maskComments` about seven times and `maskSelfTests` about five,
// per discovery, for bytes that cannot have changed in between.
//
// The cost that buys: a V8 CPU profile of ONE `discoverFamilies()` call on this
// tree — 201 families, 196 distinct gate sources, 11.8 MB of them — spent 14.3 s,
// of which `maskSelfTests` was 4.5 s of self time (31.7%) and the `maskComments`
// inside those six analysers most of another 5.2 s. That is the largest single
// entry in the profile, and all of it above the first pass is repetition.
//
// So the maskers are memoised on their INPUT STRING. Both are pure functions of
// that string, and JavaScript strings are immutable, so a memo is
// observationally identical to calling through: same bytes in, same bytes out,
// and no caller can edit the shared result under another. ⛔ This changes
// nothing about WHAT is masked, scanned or discovered — it is the same
// derivation run once instead of a dozen times, which is the only kind of
// speed-up this tool may take.
//
// The bound is in BYTES rather than entries because the corpora these run over
// differ by three orders of magnitude: the gate set is ~12 MB and fits whole, so
// repeated discoveries in one process reuse it, while a tracked-corpus sweep
// would otherwise grow the cache without limit. Eviction is oldest-first, and a
// miss after eviction is a recomputation — never a different answer.
const MASK_MEMO_BYTE_BUDGET = 32 * 1024 * 1024;

function memoiseMask(compute) {
const cache = new Map();
let bytes = 0;
return (source) => {
// A non-string argument is passed straight through: today's behaviour is
// whatever the masker does with it, and a memo must not be the thing that
// decides otherwise.
if (typeof source !== 'string') return compute(source);
const hit = cache.get(source);
if (hit !== undefined) return hit;
const value = compute(source);
cache.set(source, value);
bytes += source.length + value.length;
// `Map` iterates in insertion order, so the first key is the oldest.
while (bytes > MASK_MEMO_BYTE_BUDGET && cache.size > 1) {
const oldest = cache.keys().next().value;
bytes -= oldest.length + cache.get(oldest).length;
cache.delete(oldest);
}
return value;
};
}

/** `maskComments`, memoised — see the block above. */
const maskedComments = memoiseMask((source) => maskComments(source));

/**
* `maskSelfTests(maskComments(source))`, memoised — see the block above. It
* composes through `maskedComments` rather than calling `maskComments` again, so
* the comment mask is derived once for the callers that want each half.
*/
const maskedModuleBody = memoiseMask((source) => maskSelfTests(maskedComments(source)));

// ── What a gate that IMPORTS this module inherits (#11556) ─────────────────
//
// This module is importable and is NOT a discovered gate file — `check:pm-dispatch-gates`
Expand DownExpand Up@@ -1538,7 +1603,7 @@ const PAYLOAD_ENV_ACCESS = new RegExp(
* the difference between classifying a gate and classifying its docblock.
*/
export function payloadEnvDependence(scriptSource) {
const body = maskSelfTests(maskComments(String(scriptSource)));
const body = maskedModuleBody(String(scriptSource));
return PAYLOAD_ENV_ACCESS.test(body) ? WORKFLOW_PAYLOAD_ENV : null;
}

Expand DownExpand Up@@ -2366,7 +2431,7 @@ export const COMPOUND_ANCHOR_KEYS = new Map(
*/
export function compoundAnchorDecls(source) {
const scan = scanSource(source);
const decommented = maskComments(source);
const decommented = maskedComments(source);
const out = [];
for (const m of decommented.matchAll(SELF_TEST_DECL)) {
if (scan.comment[m.index] || scan.literal[m.index]) continue;
Expand DownExpand Up@@ -2959,7 +3024,7 @@ export function packageRootAnchoredHint(hint, base, tree, files) {
* have to remember to do it.
*/
export function extractWatchHints(scriptSource, scriptPath = null, { tree = null } = {}) {
const moduleBody = maskSelfTests(maskComments(scriptSource));
const moduleBody = maskedModuleBody(scriptSource);
const hints = new Set();
for (const m of moduleBody.matchAll(/['"`]([^'"`\n]{2,120})['"`]/g)) {
const raw = m[1];
Expand DownExpand Up@@ -3175,7 +3240,7 @@ export function firstPartyImportTargets(scriptPath, source, { root = ROOT } = {}
// The same masking hint extraction uses, for the same reason: an import
// written out in a docblock, or one inside a self-test fixture, is a
// specifier this script NAMES rather than one it loads.
const body = maskSelfTests(maskComments(String(source)));
const body = maskedModuleBody(String(source));
const specifiers = new Set();
for (const m of body.matchAll(IMPORT_FROM_SPECIFIER)) specifiers.add(m[2]);
for (const m of body.matchAll(SIDE_EFFECT_IMPORT)) specifiers.add(m[2]);
Expand DownExpand Up@@ -5234,7 +5299,7 @@ function combineReadings(readings, name) {
* own repo-relative path — the anchor spellings resolve against it.
*/
export function scratchDirSitesInSource(rel, source) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
// A call spelled inside a STRING is a fixture, not a call — this module's own
// self-test plants fixture sources as string literals, and read as code they
// reported four sites in a file that creates none of them. Comments are
Expand DownExpand Up@@ -5394,7 +5459,7 @@ export function readProgramTargetsInSource(rel, source, isTracked) {

/** Every TRACKED file the source opens at a path anchored to its own location. */
export function anchoredReadTargets(rel, source, isTracked) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5533,7 +5598,7 @@ export function spawnedProgramTargets(rel, source, isTracked) {
// follow inherits a POPULATION, and a spawn written inside a self-test body
// is a fixture the self-test drives rather than the gate's work. The read
// scan next door wants the opposite from the same bytes, and says so.
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5717,7 +5782,7 @@ const PACKAGE_MANIFEST_TARGET = /(?:^|\/)package\.json$/;
const MANIFEST_EXPORTS_READ = /(?<!\bmodule)\.exports\b|\[\s*(['"`])exports\1\s*\]|\bexports\s*[:?]/;

export function packageManifestTargets(rel, source, isTracked) {
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
if (!MANIFEST_EXPORTS_READ.test(masked)) return [];
return anchoredReadTargets(rel, masked, isTracked).filter((t) => PACKAGE_MANIFEST_TARGET.test(t));
}
Expand DownExpand Up@@ -6635,7 +6700,7 @@ export function stampsAnErrorCodeLiteral(path, readSource = readTrackedSource) {
// Comments are masked for the reason the gate masks them: a code DISCUSSED in
// prose is not a code stamped in source. This narrows nothing the gate would
// have reported, so it costs no recall in the expensive direction.
const masked = maskComments(source);
const masked = maskedComments(source);
return CODE_STAMP_POSITION.test(masked) || CODE_CONSTANT_BINDING.test(masked);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 74 additions & 9 deletions scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -381,6 +381,71 @@ export { isExtractConfigPath, isMetadataFormModulePath };

const ROOT = new URL('../..', import.meta.url).pathname;

// ── The source maskers are memoised, because discovery masks each file ~12x ──
//
// PROFILED, not guessed. `discoverFamilies` hands the SAME source string to six
// analysers in one pass of its per-family loop — `extractWatchHints`,
// `readProgramTargetsInSource`, `payloadEnvDependence`, `firstPartyImportTargets`,
// `spawnedProgramTargets` and `packageManifestTargets` — and every one of them
// re-derives the masked body from scratch, two of them twice (they mask, then
// hand the masked text to `anchoredReadTargets`, which masks again). One source
// therefore pays `maskComments` about seven times and `maskSelfTests` about five,
// per discovery, for bytes that cannot have changed in between.
//
// The cost that buys: a V8 CPU profile of ONE `discoverFamilies()` call on this
// tree — 201 families, 196 distinct gate sources, 11.8 MB of them — spent 14.3 s,
// of which `maskSelfTests` was 4.5 s of self time (31.7%) and the `maskComments`
// inside those six analysers most of another 5.2 s. That is the largest single
// entry in the profile, and all of it above the first pass is repetition.
//
// So the maskers are memoised on their INPUT STRING. Both are pure functions of
// that string, and JavaScript strings are immutable, so a memo is
// observationally identical to calling through: same bytes in, same bytes out,
// and no caller can edit the shared result under another. ⛔ This changes
// nothing about WHAT is masked, scanned or discovered — it is the same
// derivation run once instead of a dozen times, which is the only kind of
// speed-up this tool may take.
//
// The bound is in BYTES rather than entries because the corpora these run over
// differ by three orders of magnitude: the gate set is ~12 MB and fits whole, so
// repeated discoveries in one process reuse it, while a tracked-corpus sweep
// would otherwise grow the cache without limit. Eviction is oldest-first, and a
// miss after eviction is a recomputation — never a different answer.
const MASK_MEMO_BYTE_BUDGET = 32 * 1024 * 1024;

function memoiseMask(compute) {
const cache = new Map();
let bytes = 0;
return (source) => {
// A non-string argument is passed straight through: today's behaviour is
// whatever the masker does with it, and a memo must not be the thing that
// decides otherwise.
if (typeof source !== 'string') return compute(source);
const hit = cache.get(source);
if (hit !== undefined) return hit;
const value = compute(source);
cache.set(source, value);
bytes += source.length + value.length;
// `Map` iterates in insertion order, so the first key is the oldest.
while (bytes > MASK_MEMO_BYTE_BUDGET && cache.size > 1) {
const oldest = cache.keys().next().value;
bytes -= oldest.length + cache.get(oldest).length;
cache.delete(oldest);
}
return value;
};
}

/** `maskComments`, memoised — see the block above. */
const maskedComments = memoiseMask((source) => maskComments(source));

/**
* `maskSelfTests(maskComments(source))`, memoised — see the block above. It
* composes through `maskedComments` rather than calling `maskComments` again, so
* the comment mask is derived once for the callers that want each half.
*/
const maskedModuleBody = memoiseMask((source) => maskSelfTests(maskedComments(source)));

// ── What a gate that IMPORTS this module inherits (#11556) ─────────────────
//
// This module is importable and is NOT a discovered gate file — `check:pm-dispatch-gates`
Expand DownExpand Up@@ -1538,7 +1603,7 @@ const PAYLOAD_ENV_ACCESS = new RegExp(
* the difference between classifying a gate and classifying its docblock.
*/
export function payloadEnvDependence(scriptSource) {
const body = maskSelfTests(maskComments(String(scriptSource)));
const body = maskedModuleBody(String(scriptSource));
return PAYLOAD_ENV_ACCESS.test(body) ? WORKFLOW_PAYLOAD_ENV : null;
}

Expand DownExpand Up@@ -2366,7 +2431,7 @@ export const COMPOUND_ANCHOR_KEYS = new Map(
*/
export function compoundAnchorDecls(source) {
const scan = scanSource(source);
const decommented = maskComments(source);
const decommented = maskedComments(source);
const out = [];
for (const m of decommented.matchAll(SELF_TEST_DECL)) {
if (scan.comment[m.index] || scan.literal[m.index]) continue;
Expand DownExpand Up@@ -2959,7 +3024,7 @@ export function packageRootAnchoredHint(hint, base, tree, files) {
* have to remember to do it.
*/
export function extractWatchHints(scriptSource, scriptPath = null, { tree = null } = {}) {
const moduleBody = maskSelfTests(maskComments(scriptSource));
const moduleBody = maskedModuleBody(scriptSource);
const hints = new Set();
for (const m of moduleBody.matchAll(/['"`]([^'"`\n]{2,120})['"`]/g)) {
const raw = m[1];
Expand DownExpand Up@@ -3175,7 +3240,7 @@ export function firstPartyImportTargets(scriptPath, source, { root = ROOT } = {}
// The same masking hint extraction uses, for the same reason: an import
// written out in a docblock, or one inside a self-test fixture, is a
// specifier this script NAMES rather than one it loads.
const body = maskSelfTests(maskComments(String(source)));
const body = maskedModuleBody(String(source));
const specifiers = new Set();
for (const m of body.matchAll(IMPORT_FROM_SPECIFIER)) specifiers.add(m[2]);
for (const m of body.matchAll(SIDE_EFFECT_IMPORT)) specifiers.add(m[2]);
Expand DownExpand Up@@ -5234,7 +5299,7 @@ function combineReadings(readings, name) {
* own repo-relative path — the anchor spellings resolve against it.
*/
export function scratchDirSitesInSource(rel, source) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
// A call spelled inside a STRING is a fixture, not a call — this module's own
// self-test plants fixture sources as string literals, and read as code they
// reported four sites in a file that creates none of them. Comments are
Expand DownExpand Up@@ -5394,7 +5459,7 @@ export function readProgramTargetsInSource(rel, source, isTracked) {

/** Every TRACKED file the source opens at a path anchored to its own location. */
export function anchoredReadTargets(rel, source, isTracked) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5533,7 +5598,7 @@ export function spawnedProgramTargets(rel, source, isTracked) {
// follow inherits a POPULATION, and a spawn written inside a self-test body
// is a fixture the self-test drives rather than the gate's work. The read
// scan next door wants the opposite from the same bytes, and says so.
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5717,7 +5782,7 @@ const PACKAGE_MANIFEST_TARGET = /(?:^|\/)package\.json$/;
const MANIFEST_EXPORTS_READ = /(?<!\bmodule)\.exports\b|\[\s*(['"`])exports\1\s*\]|\bexports\s*[:?]/;

export function packageManifestTargets(rel, source, isTracked) {
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
if (!MANIFEST_EXPORTS_READ.test(masked)) return [];
return anchoredReadTargets(rel, masked, isTracked).filter((t) => PACKAGE_MANIFEST_TARGET.test(t));
}
Expand DownExpand Up@@ -6635,7 +6700,7 @@ export function stampsAnErrorCodeLiteral(path, readSource = readTrackedSource) {
// Comments are masked for the reason the gate masks them: a code DISCUSSED in
// prose is not a code stamped in source. This narrows nothing the gate would
// have reported, so it costs no recall in the expensive direction.
const masked = maskComments(source);
const masked = maskedComments(source);
return CODE_STAMP_POSITION.test(masked) || CODE_CONSTANT_BINDING.test(masked);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 74 additions & 9 deletions scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -381,6 +381,71 @@ export { isExtractConfigPath, isMetadataFormModulePath };

const ROOT = new URL('../..', import.meta.url).pathname;

// ── The source maskers are memoised, because discovery masks each file ~12x ──
//
// PROFILED, not guessed. `discoverFamilies` hands the SAME source string to six
// analysers in one pass of its per-family loop — `extractWatchHints`,
// `readProgramTargetsInSource`, `payloadEnvDependence`, `firstPartyImportTargets`,
// `spawnedProgramTargets` and `packageManifestTargets` — and every one of them
// re-derives the masked body from scratch, two of them twice (they mask, then
// hand the masked text to `anchoredReadTargets`, which masks again). One source
// therefore pays `maskComments` about seven times and `maskSelfTests` about five,
// per discovery, for bytes that cannot have changed in between.
//
// The cost that buys: a V8 CPU profile of ONE `discoverFamilies()` call on this
// tree — 201 families, 196 distinct gate sources, 11.8 MB of them — spent 14.3 s,
// of which `maskSelfTests` was 4.5 s of self time (31.7%) and the `maskComments`
// inside those six analysers most of another 5.2 s. That is the largest single
// entry in the profile, and all of it above the first pass is repetition.
//
// So the maskers are memoised on their INPUT STRING. Both are pure functions of
// that string, and JavaScript strings are immutable, so a memo is
// observationally identical to calling through: same bytes in, same bytes out,
// and no caller can edit the shared result under another. ⛔ This changes
// nothing about WHAT is masked, scanned or discovered — it is the same
// derivation run once instead of a dozen times, which is the only kind of
// speed-up this tool may take.
//
// The bound is in BYTES rather than entries because the corpora these run over
// differ by three orders of magnitude: the gate set is ~12 MB and fits whole, so
// repeated discoveries in one process reuse it, while a tracked-corpus sweep
// would otherwise grow the cache without limit. Eviction is oldest-first, and a
// miss after eviction is a recomputation — never a different answer.
const MASK_MEMO_BYTE_BUDGET = 32 * 1024 * 1024;

function memoiseMask(compute) {
const cache = new Map();
let bytes = 0;
return (source) => {
// A non-string argument is passed straight through: today's behaviour is
// whatever the masker does with it, and a memo must not be the thing that
// decides otherwise.
if (typeof source !== 'string') return compute(source);
const hit = cache.get(source);
if (hit !== undefined) return hit;
const value = compute(source);
cache.set(source, value);
bytes += source.length + value.length;
// `Map` iterates in insertion order, so the first key is the oldest.
while (bytes > MASK_MEMO_BYTE_BUDGET && cache.size > 1) {
const oldest = cache.keys().next().value;
bytes -= oldest.length + cache.get(oldest).length;
cache.delete(oldest);
}
return value;
};
}

/** `maskComments`, memoised — see the block above. */
const maskedComments = memoiseMask((source) => maskComments(source));

/**
* `maskSelfTests(maskComments(source))`, memoised — see the block above. It
* composes through `maskedComments` rather than calling `maskComments` again, so
* the comment mask is derived once for the callers that want each half.
*/
const maskedModuleBody = memoiseMask((source) => maskSelfTests(maskedComments(source)));

// ── What a gate that IMPORTS this module inherits (#11556) ─────────────────
//
// This module is importable and is NOT a discovered gate file — `check:pm-dispatch-gates`
Expand DownExpand Up@@ -1538,7 +1603,7 @@ const PAYLOAD_ENV_ACCESS = new RegExp(
* the difference between classifying a gate and classifying its docblock.
*/
export function payloadEnvDependence(scriptSource) {
const body = maskSelfTests(maskComments(String(scriptSource)));
const body = maskedModuleBody(String(scriptSource));
return PAYLOAD_ENV_ACCESS.test(body) ? WORKFLOW_PAYLOAD_ENV : null;
}

Expand DownExpand Up@@ -2366,7 +2431,7 @@ export const COMPOUND_ANCHOR_KEYS = new Map(
*/
export function compoundAnchorDecls(source) {
const scan = scanSource(source);
const decommented = maskComments(source);
const decommented = maskedComments(source);
const out = [];
for (const m of decommented.matchAll(SELF_TEST_DECL)) {
if (scan.comment[m.index] || scan.literal[m.index]) continue;
Expand DownExpand Up@@ -2959,7 +3024,7 @@ export function packageRootAnchoredHint(hint, base, tree, files) {
* have to remember to do it.
*/
export function extractWatchHints(scriptSource, scriptPath = null, { tree = null } = {}) {
const moduleBody = maskSelfTests(maskComments(scriptSource));
const moduleBody = maskedModuleBody(scriptSource);
const hints = new Set();
for (const m of moduleBody.matchAll(/['"`]([^'"`\n]{2,120})['"`]/g)) {
const raw = m[1];
Expand DownExpand Up@@ -3175,7 +3240,7 @@ export function firstPartyImportTargets(scriptPath, source, { root = ROOT } = {}
// The same masking hint extraction uses, for the same reason: an import
// written out in a docblock, or one inside a self-test fixture, is a
// specifier this script NAMES rather than one it loads.
const body = maskSelfTests(maskComments(String(source)));
const body = maskedModuleBody(String(source));
const specifiers = new Set();
for (const m of body.matchAll(IMPORT_FROM_SPECIFIER)) specifiers.add(m[2]);
for (const m of body.matchAll(SIDE_EFFECT_IMPORT)) specifiers.add(m[2]);
Expand DownExpand Up@@ -5234,7 +5299,7 @@ function combineReadings(readings, name) {
* own repo-relative path — the anchor spellings resolve against it.
*/
export function scratchDirSitesInSource(rel, source) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
// A call spelled inside a STRING is a fixture, not a call — this module's own
// self-test plants fixture sources as string literals, and read as code they
// reported four sites in a file that creates none of them. Comments are
Expand DownExpand Up@@ -5394,7 +5459,7 @@ export function readProgramTargetsInSource(rel, source, isTracked) {

/** Every TRACKED file the source opens at a path anchored to its own location. */
export function anchoredReadTargets(rel, source, isTracked) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5533,7 +5598,7 @@ export function spawnedProgramTargets(rel, source, isTracked) {
// follow inherits a POPULATION, and a spawn written inside a self-test body
// is a fixture the self-test drives rather than the gate's work. The read
// scan next door wants the opposite from the same bytes, and says so.
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5717,7 +5782,7 @@ const PACKAGE_MANIFEST_TARGET = /(?:^|\/)package\.json$/;
const MANIFEST_EXPORTS_READ = /(?<!\bmodule)\.exports\b|\[\s*(['"`])exports\1\s*\]|\bexports\s*[:?]/;

export function packageManifestTargets(rel, source, isTracked) {
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
if (!MANIFEST_EXPORTS_READ.test(masked)) return [];
return anchoredReadTargets(rel, masked, isTracked).filter((t) => PACKAGE_MANIFEST_TARGET.test(t));
}
Expand DownExpand Up@@ -6635,7 +6700,7 @@ export function stampsAnErrorCodeLiteral(path, readSource = readTrackedSource) {
// Comments are masked for the reason the gate masks them: a code DISCUSSED in
// prose is not a code stamped in source. This narrows nothing the gate would
// have reported, so it costs no recall in the expensive direction.
const masked = maskComments(source);
const masked = maskedComments(source);
return CODE_STAMP_POSITION.test(masked) || CODE_CONSTANT_BINDING.test(masked);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 74 additions & 9 deletions scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -381,6 +381,71 @@ export { isExtractConfigPath, isMetadataFormModulePath };

const ROOT = new URL('../..', import.meta.url).pathname;

// ── The source maskers are memoised, because discovery masks each file ~12x ──
//
// PROFILED, not guessed. `discoverFamilies` hands the SAME source string to six
// analysers in one pass of its per-family loop — `extractWatchHints`,
// `readProgramTargetsInSource`, `payloadEnvDependence`, `firstPartyImportTargets`,
// `spawnedProgramTargets` and `packageManifestTargets` — and every one of them
// re-derives the masked body from scratch, two of them twice (they mask, then
// hand the masked text to `anchoredReadTargets`, which masks again). One source
// therefore pays `maskComments` about seven times and `maskSelfTests` about five,
// per discovery, for bytes that cannot have changed in between.
//
// The cost that buys: a V8 CPU profile of ONE `discoverFamilies()` call on this
// tree — 201 families, 196 distinct gate sources, 11.8 MB of them — spent 14.3 s,
// of which `maskSelfTests` was 4.5 s of self time (31.7%) and the `maskComments`
// inside those six analysers most of another 5.2 s. That is the largest single
// entry in the profile, and all of it above the first pass is repetition.
//
// So the maskers are memoised on their INPUT STRING. Both are pure functions of
// that string, and JavaScript strings are immutable, so a memo is
// observationally identical to calling through: same bytes in, same bytes out,
// and no caller can edit the shared result under another. ⛔ This changes
// nothing about WHAT is masked, scanned or discovered — it is the same
// derivation run once instead of a dozen times, which is the only kind of
// speed-up this tool may take.
//
// The bound is in BYTES rather than entries because the corpora these run over
// differ by three orders of magnitude: the gate set is ~12 MB and fits whole, so
// repeated discoveries in one process reuse it, while a tracked-corpus sweep
// would otherwise grow the cache without limit. Eviction is oldest-first, and a
// miss after eviction is a recomputation — never a different answer.
const MASK_MEMO_BYTE_BUDGET = 32 * 1024 * 1024;

function memoiseMask(compute) {
const cache = new Map();
let bytes = 0;
return (source) => {
// A non-string argument is passed straight through: today's behaviour is
// whatever the masker does with it, and a memo must not be the thing that
// decides otherwise.
if (typeof source !== 'string') return compute(source);
const hit = cache.get(source);
if (hit !== undefined) return hit;
const value = compute(source);
cache.set(source, value);
bytes += source.length + value.length;
// `Map` iterates in insertion order, so the first key is the oldest.
while (bytes > MASK_MEMO_BYTE_BUDGET && cache.size > 1) {
const oldest = cache.keys().next().value;
bytes -= oldest.length + cache.get(oldest).length;
cache.delete(oldest);
}
return value;
};
}

/** `maskComments`, memoised — see the block above. */
const maskedComments = memoiseMask((source) => maskComments(source));

/**
* `maskSelfTests(maskComments(source))`, memoised — see the block above. It
* composes through `maskedComments` rather than calling `maskComments` again, so
* the comment mask is derived once for the callers that want each half.
*/
const maskedModuleBody = memoiseMask((source) => maskSelfTests(maskedComments(source)));

// ── What a gate that IMPORTS this module inherits (#11556) ─────────────────
//
// This module is importable and is NOT a discovered gate file — `check:pm-dispatch-gates`
Expand DownExpand Up@@ -1538,7 +1603,7 @@ const PAYLOAD_ENV_ACCESS = new RegExp(
* the difference between classifying a gate and classifying its docblock.
*/
export function payloadEnvDependence(scriptSource) {
const body = maskSelfTests(maskComments(String(scriptSource)));
const body = maskedModuleBody(String(scriptSource));
return PAYLOAD_ENV_ACCESS.test(body) ? WORKFLOW_PAYLOAD_ENV : null;
}

Expand DownExpand Up@@ -2366,7 +2431,7 @@ export const COMPOUND_ANCHOR_KEYS = new Map(
*/
export function compoundAnchorDecls(source) {
const scan = scanSource(source);
const decommented = maskComments(source);
const decommented = maskedComments(source);
const out = [];
for (const m of decommented.matchAll(SELF_TEST_DECL)) {
if (scan.comment[m.index] || scan.literal[m.index]) continue;
Expand DownExpand Up@@ -2959,7 +3024,7 @@ export function packageRootAnchoredHint(hint, base, tree, files) {
* have to remember to do it.
*/
export function extractWatchHints(scriptSource, scriptPath = null, { tree = null } = {}) {
const moduleBody = maskSelfTests(maskComments(scriptSource));
const moduleBody = maskedModuleBody(scriptSource);
const hints = new Set();
for (const m of moduleBody.matchAll(/['"`]([^'"`\n]{2,120})['"`]/g)) {
const raw = m[1];
Expand DownExpand Up@@ -3175,7 +3240,7 @@ export function firstPartyImportTargets(scriptPath, source, { root = ROOT } = {}
// The same masking hint extraction uses, for the same reason: an import
// written out in a docblock, or one inside a self-test fixture, is a
// specifier this script NAMES rather than one it loads.
const body = maskSelfTests(maskComments(String(source)));
const body = maskedModuleBody(String(source));
const specifiers = new Set();
for (const m of body.matchAll(IMPORT_FROM_SPECIFIER)) specifiers.add(m[2]);
for (const m of body.matchAll(SIDE_EFFECT_IMPORT)) specifiers.add(m[2]);
Expand DownExpand Up@@ -5234,7 +5299,7 @@ function combineReadings(readings, name) {
* own repo-relative path — the anchor spellings resolve against it.
*/
export function scratchDirSitesInSource(rel, source) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
// A call spelled inside a STRING is a fixture, not a call — this module's own
// self-test plants fixture sources as string literals, and read as code they
// reported four sites in a file that creates none of them. Comments are
Expand DownExpand Up@@ -5394,7 +5459,7 @@ export function readProgramTargetsInSource(rel, source, isTracked) {

/** Every TRACKED file the source opens at a path anchored to its own location. */
export function anchoredReadTargets(rel, source, isTracked) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5533,7 +5598,7 @@ export function spawnedProgramTargets(rel, source, isTracked) {
// follow inherits a POPULATION, and a spawn written inside a self-test body
// is a fixture the self-test drives rather than the gate's work. The read
// scan next door wants the opposite from the same bytes, and says so.
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5717,7 +5782,7 @@ const PACKAGE_MANIFEST_TARGET = /(?:^|\/)package\.json$/;
const MANIFEST_EXPORTS_READ = /(?<!\bmodule)\.exports\b|\[\s*(['"`])exports\1\s*\]|\bexports\s*[:?]/;

export function packageManifestTargets(rel, source, isTracked) {
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
if (!MANIFEST_EXPORTS_READ.test(masked)) return [];
return anchoredReadTargets(rel, masked, isTracked).filter((t) => PACKAGE_MANIFEST_TARGET.test(t));
}
Expand DownExpand Up@@ -6635,7 +6700,7 @@ export function stampsAnErrorCodeLiteral(path, readSource = readTrackedSource) {
// Comments are masked for the reason the gate masks them: a code DISCUSSED in
// prose is not a code stamped in source. This narrows nothing the gate would
// have reported, so it costs no recall in the expensive direction.
const masked = maskComments(source);
const masked = maskedComments(source);
return CODE_STAMP_POSITION.test(masked) || CODE_CONSTANT_BINDING.test(masked);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 74 additions & 9 deletions scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -381,6 +381,71 @@ export { isExtractConfigPath, isMetadataFormModulePath };

const ROOT = new URL('../..', import.meta.url).pathname;

// ── The source maskers are memoised, because discovery masks each file ~12x ──
//
// PROFILED, not guessed. `discoverFamilies` hands the SAME source string to six
// analysers in one pass of its per-family loop — `extractWatchHints`,
// `readProgramTargetsInSource`, `payloadEnvDependence`, `firstPartyImportTargets`,
// `spawnedProgramTargets` and `packageManifestTargets` — and every one of them
// re-derives the masked body from scratch, two of them twice (they mask, then
// hand the masked text to `anchoredReadTargets`, which masks again). One source
// therefore pays `maskComments` about seven times and `maskSelfTests` about five,
// per discovery, for bytes that cannot have changed in between.
//
// The cost that buys: a V8 CPU profile of ONE `discoverFamilies()` call on this
// tree — 201 families, 196 distinct gate sources, 11.8 MB of them — spent 14.3 s,
// of which `maskSelfTests` was 4.5 s of self time (31.7%) and the `maskComments`
// inside those six analysers most of another 5.2 s. That is the largest single
// entry in the profile, and all of it above the first pass is repetition.
//
// So the maskers are memoised on their INPUT STRING. Both are pure functions of
// that string, and JavaScript strings are immutable, so a memo is
// observationally identical to calling through: same bytes in, same bytes out,
// and no caller can edit the shared result under another. ⛔ This changes
// nothing about WHAT is masked, scanned or discovered — it is the same
// derivation run once instead of a dozen times, which is the only kind of
// speed-up this tool may take.
//
// The bound is in BYTES rather than entries because the corpora these run over
// differ by three orders of magnitude: the gate set is ~12 MB and fits whole, so
// repeated discoveries in one process reuse it, while a tracked-corpus sweep
// would otherwise grow the cache without limit. Eviction is oldest-first, and a
// miss after eviction is a recomputation — never a different answer.
const MASK_MEMO_BYTE_BUDGET = 32 * 1024 * 1024;

function memoiseMask(compute) {
const cache = new Map();
let bytes = 0;
return (source) => {
// A non-string argument is passed straight through: today's behaviour is
// whatever the masker does with it, and a memo must not be the thing that
// decides otherwise.
if (typeof source !== 'string') return compute(source);
const hit = cache.get(source);
if (hit !== undefined) return hit;
const value = compute(source);
cache.set(source, value);
bytes += source.length + value.length;
// `Map` iterates in insertion order, so the first key is the oldest.
while (bytes > MASK_MEMO_BYTE_BUDGET && cache.size > 1) {
const oldest = cache.keys().next().value;
bytes -= oldest.length + cache.get(oldest).length;
cache.delete(oldest);
}
return value;
};
}

/** `maskComments`, memoised — see the block above. */
const maskedComments = memoiseMask((source) => maskComments(source));

/**
* `maskSelfTests(maskComments(source))`, memoised — see the block above. It
* composes through `maskedComments` rather than calling `maskComments` again, so
* the comment mask is derived once for the callers that want each half.
*/
const maskedModuleBody = memoiseMask((source) => maskSelfTests(maskedComments(source)));

// ── What a gate that IMPORTS this module inherits (#11556) ─────────────────
//
// This module is importable and is NOT a discovered gate file — `check:pm-dispatch-gates`
Expand DownExpand Up@@ -1538,7 +1603,7 @@ const PAYLOAD_ENV_ACCESS = new RegExp(
* the difference between classifying a gate and classifying its docblock.
*/
export function payloadEnvDependence(scriptSource) {
const body = maskSelfTests(maskComments(String(scriptSource)));
const body = maskedModuleBody(String(scriptSource));
return PAYLOAD_ENV_ACCESS.test(body) ? WORKFLOW_PAYLOAD_ENV : null;
}

Expand DownExpand Up@@ -2366,7 +2431,7 @@ export const COMPOUND_ANCHOR_KEYS = new Map(
*/
export function compoundAnchorDecls(source) {
const scan = scanSource(source);
const decommented = maskComments(source);
const decommented = maskedComments(source);
const out = [];
for (const m of decommented.matchAll(SELF_TEST_DECL)) {
if (scan.comment[m.index] || scan.literal[m.index]) continue;
Expand DownExpand Up@@ -2959,7 +3024,7 @@ export function packageRootAnchoredHint(hint, base, tree, files) {
* have to remember to do it.
*/
export function extractWatchHints(scriptSource, scriptPath = null, { tree = null } = {}) {
const moduleBody = maskSelfTests(maskComments(scriptSource));
const moduleBody = maskedModuleBody(scriptSource);
const hints = new Set();
for (const m of moduleBody.matchAll(/['"`]([^'"`\n]{2,120})['"`]/g)) {
const raw = m[1];
Expand DownExpand Up@@ -3175,7 +3240,7 @@ export function firstPartyImportTargets(scriptPath, source, { root = ROOT } = {}
// The same masking hint extraction uses, for the same reason: an import
// written out in a docblock, or one inside a self-test fixture, is a
// specifier this script NAMES rather than one it loads.
const body = maskSelfTests(maskComments(String(source)));
const body = maskedModuleBody(String(source));
const specifiers = new Set();
for (const m of body.matchAll(IMPORT_FROM_SPECIFIER)) specifiers.add(m[2]);
for (const m of body.matchAll(SIDE_EFFECT_IMPORT)) specifiers.add(m[2]);
Expand DownExpand Up@@ -5234,7 +5299,7 @@ function combineReadings(readings, name) {
* own repo-relative path — the anchor spellings resolve against it.
*/
export function scratchDirSitesInSource(rel, source) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
// A call spelled inside a STRING is a fixture, not a call — this module's own
// self-test plants fixture sources as string literals, and read as code they
// reported four sites in a file that creates none of them. Comments are
Expand DownExpand Up@@ -5394,7 +5459,7 @@ export function readProgramTargetsInSource(rel, source, isTracked) {

/** Every TRACKED file the source opens at a path anchored to its own location. */
export function anchoredReadTargets(rel, source, isTracked) {
const masked = maskComments(String(source));
const masked = maskedComments(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5533,7 +5598,7 @@ export function spawnedProgramTargets(rel, source, isTracked) {
// follow inherits a POPULATION, and a spawn written inside a self-test body
// is a fixture the self-test drives rather than the gate's work. The read
// scan next door wants the opposite from the same bytes, and says so.
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
const { literal } = scanSource(masked);
const ctx = {
fileSegs: rel.split('/'),
Expand DownExpand Up@@ -5717,7 +5782,7 @@ const PACKAGE_MANIFEST_TARGET = /(?:^|\/)package\.json$/;
const MANIFEST_EXPORTS_READ = /(?<!\bmodule)\.exports\b|\[\s*(['"`])exports\1\s*\]|\bexports\s*[:?]/;

export function packageManifestTargets(rel, source, isTracked) {
const masked = maskSelfTests(maskComments(String(source)));
const masked = maskedModuleBody(String(source));
if (!MANIFEST_EXPORTS_READ.test(masked)) return [];
return anchoredReadTargets(rel, masked, isTracked).filter((t) => PACKAGE_MANIFEST_TARGET.test(t));
}
Expand DownExpand Up@@ -6635,7 +6700,7 @@ export function stampsAnErrorCodeLiteral(path, readSource = readTrackedSource) {
// Comments are masked for the reason the gate masks them: a code DISCUSSED in
// prose is not a code stamped in source. This narrows nothing the gate would
// have reported, so it costs no recall in the expensive direction.
const masked = maskComments(source);
const masked = maskedComments(source);
return CODE_STAMP_POSITION.test(masked) || CODE_CONSTANT_BINDING.test(masked);
}

Expand Down
Loading