import { assertEquals } from "@std/assert"; import ts from "typescript"; import { BINDING_IDENTITY_HELPER_NAME, createBindingIdentityHelperSource, createFunctionHardeningHelperSource, FUNCTION_HARDENING_HELPER_NAME, } from "@commonfabric/utils/sandbox-contract"; import { stripJsTrivia } from "../src/sandbox/compiled-js-parser.ts"; import { COMMONFABRIC_TYPES } from "../../ts-transformers/test/commonfabric-test-types.ts"; import { transformSource } from "../../ts-transformers/test/utils.ts"; function emittedFunction( source: string, sourceFile: ts.SourceFile, name: string, ): string { const matches = sourceFile.statements.filter((statement) => ts.isFunctionDeclaration(statement) && statement.name?.text === name ); assertEquals( matches.length, 1, `expected exactly one emitted ${name} declaration`, ); const match = matches[0]!; return stripJsTrivia(source, match.getStart(sourceFile), match.getEnd()); } Deno.test("transformer hardening helpers match the sandbox verifier contract", async () => { const output = await transformSource( `/// import { pattern, WriteAuthorizedBy } from "commonfabric"; function saveTitle(): string { return "saved"; } interface Output { savedTitle: WriteAuthorizedBy; } export default pattern<{}, Output>(() => ({ savedTitle: "saved", })); `, { types: COMMONFABRIC_TYPES }, ); const sourceFile = ts.createSourceFile( "/test.tsx", output, ts.ScriptTarget.ESNext, true, ts.ScriptKind.TSX, ); assertEquals( emittedFunction(output, sourceFile, FUNCTION_HARDENING_HELPER_NAME), stripJsTrivia( createFunctionHardeningHelperSource( FUNCTION_HARDENING_HELPER_NAME, { typedParameter: true }, ), ), ); assertEquals( emittedFunction(output, sourceFile, BINDING_IDENTITY_HELPER_NAME), stripJsTrivia( createBindingIdentityHelperSource( BINDING_IDENTITY_HELPER_NAME, undefined, { typedParameter: true }, ), ), ); });