@tracecode/harness 0.6.1 → 0.6.5
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/CHANGELOG.md +23 -0
- package/README.md +4 -3
- package/dist/browser.cjs +125 -32
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +125 -32
- package/dist/browser.js.map +1 -1
- package/dist/cli.cjs +4 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/core.cjs +121 -27
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +5 -2
- package/dist/core.d.ts +5 -2
- package/dist/core.js +120 -27
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +128 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +127 -32
- package/dist/index.js.map +1 -1
- package/dist/python.cjs +1 -0
- package/dist/python.cjs.map +1 -1
- package/dist/python.js +1 -0
- package/dist/python.js.map +1 -1
- package/package.json +6 -3
- package/workers/java/java-source-augmentations.cjs +242 -0
- package/workers/java/java-worker.js +815 -35
- package/workers/java/src/spike/user/TraceHooks.java +619 -0
- package/workers/python/runtime-core.js +78 -16
- package/workers/vendor/java-browser-spike-helper.jar +0 -0
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 (
|
|
690
|
-
|
|
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
|
-
|
|
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,
|