mirror of
https://github.com/morluto/rea.git
synced 2026-10-29 19:05:45 +00:00
refactor(javascript): group domain semantics and contracts (#907)
This commit is contained in:
1 parent
d5f28fb29c
commit
f6a58f1062
253 files changed
+432
-410
No files matched your search
@@ -0,0 +1,56 @@
|
||||
import type {
|
||||
JavaScriptAnalysisAccumulator,
|
||||
JavaScriptFindingContext,
|
||||
JavaScriptModuleRange,
|
||||
LocatedJavaScriptFinding,
|
||||
LocatedJavaScriptFindingInput,
|
||||
} from "./javascriptStaticAnalysisState.js";
|
||||
|
||||
/** Add one module-attributable finding once per source location. */
|
||||
export const addLocatedFinding = <
|
||||
Value extends { readonly module_key: string | null },
|
||||
>(
|
||||
context: JavaScriptFindingContext,
|
||||
input: LocatedJavaScriptFindingInput<Value>,
|
||||
): void =>
|
||||
addFindingOnce(
|
||||
context.accumulator,
|
||||
`${input.key}\0${String(input.node.start)}`,
|
||||
() =>
|
||||
input.collection.push({
|
||||
offset: input.node.start ?? -1,
|
||||
value: input.value,
|
||||
}),
|
||||
);
|
||||
|
||||
/** Reserve one deterministic finding key before mutating an accumulator. */
|
||||
export const addFindingOnce = (
|
||||
accumulator: JavaScriptAnalysisAccumulator,
|
||||
key: string,
|
||||
add: () => void,
|
||||
): void => {
|
||||
if (accumulator.seen.has(key)) return;
|
||||
accumulator.seen.add(key);
|
||||
add();
|
||||
};
|
||||
|
||||
/** Attach recovered bundle-module ownership to findings after traversal. */
|
||||
export const finalizeLocatedFindings = <
|
||||
Value extends { readonly module_key: string | null },
|
||||
>(
|
||||
values: readonly LocatedJavaScriptFinding<Value>[],
|
||||
modules: readonly JavaScriptModuleRange[],
|
||||
): Value[] =>
|
||||
values.map(({ offset, value }) => ({
|
||||
...value,
|
||||
module_key: moduleAtOffset(offset, modules)?.key ?? null,
|
||||
}));
|
||||
|
||||
/** Locate the recovered bundle factory containing one exact source offset. */
|
||||
export const moduleAtOffset = (
|
||||
offset: number | null | undefined,
|
||||
modules: readonly JavaScriptModuleRange[],
|
||||
): JavaScriptModuleRange | undefined => {
|
||||
if (offset === null || offset === undefined) return undefined;
|
||||
return modules.find(({ start, end }) => offset >= start && offset <= end);
|
||||
};
|
||||
Reference in new issue
Block a user