@tracecode/harness 0.6.2 → 0.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs CHANGED
@@ -24,6 +24,10 @@ var ASSET_COPY_PLAN = [
24
24
  source: ["workers", "java", "java-worker.js"],
25
25
  target: ["java-worker.js"]
26
26
  },
27
+ {
28
+ source: ["workers", "java", "java-source-augmentations.cjs"],
29
+ target: ["java-source-augmentations.cjs"]
30
+ },
27
31
  {
28
32
  source: ["workers", "vendor", "typescript.js"],
29
33
  target: ["vendor", "typescript.js"]
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { copyFile, mkdir } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\n\nconst ASSET_COPY_PLAN = [\n {\n source: ['workers', 'python', 'pyodide-worker.js'],\n target: ['pyodide-worker.js'],\n },\n {\n source: ['workers', 'python', 'generated-python-harness-snippets.js'],\n target: ['generated-python-harness-snippets.js'],\n },\n {\n source: ['workers', 'python', 'runtime-core.js'],\n target: ['pyodide', 'runtime-core.js'],\n },\n {\n source: ['workers', 'javascript', 'javascript-worker.js'],\n target: ['javascript-worker.js'],\n },\n {\n source: ['workers', 'java', 'java-worker.js'],\n target: ['java-worker.js'],\n },\n {\n source: ['workers', 'vendor', 'typescript.js'],\n target: ['vendor', 'typescript.js'],\n },\n {\n source: ['workers', 'vendor', 'java-browser-spike-helper.jar'],\n target: ['vendor', 'java-browser-spike-helper.jar'],\n },\n {\n source: ['workers', 'vendor', 'java-practice-rewriter.jar'],\n target: ['vendor', 'java-practice-rewriter.jar'],\n },\n {\n source: ['workers', 'vendor', 'java-rewrite-bridge.jar'],\n target: ['vendor', 'java-rewrite-bridge.jar'],\n },\n {\n source: ['workers', 'vendor', 'javaparser-core-3.25.10.jar'],\n target: ['vendor', 'javaparser-core-3.25.10.jar'],\n },\n {\n source: ['workers', 'vendor', 'jdk.compiler-17.jar'],\n target: ['vendor', 'jdk.compiler-17.jar'],\n },\n] as const;\n\nfunction usage(): string {\n return [\n 'Usage:',\n ' tracecode-harness sync-assets <target-dir>',\n '',\n 'Example:',\n ' tracecode-harness sync-assets public/workers',\n ].join('\\n');\n}\n\nasync function ensureParentDir(pathname: string): Promise<void> {\n await mkdir(dirname(pathname), { recursive: true });\n}\n\nfunction getPackageRoot(): string {\n const cliEntrypoint = process.argv[1];\n if (!cliEntrypoint) {\n throw new Error('Unable to resolve tracecode-harness CLI entrypoint');\n }\n\n return resolve(dirname(cliEntrypoint), '..');\n}\n\nasync function syncAssets(targetDir: string): Promise<void> {\n const packageRoot = getPackageRoot();\n const resolvedTargetDir = resolve(process.cwd(), targetDir);\n\n for (const asset of ASSET_COPY_PLAN) {\n const sourcePath = join(packageRoot, ...asset.source);\n const targetPath = join(resolvedTargetDir, ...asset.target);\n await ensureParentDir(targetPath);\n await copyFile(sourcePath, targetPath);\n }\n\n console.log(`Synced harness assets to ${resolvedTargetDir}`);\n}\n\nasync function main(): Promise<void> {\n const [command, targetDir] = process.argv.slice(2);\n\n if (command !== 'sync-assets' || !targetDir) {\n console.error(usage());\n process.exit(1);\n }\n\n await syncAssets(targetDir);\n}\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n});\n"],"mappings":";;;AAEA,sBAAgC;AAChC,uBAAuC;AAEvC,IAAM,kBAAkB;AAAA,EACtB;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,mBAAmB;AAAA,IACjD,QAAQ,CAAC,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,sCAAsC;AAAA,IACpE,QAAQ,CAAC,sCAAsC;AAAA,EACjD;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,iBAAiB;AAAA,IAC/C,QAAQ,CAAC,WAAW,iBAAiB;AAAA,EACvC;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,cAAc,sBAAsB;AAAA,IACxD,QAAQ,CAAC,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,QAAQ,gBAAgB;AAAA,IAC5C,QAAQ,CAAC,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,eAAe;AAAA,IAC7C,QAAQ,CAAC,UAAU,eAAe;AAAA,EACpC;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,+BAA+B;AAAA,IAC7D,QAAQ,CAAC,UAAU,+BAA+B;AAAA,EACpD;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,4BAA4B;AAAA,IAC1D,QAAQ,CAAC,UAAU,4BAA4B;AAAA,EACjD;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,yBAAyB;AAAA,IACvD,QAAQ,CAAC,UAAU,yBAAyB;AAAA,EAC9C;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,6BAA6B;AAAA,IAC3D,QAAQ,CAAC,UAAU,6BAA6B;AAAA,EAClD;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,qBAAqB;AAAA,IACnD,QAAQ,CAAC,UAAU,qBAAqB;AAAA,EAC1C;AACF;AAEA,SAAS,QAAgB;AACvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAe,gBAAgB,UAAiC;AAC9D,YAAM,2BAAM,0BAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD;AAEA,SAAS,iBAAyB;AAChC,QAAM,gBAAgB,QAAQ,KAAK,CAAC;AACpC,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,aAAO,8BAAQ,0BAAQ,aAAa,GAAG,IAAI;AAC7C;AAEA,eAAe,WAAW,WAAkC;AAC1D,QAAM,cAAc,eAAe;AACnC,QAAM,wBAAoB,0BAAQ,QAAQ,IAAI,GAAG,SAAS;AAE1D,aAAW,SAAS,iBAAiB;AACnC,UAAM,iBAAa,uBAAK,aAAa,GAAG,MAAM,MAAM;AACpD,UAAM,iBAAa,uBAAK,mBAAmB,GAAG,MAAM,MAAM;AAC1D,UAAM,gBAAgB,UAAU;AAChC,cAAM,0BAAS,YAAY,UAAU;AAAA,EACvC;AAEA,UAAQ,IAAI,4BAA4B,iBAAiB,EAAE;AAC7D;AAEA,eAAe,OAAsB;AACnC,QAAM,CAAC,SAAS,SAAS,IAAI,QAAQ,KAAK,MAAM,CAAC;AAEjD,MAAI,YAAY,iBAAiB,CAAC,WAAW;AAC3C,YAAQ,MAAM,MAAM,CAAC;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,SAAS;AAC5B;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { copyFile, mkdir } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\n\nconst ASSET_COPY_PLAN = [\n {\n source: ['workers', 'python', 'pyodide-worker.js'],\n target: ['pyodide-worker.js'],\n },\n {\n source: ['workers', 'python', 'generated-python-harness-snippets.js'],\n target: ['generated-python-harness-snippets.js'],\n },\n {\n source: ['workers', 'python', 'runtime-core.js'],\n target: ['pyodide', 'runtime-core.js'],\n },\n {\n source: ['workers', 'javascript', 'javascript-worker.js'],\n target: ['javascript-worker.js'],\n },\n {\n source: ['workers', 'java', 'java-worker.js'],\n target: ['java-worker.js'],\n },\n {\n source: ['workers', 'java', 'java-source-augmentations.cjs'],\n target: ['java-source-augmentations.cjs'],\n },\n {\n source: ['workers', 'vendor', 'typescript.js'],\n target: ['vendor', 'typescript.js'],\n },\n {\n source: ['workers', 'vendor', 'java-browser-spike-helper.jar'],\n target: ['vendor', 'java-browser-spike-helper.jar'],\n },\n {\n source: ['workers', 'vendor', 'java-practice-rewriter.jar'],\n target: ['vendor', 'java-practice-rewriter.jar'],\n },\n {\n source: ['workers', 'vendor', 'java-rewrite-bridge.jar'],\n target: ['vendor', 'java-rewrite-bridge.jar'],\n },\n {\n source: ['workers', 'vendor', 'javaparser-core-3.25.10.jar'],\n target: ['vendor', 'javaparser-core-3.25.10.jar'],\n },\n {\n source: ['workers', 'vendor', 'jdk.compiler-17.jar'],\n target: ['vendor', 'jdk.compiler-17.jar'],\n },\n] as const;\n\nfunction usage(): string {\n return [\n 'Usage:',\n ' tracecode-harness sync-assets <target-dir>',\n '',\n 'Example:',\n ' tracecode-harness sync-assets public/workers',\n ].join('\\n');\n}\n\nasync function ensureParentDir(pathname: string): Promise<void> {\n await mkdir(dirname(pathname), { recursive: true });\n}\n\nfunction getPackageRoot(): string {\n const cliEntrypoint = process.argv[1];\n if (!cliEntrypoint) {\n throw new Error('Unable to resolve tracecode-harness CLI entrypoint');\n }\n\n return resolve(dirname(cliEntrypoint), '..');\n}\n\nasync function syncAssets(targetDir: string): Promise<void> {\n const packageRoot = getPackageRoot();\n const resolvedTargetDir = resolve(process.cwd(), targetDir);\n\n for (const asset of ASSET_COPY_PLAN) {\n const sourcePath = join(packageRoot, ...asset.source);\n const targetPath = join(resolvedTargetDir, ...asset.target);\n await ensureParentDir(targetPath);\n await copyFile(sourcePath, targetPath);\n }\n\n console.log(`Synced harness assets to ${resolvedTargetDir}`);\n}\n\nasync function main(): Promise<void> {\n const [command, targetDir] = process.argv.slice(2);\n\n if (command !== 'sync-assets' || !targetDir) {\n console.error(usage());\n process.exit(1);\n }\n\n await syncAssets(targetDir);\n}\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
package/dist/cli.js CHANGED
@@ -24,6 +24,10 @@ var ASSET_COPY_PLAN = [
24
24
  source: ["workers", "java", "java-worker.js"],
25
25
  target: ["java-worker.js"]
26
26
  },
27
+ {
28
+ source: ["workers", "java", "java-source-augmentations.cjs"],
29
+ target: ["java-source-augmentations.cjs"]
30
+ },
27
31
  {
28
32
  source: ["workers", "vendor", "typescript.js"],
29
33
  target: ["vendor", "typescript.js"]
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { copyFile, mkdir } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\n\nconst ASSET_COPY_PLAN = [\n {\n source: ['workers', 'python', 'pyodide-worker.js'],\n target: ['pyodide-worker.js'],\n },\n {\n source: ['workers', 'python', 'generated-python-harness-snippets.js'],\n target: ['generated-python-harness-snippets.js'],\n },\n {\n source: ['workers', 'python', 'runtime-core.js'],\n target: ['pyodide', 'runtime-core.js'],\n },\n {\n source: ['workers', 'javascript', 'javascript-worker.js'],\n target: ['javascript-worker.js'],\n },\n {\n source: ['workers', 'java', 'java-worker.js'],\n target: ['java-worker.js'],\n },\n {\n source: ['workers', 'vendor', 'typescript.js'],\n target: ['vendor', 'typescript.js'],\n },\n {\n source: ['workers', 'vendor', 'java-browser-spike-helper.jar'],\n target: ['vendor', 'java-browser-spike-helper.jar'],\n },\n {\n source: ['workers', 'vendor', 'java-practice-rewriter.jar'],\n target: ['vendor', 'java-practice-rewriter.jar'],\n },\n {\n source: ['workers', 'vendor', 'java-rewrite-bridge.jar'],\n target: ['vendor', 'java-rewrite-bridge.jar'],\n },\n {\n source: ['workers', 'vendor', 'javaparser-core-3.25.10.jar'],\n target: ['vendor', 'javaparser-core-3.25.10.jar'],\n },\n {\n source: ['workers', 'vendor', 'jdk.compiler-17.jar'],\n target: ['vendor', 'jdk.compiler-17.jar'],\n },\n] as const;\n\nfunction usage(): string {\n return [\n 'Usage:',\n ' tracecode-harness sync-assets <target-dir>',\n '',\n 'Example:',\n ' tracecode-harness sync-assets public/workers',\n ].join('\\n');\n}\n\nasync function ensureParentDir(pathname: string): Promise<void> {\n await mkdir(dirname(pathname), { recursive: true });\n}\n\nfunction getPackageRoot(): string {\n const cliEntrypoint = process.argv[1];\n if (!cliEntrypoint) {\n throw new Error('Unable to resolve tracecode-harness CLI entrypoint');\n }\n\n return resolve(dirname(cliEntrypoint), '..');\n}\n\nasync function syncAssets(targetDir: string): Promise<void> {\n const packageRoot = getPackageRoot();\n const resolvedTargetDir = resolve(process.cwd(), targetDir);\n\n for (const asset of ASSET_COPY_PLAN) {\n const sourcePath = join(packageRoot, ...asset.source);\n const targetPath = join(resolvedTargetDir, ...asset.target);\n await ensureParentDir(targetPath);\n await copyFile(sourcePath, targetPath);\n }\n\n console.log(`Synced harness assets to ${resolvedTargetDir}`);\n}\n\nasync function main(): Promise<void> {\n const [command, targetDir] = process.argv.slice(2);\n\n if (command !== 'sync-assets' || !targetDir) {\n console.error(usage());\n process.exit(1);\n }\n\n await syncAssets(targetDir);\n}\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n});\n"],"mappings":";;;AAEA,SAAS,UAAU,aAAa;AAChC,SAAS,SAAS,MAAM,eAAe;AAEvC,IAAM,kBAAkB;AAAA,EACtB;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,mBAAmB;AAAA,IACjD,QAAQ,CAAC,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,sCAAsC;AAAA,IACpE,QAAQ,CAAC,sCAAsC;AAAA,EACjD;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,iBAAiB;AAAA,IAC/C,QAAQ,CAAC,WAAW,iBAAiB;AAAA,EACvC;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,cAAc,sBAAsB;AAAA,IACxD,QAAQ,CAAC,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,QAAQ,gBAAgB;AAAA,IAC5C,QAAQ,CAAC,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,eAAe;AAAA,IAC7C,QAAQ,CAAC,UAAU,eAAe;AAAA,EACpC;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,+BAA+B;AAAA,IAC7D,QAAQ,CAAC,UAAU,+BAA+B;AAAA,EACpD;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,4BAA4B;AAAA,IAC1D,QAAQ,CAAC,UAAU,4BAA4B;AAAA,EACjD;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,yBAAyB;AAAA,IACvD,QAAQ,CAAC,UAAU,yBAAyB;AAAA,EAC9C;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,6BAA6B;AAAA,IAC3D,QAAQ,CAAC,UAAU,6BAA6B;AAAA,EAClD;AAAA,EACA;AAAA,IACE,QAAQ,CAAC,WAAW,UAAU,qBAAqB;AAAA,IACnD,QAAQ,CAAC,UAAU,qBAAqB;AAAA,EAC1C;AACF;AAEA,SAAS,QAAgB;AACvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAe,gBAAgB,UAAiC;AAC9D,QAAM,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD;AAEA,SAAS,iBAAyB;AAChC,QAAM,gBAAgB,QAAQ,KAAK,CAAC;AACpC,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,SAAO,QAAQ,QAAQ,aAAa,GAAG,IAAI;AAC7C;AAEA,eAAe,WAAW,WAAkC;AAC1D,QAAM,cAAc,eAAe;AACnC,QAAM,oBAAoB,QAAQ,QAAQ,IAAI,GAAG,SAAS;AAE1D,aAAW,SAAS,iBAAiB;AACnC,UAAM,aAAa,KAAK,aAAa,GAAG,MAAM,MAAM;AACpD,UAAM,aAAa,KAAK,mBAAmB,GAAG,MAAM,MAAM;AAC1D,UAAM,gBAAgB,UAAU;AAChC,UAAM,SAAS,YAAY,UAAU;AAAA,EACvC;AAEA,UAAQ,IAAI,4BAA4B,iBAAiB,EAAE;AAC7D;AAEA,eAAe,OAAsB;AACnC,QAAM,CAAC,SAAS,SAAS,IAAI,QAAQ,KAAK,MAAM,CAAC;AAEjD,MAAI,YAAY,iBAAiB,CAAC,WAAW;AAC3C,YAAQ,MAAM,MAAM,CAAC;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,SAAS;AAC5B;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { copyFile, mkdir } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\n\nconst ASSET_COPY_PLAN = [\n {\n source: ['workers', 'python', 'pyodide-worker.js'],\n target: ['pyodide-worker.js'],\n },\n {\n source: ['workers', 'python', 'generated-python-harness-snippets.js'],\n target: ['generated-python-harness-snippets.js'],\n },\n {\n source: ['workers', 'python', 'runtime-core.js'],\n target: ['pyodide', 'runtime-core.js'],\n },\n {\n source: ['workers', 'javascript', 'javascript-worker.js'],\n target: ['javascript-worker.js'],\n },\n {\n source: ['workers', 'java', 'java-worker.js'],\n target: ['java-worker.js'],\n },\n {\n source: ['workers', 'java', 'java-source-augmentations.cjs'],\n target: ['java-source-augmentations.cjs'],\n },\n {\n source: ['workers', 'vendor', 'typescript.js'],\n target: ['vendor', 'typescript.js'],\n },\n {\n source: ['workers', 'vendor', 'java-browser-spike-helper.jar'],\n target: ['vendor', 'java-browser-spike-helper.jar'],\n },\n {\n source: ['workers', 'vendor', 'java-practice-rewriter.jar'],\n target: ['vendor', 'java-practice-rewriter.jar'],\n },\n {\n source: ['workers', 'vendor', 'java-rewrite-bridge.jar'],\n target: ['vendor', 'java-rewrite-bridge.jar'],\n },\n {\n source: ['workers', 'vendor', 'javaparser-core-3.25.10.jar'],\n target: ['vendor', 'javaparser-core-3.25.10.jar'],\n },\n {\n source: ['workers', 'vendor', 'jdk.compiler-17.jar'],\n target: ['vendor', 'jdk.compiler-17.jar'],\n },\n] as const;\n\nfunction usage(): string {\n return [\n 'Usage:',\n ' tracecode-harness sync-assets <target-dir>',\n '',\n 'Example:',\n ' tracecode-harness sync-assets public/workers',\n ].join('\\n');\n}\n\nasync function ensureParentDir(pathname: string): Promise<void> {\n await mkdir(dirname(pathname), { recursive: true });\n}\n\nfunction getPackageRoot(): string {\n const cliEntrypoint = process.argv[1];\n if (!cliEntrypoint) {\n throw new Error('Unable to resolve tracecode-harness CLI entrypoint');\n }\n\n return resolve(dirname(cliEntrypoint), '..');\n}\n\nasync function syncAssets(targetDir: string): Promise<void> {\n const packageRoot = getPackageRoot();\n const resolvedTargetDir = resolve(process.cwd(), targetDir);\n\n for (const asset of ASSET_COPY_PLAN) {\n const sourcePath = join(packageRoot, ...asset.source);\n const targetPath = join(resolvedTargetDir, ...asset.target);\n await ensureParentDir(targetPath);\n await copyFile(sourcePath, targetPath);\n }\n\n console.log(`Synced harness assets to ${resolvedTargetDir}`);\n}\n\nasync function main(): Promise<void> {\n const [command, targetDir] = process.argv.slice(2);\n\n if (command !== 'sync-assets' || !targetDir) {\n console.error(usage());\n process.exit(1);\n }\n\n await syncAssets(targetDir);\n}\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
package/dist/core.cjs CHANGED
@@ -28,6 +28,7 @@ __export(src_exports, {
28
28
  adaptTraceExecutionResult: () => adaptTraceExecutionResult,
29
29
  buildJavaExecutionResult: () => buildJavaExecutionResult,
30
30
  buildJavaSpikeExecutionResult: () => buildJavaExecutionResult,
31
+ normalizeJavaSerializedResult: () => normalizeJavaSerializedResult,
31
32
  normalizeJavaSpikeTraceContract: () => normalizeJavaTraceContract,
32
33
  normalizeJavaTraceContract: () => normalizeJavaTraceContract,
33
34
  normalizeRuntimeTraceContract: () => normalizeRuntimeTraceContract,
@@ -396,6 +397,16 @@ function parseScalar(raw) {
396
397
  }
397
398
  return raw;
398
399
  }
400
+ function normalizeJavaSerializedResult(output) {
401
+ if (typeof output !== "string") {
402
+ return output;
403
+ }
404
+ try {
405
+ return JSON.parse(output);
406
+ } catch {
407
+ return output;
408
+ }
409
+ }
399
410
  function parseKeyValuePairs(fragment) {
400
411
  const variables = {};
401
412
  const matches = Array.from(fragment.matchAll(/\b([A-Za-z_][A-Za-z0-9_.]*)=/g));
@@ -576,10 +587,29 @@ function parseAccessEvent(payload) {
576
587
  pathDepth: 1
577
588
  }];
578
589
  }
590
+ const indexedMutatingCall = payload.match(/^mutate-indexed ([A-Za-z_][A-Za-z0-9_]*)\[(\d+)\] method=([A-Za-z_][A-Za-z0-9_]*)$/);
591
+ if (indexedMutatingCall) {
592
+ return [{
593
+ variable: indexedMutatingCall[1],
594
+ kind: "mutating-call",
595
+ indices: [Number.parseInt(indexedMutatingCall[2], 10)],
596
+ method: indexedMutatingCall[3],
597
+ pathDepth: 1
598
+ }];
599
+ }
600
+ const keyedCall = payload.match(/^keyed-call ([A-Za-z_][A-Za-z0-9_]*) method=([A-Za-z_][A-Za-z0-9_]*)(?:\s+.*)?$/);
601
+ if (keyedCall) {
602
+ return [{
603
+ variable: keyedCall[1],
604
+ kind: "mutating-call",
605
+ method: keyedCall[2],
606
+ pathDepth: 1
607
+ }];
608
+ }
579
609
  return void 0;
580
610
  }
581
611
  function parseStructureState(payload) {
582
- const match = payload.match(/^state (linked-list|tree) ([A-Za-z_][A-Za-z0-9_]*)=(.+)$/);
612
+ const match = payload.match(/^state (linked-list|tree|graph-adjacency) ([A-Za-z_][A-Za-z0-9_]*)=(.+)$/);
583
613
  if (!match) return null;
584
614
  return {
585
615
  structure: match[1],
@@ -595,6 +625,22 @@ function parseObjectState(payload) {
595
625
  visualization: JSON.parse(match[2])
596
626
  };
597
627
  }
628
+ function parseMapState(payload) {
629
+ const match = payload.match(/^map-state ([A-Za-z_][A-Za-z0-9_]*)=(.+)$/);
630
+ if (!match) return null;
631
+ return {
632
+ variable: match[1],
633
+ visualization: JSON.parse(match[2])
634
+ };
635
+ }
636
+ function parseSetState(payload) {
637
+ const match = payload.match(/^set-state ([A-Za-z_][A-Za-z0-9_]*)=(.+)$/);
638
+ if (!match) return null;
639
+ return {
640
+ variable: match[1],
641
+ visualization: JSON.parse(match[2])
642
+ };
643
+ }
598
644
  function parseObjectFieldEvent(payload) {
599
645
  const match = payload.match(/^(access|write) ([A-Za-z_][A-Za-z0-9_]*)\.([A-Za-z_][A-Za-z0-9_]*)=(.+)$/);
600
646
  if (!match) return null;
@@ -604,6 +650,9 @@ function parseObjectFieldEvent(payload) {
604
650
  value: parseScalar(match[4])
605
651
  };
606
652
  }
653
+ function isArrayLengthAccessEvent(payload) {
654
+ return /^access [A-Za-z_][A-Za-z0-9_]*\.length=\d+$/.test(payload);
655
+ }
607
656
  function buildFieldVisualization(event) {
608
657
  return {
609
658
  objectKinds: {
@@ -683,12 +732,13 @@ function filterStructuredVariables(variables) {
683
732
  }
684
733
  return Object.fromEntries(entries);
685
734
  }
686
- function appendJavaTraceStep(trace, step, pendingAccesses) {
735
+ function appendJavaTraceStep(trace, step, pendingAccesses, options = {}) {
687
736
  const nextStep = pendingAccesses.length > 0 ? { ...step, accesses: [...pendingAccesses] } : step;
688
737
  pendingAccesses.length = 0;
689
- if (!maybeMergeConsecutiveLineStep(trace, nextStep)) {
690
- trace.push(nextStep);
738
+ if (options.allowMerge !== false && maybeMergeConsecutiveLineStep(trace, nextStep)) {
739
+ return;
691
740
  }
741
+ trace.push(nextStep);
692
742
  }
693
743
  function mergeIntoPreviousMatchingLineStep(trace, line, currentFunction, currentCallStack, patch) {
694
744
  const candidate = trace.at(-1);
@@ -722,11 +772,14 @@ function eventsToRawTrace(events, sourceText) {
722
772
  const stack = [];
723
773
  const pendingAccesses = [];
724
774
  let currentFunction = "<module>";
775
+ let previousRawLine = null;
725
776
  const lineRemap = buildLineRemap(sourceText);
726
777
  const declarationLines = buildMethodDeclarationLineSet(sourceText);
727
778
  for (const rawEvent of events) {
728
779
  if (rawEvent === "clear" || rawEvent === "reset") continue;
729
780
  const metadata = extractLineMetadata(rawEvent);
781
+ const previousEventRawLine = previousRawLine;
782
+ previousRawLine = metadata.line;
730
783
  const line = lineRemap?.get(metadata.line) ?? metadata.line;
731
784
  const payload = metadata.payload;
732
785
  const isDeclarationLine = declarationLines?.has(line) === true;
@@ -734,28 +787,31 @@ function eventsToRawTrace(events, sourceText) {
734
787
  const match = payload.match(/^call\s+(\S+)(?:\s+(.*))?$/);
735
788
  const functionName = match?.[1] ?? currentFunction;
736
789
  const argsFragment = match?.[2] ?? "";
737
- Object.assign(variables, parseKeyValuePairs(argsFragment));
790
+ const args = parseKeyValuePairs(argsFragment);
791
+ Object.assign(variables, args);
738
792
  currentFunction = functionName || currentFunction;
739
- stack.push({ function: currentFunction, line });
793
+ stack.push({ function: currentFunction, line, args });
740
794
  appendJavaTraceStep(trace, {
741
795
  line,
742
796
  event: "call",
743
797
  function: currentFunction,
744
798
  variables: { ...variables },
745
- callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} }))
799
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } }))
746
800
  }, pendingAccesses);
747
801
  continue;
748
802
  }
749
803
  if (payload.startsWith("return ")) {
750
- const match = payload.match(/^return\s+(\S+)$/);
804
+ const match = payload.match(/^return\s+(\S+)(?:\s+value=(.*))?$/);
751
805
  const functionName = match?.[1] ?? currentFunction;
806
+ const returnValue = match?.[2] !== void 0 ? parseScalar(match[2].trim()) : void 0;
752
807
  const returnVariables = functionName === "<module>" ? { ...variables } : filterStructuredVariables(variables) ?? {};
753
808
  appendJavaTraceStep(trace, {
754
809
  line,
755
810
  event: "return",
756
811
  function: functionName || currentFunction,
757
812
  variables: returnVariables,
758
- callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} }))
813
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
814
+ ...returnValue !== void 0 ? { returnValue } : {}
759
815
  }, pendingAccesses);
760
816
  stack.pop();
761
817
  currentFunction = stack[stack.length - 1]?.function ?? "<module>";
@@ -770,8 +826,8 @@ function eventsToRawTrace(events, sourceText) {
770
826
  event: "line",
771
827
  function: currentFunction,
772
828
  variables: { ...variables },
773
- ...stack.length > 0 ? { callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })) } : {}
774
- }, pendingAccesses);
829
+ ...stack.length > 0 ? { callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })) } : {}
830
+ }, pendingAccesses, { allowMerge: previousEventRawLine !== metadata.line });
775
831
  continue;
776
832
  }
777
833
  const structureState = parseStructureState(payload);
@@ -783,7 +839,7 @@ function eventsToRawTrace(events, sourceText) {
783
839
  event: "line",
784
840
  function: currentFunction,
785
841
  variables: { ...variables },
786
- callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })),
842
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
787
843
  visualization: {
788
844
  objectKinds: { ...objectKinds }
789
845
  }
@@ -798,7 +854,7 @@ function eventsToRawTrace(events, sourceText) {
798
854
  event: "line",
799
855
  function: currentFunction,
800
856
  variables: { ...variables },
801
- callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })),
857
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
802
858
  visualization: {
803
859
  objectKinds: { [objectState.variable]: "object" },
804
860
  hashMaps: [objectState.visualization]
@@ -806,10 +862,56 @@ function eventsToRawTrace(events, sourceText) {
806
862
  }, pendingAccesses);
807
863
  continue;
808
864
  }
865
+ const mapState = parseMapState(payload);
866
+ if (mapState) {
867
+ const entries = mapState.visualization.entries.map((entry) => [entry.key, entry.value]);
868
+ variables[mapState.variable] = { __type__: "map", entries };
869
+ appendJavaTraceStep(trace, {
870
+ line,
871
+ event: "line",
872
+ function: currentFunction,
873
+ variables: { ...variables },
874
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
875
+ visualization: {
876
+ objectKinds: { [mapState.variable]: "map" },
877
+ hashMaps: [mapState.visualization]
878
+ }
879
+ }, pendingAccesses);
880
+ continue;
881
+ }
882
+ const setState = parseSetState(payload);
883
+ if (setState) {
884
+ const values = setState.visualization.entries.map((entry) => entry.key);
885
+ variables[setState.variable] = { __type__: "set", values };
886
+ appendJavaTraceStep(trace, {
887
+ line,
888
+ event: "line",
889
+ function: currentFunction,
890
+ variables: { ...variables },
891
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
892
+ visualization: {
893
+ objectKinds: { [setState.variable]: "set" },
894
+ hashMaps: [setState.visualization]
895
+ }
896
+ }, pendingAccesses);
897
+ continue;
898
+ }
899
+ if (isArrayLengthAccessEvent(payload)) {
900
+ continue;
901
+ }
902
+ const accesses = parseAccessEvent(payload);
903
+ if (accesses) {
904
+ const currentCallStack = stack.length > 0 ? stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })) : void 0;
905
+ if (mergeAccessesIntoPreviousMatchingLineStep(trace, line, currentFunction, currentCallStack, accesses)) {
906
+ continue;
907
+ }
908
+ pendingAccesses.push(...accesses);
909
+ continue;
910
+ }
809
911
  const objectField = parseObjectFieldEvent(payload);
810
912
  if (objectField) {
811
913
  variables[objectField.variable] = { __ref__: `${objectField.variable}-object` };
812
- const currentCallStack = stack.length > 0 ? stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })) : void 0;
914
+ const currentCallStack = stack.length > 0 ? stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })) : void 0;
813
915
  if (mergeIntoPreviousMatchingLineStep(trace, line, currentFunction, currentCallStack, {
814
916
  variables: { ...variables },
815
917
  accesses: void 0,
@@ -822,27 +924,18 @@ function eventsToRawTrace(events, sourceText) {
822
924
  event: "line",
823
925
  function: currentFunction,
824
926
  variables: { ...variables },
825
- callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })),
927
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
826
928
  visualization: buildFieldVisualization(objectField)
827
929
  }, pendingAccesses);
828
930
  continue;
829
931
  }
830
932
  Object.assign(variables, parseKeyValuePairs(payload));
831
- const accesses = parseAccessEvent(payload);
832
- if (accesses) {
833
- const currentCallStack = stack.length > 0 ? stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })) : void 0;
834
- if (mergeAccessesIntoPreviousMatchingLineStep(trace, line, currentFunction, currentCallStack, accesses)) {
835
- continue;
836
- }
837
- pendingAccesses.push(...accesses);
838
- continue;
839
- }
840
933
  appendJavaTraceStep(trace, {
841
934
  line,
842
935
  event: "line",
843
936
  function: currentFunction,
844
937
  variables: { ...variables },
845
- ...stack.length > 0 ? { callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })) } : {}
938
+ ...stack.length > 0 ? { callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })) } : {}
846
939
  }, pendingAccesses);
847
940
  }
848
941
  if (pendingAccesses.length > 0 && trace.length > 0) {
@@ -851,11 +944,11 @@ function eventsToRawTrace(events, sourceText) {
851
944
  }
852
945
  return trace;
853
946
  }
854
- function buildJavaExecutionResult(output, events, executionTimeMs = 0, traceLimitExceeded, timeoutReason, maxTraceSteps, sourceText) {
947
+ function buildJavaExecutionResult(output, events, executionTimeMs = 0, traceLimitExceeded, timeoutReason, maxTraceSteps, sourceText, options = {}) {
855
948
  const trace = eventsToRawTrace(events, sourceText);
856
949
  return {
857
950
  success: true,
858
- output,
951
+ output: options.outputIsSerialized === false ? output : normalizeJavaSerializedResult(output),
859
952
  trace,
860
953
  executionTimeMs,
861
954
  consoleOutput: [],
@@ -897,6 +990,7 @@ function adaptJavaTraceExecutionResult(result) {
897
990
  adaptTraceExecutionResult,
898
991
  buildJavaExecutionResult,
899
992
  buildJavaSpikeExecutionResult,
993
+ normalizeJavaSerializedResult,
900
994
  normalizeJavaSpikeTraceContract,
901
995
  normalizeJavaTraceContract,
902
996
  normalizeRuntimeTraceContract,