create-defuss
Version:
Checks out git projects from sub-directories. Originally for jump-starting defuss projects from templates.
1 lines โข 11.8 kB
Source Map (JSON)
{"version":3,"file":"e2e.mjs","sources":["../src/e2e.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * E2E test for create-defuss package.\n * Checks out the create package itself from GitHub to verify all features work.\n */\n\nimport { performSparseCheckout } from \"./git.js\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { existsSync, rmSync, readFileSync, readdirSync } from \"node:fs\";\n\nconst TEST_URL = \"https://github.com/kyr0/defuss/tree/main/packages/create\";\n\nasync function runE2ETest(): Promise<void> {\n const testDir = join(tmpdir(), `create-defuss-e2e-${Date.now()}`);\n\n console.log(\"๐งช E2E Test for create-defuss\");\n console.log(\"=\".repeat(50));\n console.log(`Test URL: ${TEST_URL}`);\n console.log(`Test Directory: ${testDir}`);\n console.log(\"=\".repeat(50));\n\n let passed = true;\n const results: { test: string; passed: boolean; message?: string }[] = [];\n\n try {\n // Test 1: Run sparse checkout\n console.log(\"\\n๐ฅ Running sparse checkout...\\n\");\n performSparseCheckout(TEST_URL, testDir);\n\n // Test 2: Verify destination folder exists\n console.log(\"\\n๐ Running verification checks...\\n\");\n\n if (existsSync(testDir)) {\n results.push({ test: \"Destination folder created\", passed: true });\n } else {\n results.push({ test: \"Destination folder created\", passed: false, message: \"Folder does not exist\" });\n passed = false;\n }\n\n // Test 3: Verify package.json exists\n const packageJsonPath = join(testDir, \"package.json\");\n if (existsSync(packageJsonPath)) {\n results.push({ test: \"package.json exists\", passed: true });\n\n // Test 4: Verify package.json is valid JSON\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n results.push({ test: \"package.json is valid JSON\", passed: true });\n\n // Test 5: Verify package name\n if (packageJson.name === \"create-defuss\") {\n results.push({ test: \"Package name is correct\", passed: true });\n } else {\n results.push({ test: \"Package name is correct\", passed: false, message: `Expected 'create-defuss', got '${packageJson.name}'` });\n passed = false;\n }\n\n // Test 6: Check that no workspace:* versions remain in package.json\n const hasWorkspaceRefs = checkForWorkspaceRefs(packageJson);\n if (!hasWorkspaceRefs) {\n results.push({ test: \"No workspace:* versions in package.json\", passed: true });\n } else {\n results.push({ test: \"No workspace:* versions in package.json\", passed: false, message: \"Found workspace:* references\" });\n passed = false;\n }\n } catch (err) {\n results.push({ test: \"package.json is valid JSON\", passed: false, message: (err as Error).message });\n passed = false;\n }\n } else {\n results.push({ test: \"package.json exists\", passed: false, message: \"File not found\" });\n passed = false;\n }\n\n // Test 7: Verify src folder exists\n const srcPath = join(testDir, \"src\");\n if (existsSync(srcPath)) {\n results.push({ test: \"src folder exists\", passed: true });\n\n // Test 8: Verify key source files\n const expectedFiles = [\"cli.ts\", \"git.ts\"];\n for (const file of expectedFiles) {\n if (existsSync(join(srcPath, file))) {\n results.push({ test: `src/${file} exists`, passed: true });\n } else {\n results.push({ test: `src/${file} exists`, passed: false, message: \"File not found\" });\n passed = false;\n }\n }\n } else {\n results.push({ test: \"src folder exists\", passed: false, message: \"Folder not found\" });\n passed = false;\n }\n\n // Test 9: Verify .git folder was created (new repo initialized)\n const gitPath = join(testDir, \".git\");\n if (existsSync(gitPath)) {\n results.push({ test: \"Git repository initialized\", passed: true });\n } else {\n results.push({ test: \"Git repository initialized\", passed: false, message: \".git folder not found\" });\n passed = false;\n }\n\n // Test 10: List all files for verification\n console.log(\"\\n๐ Files in checkout:\");\n listFilesRecursively(testDir, \"\", 2);\n\n } catch (err) {\n console.error(\"\\nโ Test execution failed:\", (err as Error).message);\n passed = false;\n results.push({ test: \"Checkout execution\", passed: false, message: (err as Error).message });\n } finally {\n // Cleanup\n console.log(\"\\n๐งน Cleaning up test directory...\");\n if (existsSync(testDir)) {\n rmSync(testDir, { recursive: true, force: true });\n console.log(\"โ
Test directory removed\");\n }\n }\n\n // Report results\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(\"๐ TEST RESULTS\");\n console.log(\"=\".repeat(50));\n\n for (const result of results) {\n const icon = result.passed ? \"โ
\" : \"โ\";\n const msg = result.message ? ` (${result.message})` : \"\";\n console.log(`${icon} ${result.test}${msg}`);\n }\n\n const passedCount = results.filter(r => r.passed).length;\n const totalCount = results.length;\n\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(`๐ Summary: ${passedCount}/${totalCount} tests passed`);\n console.log(\"=\".repeat(50));\n\n if (!passed) {\n console.log(\"\\nโ E2E TEST FAILED\");\n process.exit(1);\n } else {\n console.log(\"\\nโ
E2E TEST PASSED\");\n process.exit(0);\n }\n}\n\n/**\n * Check if any dependency has workspace:* references\n */\nfunction checkForWorkspaceRefs(packageJson: Record<string, unknown>): boolean {\n const depTypes = [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"optionalDependencies\"];\n\n for (const depType of depTypes) {\n const deps = packageJson[depType] as Record<string, string> | undefined;\n if (!deps || typeof deps !== \"object\") continue;\n\n for (const version of Object.values(deps)) {\n if (typeof version === \"string\" && version.startsWith(\"workspace:\")) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * List files recursively with indentation (limited depth)\n */\nfunction listFilesRecursively(dir: string, indent: string, maxDepth: number): void {\n if (maxDepth <= 0) {\n console.log(`${indent}...`);\n return;\n }\n\n const items = readdirSync(dir);\n for (const item of items) {\n if (item === \".git\" || item === \"node_modules\") {\n console.log(`${indent}${item}/`);\n continue;\n }\n const itemPath = join(dir, item);\n try {\n const stat = require(\"fs\").lstatSync(itemPath);\n if (stat.isDirectory()) {\n console.log(`${indent}${item}/`);\n listFilesRecursively(itemPath, indent + \" \", maxDepth - 1);\n } else {\n console.log(`${indent}${item}`);\n }\n } catch {\n console.log(`${indent}${item}`);\n }\n }\n}\n\n// Run the test\nrunE2ETest();\n"],"names":["TEST_URL","runE2ETest","testDir","join","tmpdir","passed","results","performSparseCheckout","existsSync","packageJsonPath","packageJson","readFileSync","checkForWorkspaceRefs","err","srcPath","expectedFiles","file","gitPath","listFilesRecursively","rmSync","result","icon","msg","passedCount","r","totalCount","__name","depTypes","depType","deps","version","dir","indent","maxDepth","items","readdirSync","item","itemPath","require"],"mappings":"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"}