create-bench 0.1.2 → 0.1.4
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/README.md +3 -3
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# create-bench
|
|
2
2
|
|
|
3
|
-
Scaffold a new ComputeSDK benchmark project that uses [`@benchsdk/
|
|
3
|
+
Scaffold a new ComputeSDK benchmark project that uses [`@benchsdk/runner`](https://github.com/computesdk/benchmarks/tree/master/packages/benchsdk-runner).
|
|
4
4
|
|
|
5
5
|
## Usage
|
|
6
6
|
|
|
@@ -18,9 +18,9 @@ npm create bench my-benchmark
|
|
|
18
18
|
|
|
19
19
|
The CLI creates a directory with the given project name and writes:
|
|
20
20
|
|
|
21
|
-
- `package.json` — with `@benchsdk/
|
|
21
|
+
- `package.json` — with `@benchsdk/runner`, `tsx`, and benchmark scripts
|
|
22
22
|
- `tsconfig.json` — basic TypeScript configuration
|
|
23
|
-
- `bench.ts` — a minimal benchmark
|
|
23
|
+
- `bench.ts` — a minimal benchmark using `defineBenchmarkConfig` / `defineTask`
|
|
24
24
|
- `.env.example` — environment variables to configure the worker
|
|
25
25
|
- `README.md` — instructions for the new project
|
|
26
26
|
|
package/dist/index.js
CHANGED
|
@@ -23,7 +23,7 @@ function scaffold(targetDir, projectName) {
|
|
|
23
23
|
typecheck: "tsc --noEmit"
|
|
24
24
|
},
|
|
25
25
|
dependencies: {
|
|
26
|
-
"@benchsdk/runner": "^0.
|
|
26
|
+
"@benchsdk/runner": "^0.5.0"
|
|
27
27
|
},
|
|
28
28
|
devDependencies: {
|
|
29
29
|
tsx: "^4.22.4",
|
|
@@ -155,7 +155,8 @@ async function main() {
|
|
|
155
155
|
const projectName = process.argv[2];
|
|
156
156
|
await createBench(projectName);
|
|
157
157
|
}
|
|
158
|
-
|
|
158
|
+
var isMain = process.argv[1] !== void 0 && fs.existsSync(process.argv[1]) && fs.realpathSync(process.argv[1]) === fs.realpathSync(fileURLToPath(import.meta.url));
|
|
159
|
+
if (isMain) {
|
|
159
160
|
main().catch((err) => {
|
|
160
161
|
console.error(err);
|
|
161
162
|
process.exit(1);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport readline from 'node:readline/promises';\nimport { fileURLToPath } from 'node:url';\n\nfunction toValidPackageName(input: string): string {\n const name = input\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .replace(/^[^a-z]+/, '')\n .replace(/-+/g, '-')\n .replace(/^-+/, '');\n return name || 'bench';\n}\n\nfunction scaffold(targetDir: string, projectName: string): void {\n fs.mkdirSync(targetDir, { recursive: true });\n\n const packageJson = {\n name: toValidPackageName(projectName),\n version: '0.0.0',\n private: true,\n type: 'module',\n scripts: {\n // `bench run` loads the *.bench.ts module; run it under tsx so the\n // TypeScript benchmark file can be imported without a build step.\n bench: 'tsx node_modules/@benchsdk/runner/dist/bin.js run bench.ts',\n typecheck: 'tsc --noEmit',\n },\n dependencies: {\n '@benchsdk/runner': '^0.
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport readline from 'node:readline/promises';\nimport { fileURLToPath } from 'node:url';\n\nfunction toValidPackageName(input: string): string {\n const name = input\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .replace(/^[^a-z]+/, '')\n .replace(/-+/g, '-')\n .replace(/^-+/, '');\n return name || 'bench';\n}\n\nfunction scaffold(targetDir: string, projectName: string): void {\n fs.mkdirSync(targetDir, { recursive: true });\n\n const packageJson = {\n name: toValidPackageName(projectName),\n version: '0.0.0',\n private: true,\n type: 'module',\n scripts: {\n // `bench run` loads the *.bench.ts module; run it under tsx so the\n // TypeScript benchmark file can be imported without a build step.\n bench: 'tsx node_modules/@benchsdk/runner/dist/bin.js run bench.ts',\n typecheck: 'tsc --noEmit',\n },\n dependencies: {\n '@benchsdk/runner': '^0.5.0',\n },\n devDependencies: {\n tsx: '^4.22.4',\n typescript: '^5.0.0',\n },\n };\n\n fs.writeFileSync(\n path.join(targetDir, 'package.json'),\n `${JSON.stringify(packageJson, null, 2)}\\n`,\n );\n\n const tsconfigJson = {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n resolveJsonModule: true,\n noEmit: true,\n },\n include: ['**/*.ts'],\n };\n\n fs.writeFileSync(\n path.join(targetDir, 'tsconfig.json'),\n `${JSON.stringify(tsconfigJson, null, 2)}\\n`,\n );\n\n const benchTs = `import { defineBenchmarkConfig, defineTask } from '@benchsdk/runner';\n\n// A benchmark file declares two things and nothing else:\n// - config: identity + orchestration knobs + the participants to run against\n// - task: the workload for ONE iteration\n// Run it with \\`pnpm bench\\` (CLI flags like --iterations / --concurrency\n// override the config knobs). No imperative entrypoint needed.\nexport const config = defineBenchmarkConfig({\n benchmarkSlug: process.env.BENCHMARK_SLUG ?? 'example',\n benchmarkName: 'Example benchmark',\n iterations: 10,\n concurrency: 1,\n participants: [{ name: 'local', requiredEnvVars: [] }],\n display: {\n metrics: [\n { key: 'durationMs', label: 'Duration', unit: 'ms', direction: 'lower-better' },\n ],\n overview: { defaultMetric: 'compositeScore' },\n },\n scoring: {\n metrics: [\n { key: 'durationMs', ceiling: 1000, weights: { median: 0.7, p95: 0.2, p99: 0.1 } },\n ],\n },\n});\n\nexport const task = defineTask(async ({ taskIndex, step, measure, log }) => {\n log(\\`running task \\${taskIndex}\\`);\n // Declare named steps with \\`step(...)\\`; values flow between them via\n // closures and each step is recorded on the platform with its own timing.\n const start = Date.now();\n await step('work', async () => {\n // Replace with your benchmark logic.\n await new Promise((resolve) => setTimeout(resolve, 100));\n });\n // \\`measure(...)\\` attaches metrics to the current step (or the task).\n measure({ durationMs: Date.now() - start });\n});\n`;\n\n fs.writeFileSync(path.join(targetDir, 'bench.ts'), benchTs);\n\n const envExample = `# Copy to .env and fill in your values\nBENCHMARKS_PLATFORM_URL=\nBENCHMARKS_PLATFORM_API_KEY=\nBENCHMARK_SLUG=example\n`;\n\n fs.writeFileSync(path.join(targetDir, '.env.example'), envExample);\n\n const readme = `# ${projectName}\n\nThis project was scaffolded by [\\`create-bench\\`](https://github.com/computesdk/benchmarks/tree/master/packages/create-bench).\n\n## Getting started\n\n1. Install dependencies:\n\n \\`\\`\\`sh\n pnpm install\n \\`\\`\\`\n\n2. Copy \\`.env.example\\` to \\`.env\\` and fill in the required values.\n\n3. Run the benchmark worker:\n\n \\`\\`\\`sh\n pnpm bench\n \\`\\`\\`\n`;\n\n fs.writeFileSync(path.join(targetDir, 'README.md'), readme);\n}\n\nasync function askProjectName(): Promise<string | undefined> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const answer = await rl.question('Project name: ');\n return answer.trim() || undefined;\n } finally {\n rl.close();\n }\n}\n\nexport async function createBench(projectName?: string): Promise<void> {\n const resolvedName = projectName ?? (await askProjectName());\n\n if (!resolvedName) {\n throw new Error('A project name is required.');\n }\n\n const targetDir = path.isAbsolute(resolvedName)\n ? resolvedName\n : path.resolve(process.cwd(), resolvedName);\n const packageName = path.basename(targetDir);\n\n if (fs.existsSync(targetDir) && fs.readdirSync(targetDir).length > 0) {\n throw new Error(`Directory ${targetDir} is not empty.`);\n }\n\n scaffold(targetDir, packageName);\n\n console.log(`Created ${packageName} at ${targetDir}`);\n console.log('Next steps:');\n console.log(` cd ${path.relative(process.cwd(), targetDir) || packageName}`);\n console.log(' pnpm install');\n console.log(' cp .env.example .env');\n console.log(' pnpm bench');\n}\n\nasync function main(): Promise<void> {\n const projectName = process.argv[2];\n await createBench(projectName);\n}\n\n// npm links bins through a `.bin` symlink, so process.argv[1] is the symlink\n// path while import.meta.url resolves to the real file — compare realpaths.\nconst isMain =\n process.argv[1] !== undefined &&\n fs.existsSync(process.argv[1]) &&\n fs.realpathSync(process.argv[1]) === fs.realpathSync(fileURLToPath(import.meta.url));\n\nif (isMain) {\n main().catch((err) => {\n console.error(err);\n process.exit(1);\n });\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-bench",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
|
-
"description": "Scaffold a new ComputeSDK benchmark project with @benchsdk/
|
|
6
|
+
"description": "Scaffold a new ComputeSDK benchmark project with @benchsdk/runner",
|
|
7
7
|
"author": "Garrison",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"bin": {
|
|
@@ -35,11 +35,11 @@
|
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@types/node": "^20.
|
|
39
|
-
"rimraf": "^5.0.
|
|
40
|
-
"tsup": "^8.
|
|
41
|
-
"typescript": "^5.
|
|
42
|
-
"vitest": "^1.
|
|
38
|
+
"@types/node": "^20.19.43",
|
|
39
|
+
"rimraf": "^5.0.10",
|
|
40
|
+
"tsup": "^8.5.1",
|
|
41
|
+
"typescript": "^5.9.3",
|
|
42
|
+
"vitest": "^1.6.1"
|
|
43
43
|
},
|
|
44
44
|
"scripts": {
|
|
45
45
|
"build": "tsup",
|