@nshiab/setup-data-project 3.0.0 → 3.0.2

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/main.mjs CHANGED
@@ -145,7 +145,6 @@ function ensureGitignore() {
145
145
  const separator = content === "" ? "" : content.endsWith("\n") ? "\n" : "\n\n";
146
146
  const block = `${GITIGNORE_SENTINEL}\n${GITIGNORE_ENTRIES.join("\n")}\n`;
147
147
  writeFileSync(path, content + separator + block);
148
- log.info(`${stats === void 0 ? "Created" : "Updated"} ${path}`);
149
148
  }
150
149
  //#endregion
151
150
  //#region src/helpers/ensureManagedSection.ts
@@ -267,8 +266,11 @@ function ensureVscode() {
267
266
  mkdirSync(".vscode", { recursive: true });
268
267
  const formatter = "oxc.oxc-vscode";
269
268
  const files = {
270
- "extensions.json": { recommendations: ["VoidZero.vite-plus-extension-pack"] },
271
- "settings.json": {
269
+ "extensions.json": `{
270
+ "recommendations": ["VoidZero.vite-plus-extension-pack"]
271
+ }
272
+ `,
273
+ "settings.json": `${JSON.stringify({
272
274
  "editor.defaultFormatter": formatter,
273
275
  "[javascript]": { "editor.defaultFormatter": formatter },
274
276
  "[javascriptreact]": { "editor.defaultFormatter": formatter },
@@ -280,16 +282,16 @@ function ensureVscode() {
280
282
  "editor.formatOnSaveMode": "file",
281
283
  "editor.codeActionsOnSave": { "source.fixAll.oxc": "explicit" },
282
284
  "editor.wordWrap": "on"
283
- }
285
+ }, null, 2)}\n`
284
286
  };
285
287
  for (const [name, config] of Object.entries(files)) {
286
288
  const path = `.vscode/${name}`;
287
- if (!existsSync(path)) writeFileSync(path, `${JSON.stringify(config, null, 2)}\n`);
289
+ if (!existsSync(path)) writeFileSync(path, config);
288
290
  }
289
291
  }
290
292
  //#endregion
291
293
  //#region package.json
292
- var version = "3.0.0";
294
+ var version = "3.0.2";
293
295
  //#endregion
294
296
  //#region src/helpers/getProjectTasks.ts
295
297
  function getProjectTasks(runtime = getRuntime()) {
@@ -329,19 +331,13 @@ await table.loadArray([{ message: "Hello simple-data-analysis!" }]).log();
329
331
 
330
332
  await sdb.close();
331
333
  `;
332
- if (lstatSync(mainTsPath, { throwIfNoEntry: false }) === void 0) {
333
- writeFileSync(mainTsPath, mainTsContent);
334
- log.info(`Created ${mainTsPath}`);
335
- }
334
+ if (lstatSync(mainTsPath, { throwIfNoEntry: false }) === void 0) writeFileSync(mainTsPath, mainTsContent);
336
335
  return sdaFolder;
337
336
  }
338
337
  //#endregion
339
338
  //#region src/helpers/ensureEnvFile.ts
340
339
  function ensureEnvFile() {
341
- if (lstatSync(".env", { throwIfNoEntry: false }) === void 0) {
342
- writeFileSync(".env", "");
343
- log.info("Created .env");
344
- }
340
+ if (lstatSync(".env", { throwIfNoEntry: false }) === void 0) writeFileSync(".env", "");
345
341
  }
346
342
  //#endregion
347
343
  //#region src/helpers/ensureAgents.ts
@@ -811,32 +807,47 @@ async function main() {
811
807
  sInstall.stop("Package installation failed.");
812
808
  throw error;
813
809
  }
814
- sInstall.stop("✅ Package installation complete.");
810
+ sInstall.stop("Packages installed.");
815
811
  projectManifest.reload();
816
- projectManifest.updateTasks(getProjectTasks());
817
- execFileSync(process$1.execPath, [
818
- "node_modules/vite-plus/bin/vp",
819
- "fmt",
820
- "package.json"
821
- ], { stdio: "pipe" });
822
812
  const finalInstalledPackages = getInstalledPackageConfigs(projectManifest.getInstalledPackages()).map((pkg) => pkg.value);
823
813
  const docsMapping = await refreshDocs(projectManifest);
824
- createFolderStructure(finalInstalledPackages);
825
- ensureGitignore();
826
- ensureEnvFile();
827
- ensureVscode();
828
- ensureReadme(runtime, finalInstalledPackages);
829
- ensureAgents(docsMapping, runtime, finalInstalledPackages);
814
+ const sConfig = spinner();
815
+ sConfig.start("Preparing project files and configuration...");
816
+ try {
817
+ projectManifest.updateTasks(getProjectTasks());
818
+ execFileSync(process$1.execPath, [
819
+ "node_modules/vite-plus/bin/vp",
820
+ "fmt",
821
+ "package.json"
822
+ ], { stdio: "pipe" });
823
+ createFolderStructure(finalInstalledPackages);
824
+ ensureGitignore();
825
+ ensureEnvFile();
826
+ ensureVscode();
827
+ ensureReadme(runtime, finalInstalledPackages);
828
+ ensureAgents(docsMapping, runtime, finalInstalledPackages);
829
+ } catch (error) {
830
+ sConfig.stop("Project configuration failed.");
831
+ throw error;
832
+ }
833
+ sConfig.stop("Project files and configuration ready.");
830
834
  outro(process$1.exitCode ? "Project setup complete; documentation needs attention." : "You are all set! 🙌");
831
835
  }
832
836
  async function refreshDocs(manifest) {
833
837
  const packages = getInstalledPackageConfigs(manifest.getInstalledPackages()).map((pkg) => pkg.value);
834
- const mapping = await syncPackageDocs(packages, getInstalledPackageVersions(manifest.getInstalledPackageSpecifiers()));
835
- if (Object.keys(mapping).length !== packages.length) {
836
- console.error("Documentation refresh incomplete. See the warnings above.");
837
- process$1.exitCode = 1;
838
+ const sDocs = spinner();
839
+ sDocs.start("Downloading documentation...");
840
+ try {
841
+ const mapping = await syncPackageDocs(packages, getInstalledPackageVersions(manifest.getInstalledPackageSpecifiers()));
842
+ if (Object.keys(mapping).length !== packages.length) {
843
+ sDocs.stop("Documentation incomplete. See the warnings above.");
844
+ process$1.exitCode = 1;
845
+ } else sDocs.stop(packages.length > 0 ? "Documentation downloaded." : "No library documentation to download.");
846
+ return mapping;
847
+ } catch (error) {
848
+ sDocs.stop("Documentation download failed.");
849
+ throw error;
838
850
  }
839
- return mapping;
840
851
  }
841
852
  main().catch((error) => {
842
853
  const message = error instanceof Error ? error.message : String(error);
package/dist/main.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.mjs","names":["process","metadata.version","process"],"sources":["../src/helpers/getRuntime.ts","../src/helpers/packageRegistry.ts","../src/helpers/packageOptions.ts","../src/helpers/gitignoreEntries.ts","../src/helpers/ensureGitignore.ts","../src/helpers/ensureManagedSection.ts","../src/helpers/ensureReadme.ts","../src/helpers/installPackages.ts","../src/helpers/ensureTooling.ts","../src/helpers/ensureVscode.ts","../package.json","../src/helpers/getProjectTasks.ts","../src/helpers/createFolderStructure.ts","../src/helpers/ensureEnvFile.ts","../src/helpers/ensureAgents.ts","../src/helpers/jsonObject.ts","../src/helpers/projectManifest.ts","../src/helpers/fetchPackageDocs.ts","../src/helpers/combinePlotDocs.ts","../src/helpers/plotDocPages.ts","../src/helpers/fetchPlotDocs.ts","../src/helpers/syncPackageDocs.ts","../src/helpers/getInstalledPackageVersions.ts","../src/helpers/parseArguments.ts","../src/main.ts"],"sourcesContent":["import process from \"node:process\";\nexport type Runtime = \"node\" | \"bun\";\nexport function getRuntime(versions: { bun?: string; node?: string } = process.versions): Runtime {\n return versions.bun ? \"bun\" : \"node\";\n}\n","export interface PackageConfig {\n value: string;\n label: string;\n type: \"sda\" | \"journalism\" | \"other\";\n hint?: string;\n}\n\nexport const SUPPORTED_PACKAGES: PackageConfig[] = [\n {\n value: \"@nshiab/simple-data-analysis\",\n label: \"simple-data-analysis\",\n type: \"sda\",\n hint: \"All the core functionality, plus methods for dataviz, AI, Google sheets, etc.\",\n },\n {\n value: \"@nshiab/simple-data-analysis-core\",\n label: \"simple-data-analysis-core\",\n type: \"sda\",\n hint: \"No fluff. Great for constrained environments, like a cheap server.\",\n },\n {\n value: \"@nshiab/journalism-ai\",\n label: \"journalism-ai\",\n type: \"journalism\",\n hint: \"Easily use AI local models with Ollama or remote models with Gemini/Vertex.\",\n },\n {\n value: \"@nshiab/journalism-google\",\n label: \"journalism-google\",\n type: \"journalism\",\n hint: \"Push and retrieve data from Google Sheets, Google Bucket, and more.\",\n },\n {\n value: \"@nshiab/journalism-web-scraping\",\n label: \"journalism-web-scraping\",\n type: \"journalism\",\n hint: \"Retrieve data from Statistics Canada tables, HTML table, download files...\",\n },\n {\n value: \"@nshiab/journalism-finance\",\n label: \"journalism-finance\",\n type: \"journalism\",\n hint: \"Retrieve financial data, calculate Canadian mortgage payments and taxes...\",\n },\n {\n value: \"@nshiab/journalism-format\",\n label: \"journalism-format\",\n type: \"journalism\",\n hint: \"Easily format dates, numbers, currencies...\",\n },\n {\n value: \"@nshiab/journalism-climate\",\n label: \"journalism-climate\",\n type: \"journalism\",\n hint: \"Retrieve data from Environment Canada APIs and more.\",\n },\n {\n value: \"@nshiab/journalism-dataviz\",\n label: \"journalism-dataviz\",\n type: \"journalism\",\n hint: \"Render charts/maps with Observable Plot or directly in the terminal.\",\n },\n {\n value: \"@nshiab/journalism-geo\",\n label: \"journalism-geo\",\n type: \"journalism\",\n hint: \"Calculate distances, transform 2D coordinates to 3D, wrangle GeoTIFF files...\",\n },\n {\n value: \"@nshiab/journalism-statistics\",\n label: \"journalism-statistics\",\n type: \"journalism\",\n hint: \"Functions for statistical tests, clustering, random path generation...\",\n },\n {\n value: \"@nshiab/journalism-web\",\n label: \"journalism-web\",\n type: \"journalism\",\n hint: \"Web related functions, including downloading data as CSV, extracting ZIP files to URLs...\",\n },\n {\n value: \"@nshiab/journalism-extras\",\n label: \"journalism-extras\",\n type: \"journalism\",\n hint: \"Functions to zip/unzip, sleep, reencode files, create nested directories...\",\n },\n];\n\n// Plot is installed alongside charting libraries, but is not a setup menu option.\nexport const DOCUMENTED_PACKAGES: PackageConfig[] = [\n ...SUPPORTED_PACKAGES,\n { value: \"@nshiab/journalism\", label: \"journalism\", type: \"journalism\" },\n { value: \"@observablehq/plot\", label: \"Observable Plot\", type: \"other\" },\n];\n\nexport function getInstalledPackageConfigs(installedPackages: string[]): PackageConfig[] {\n const installedSet = new Set(installedPackages);\n return DOCUMENTED_PACKAGES.filter((pkg) => installedSet.has(pkg.value));\n}\n","import { SUPPORTED_PACKAGES } from \"./packageRegistry.ts\";\n\nexport const PACKAGE_OPTIONS = SUPPORTED_PACKAGES.map((pkg) => ({\n value: pkg.value,\n label: pkg.label,\n hint: pkg.hint,\n}));\n","export const GITIGNORE_ENTRIES = [\n \"node_modules\",\n \"docs/\",\n \".tmp\",\n \".sda-cache\",\n \".journalism-cache\",\n \"sda/data\",\n \"sda/output\",\n \".env\",\n \".DS_Store\",\n];\n","import { lstatSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { log } from \"@clack/prompts\";\nimport { GITIGNORE_ENTRIES } from \"./gitignoreEntries.ts\";\n\nexport const GITIGNORE_SENTINEL = \"# Added by setup-data-project. Do not remove this line.\";\n\nexport function ensureGitignore() {\n const path = \".gitignore\";\n const stats = lstatSync(path, { throwIfNoEntry: false });\n\n if (stats?.isSymbolicLink()) {\n return;\n }\n\n const content = stats === undefined ? \"\" : readFileSync(path, \"utf-8\");\n const hasSentinel = content.split(\"\\n\").some((line) => line.trim() === GITIGNORE_SENTINEL);\n\n if (hasSentinel) {\n const entries = new Set(content.split(\"\\n\").map((line) => line.trim()));\n const missing = GITIGNORE_ENTRIES.filter((entry) => !entries.has(entry));\n if (missing.length)\n writeFileSync(\n path,\n content + (content.endsWith(\"\\n\") ? \"\" : \"\\n\") + missing.join(\"\\n\") + \"\\n\",\n );\n return;\n }\n\n const separator = content === \"\" ? \"\" : content.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n const block = `${GITIGNORE_SENTINEL}\\n${GITIGNORE_ENTRIES.join(\"\\n\")}\\n`;\n writeFileSync(path, content + separator + block);\n\n log.info(`${stats === undefined ? \"Created\" : \"Updated\"} ${path}`);\n}\n","import { log } from \"@clack/prompts\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\n\ninterface ManagedSectionOptions {\n path: string;\n name: string;\n content: string;\n createContent: (section: string) => string;\n}\n\nexport function ensureManagedSection(\n options: ManagedSectionOptions,\n): \"created\" | \"updated\" | \"unchanged\" | \"missing-markers\" {\n const startMarker = `<!-- Do not remove / setup-data-project:${options.name}:start -->`;\n const endMarker = `<!-- Do not remove / setup-data-project:${options.name}:end -->`;\n const trimmedContent = options.content.trim();\n const section =\n trimmedContent === \"\"\n ? `${startMarker}\\n${endMarker}`\n : `${startMarker}\\n\\n${trimmedContent}\\n\\n${endMarker}`;\n\n if (!existsSync(options.path)) {\n writeFileSync(options.path, ensureFinalNewline(options.createContent(section)));\n return \"created\";\n }\n\n const currentContent = readFileSync(options.path, \"utf-8\");\n const start = currentContent.indexOf(startMarker);\n const end = currentContent.indexOf(endMarker);\n\n if (start === -1 || end === -1 || end < start) {\n log.warn(\n `${options.path} was not updated because its setup-data-project markers ` +\n `were not found. Add ${startMarker} and ${endMarker}, then rerun the ` +\n \"script.\",\n );\n return \"missing-markers\";\n }\n\n const nextContent =\n currentContent.slice(0, start) + section + currentContent.slice(end + endMarker.length);\n\n if (nextContent === currentContent) {\n return \"unchanged\";\n }\n\n writeFileSync(options.path, ensureFinalNewline(nextContent));\n return \"updated\";\n}\n\nfunction ensureFinalNewline(content: string): string {\n return content.endsWith(\"\\n\") ? content : content + \"\\n\";\n}\n","import { ensureManagedSection } from \"./ensureManagedSection.ts\";\nimport { getInstalledPackageConfigs } from \"./packageRegistry.ts\";\nimport type { Runtime } from \"./getRuntime.ts\";\nexport function ensureReadme(runtime: Runtime, installedPackages: string[] = []) {\n const run = runtime === \"bun\" ? \"bun run\" : \"npm run\";\n const libraries = getInstalledPackageConfigs(installedPackages)\n .map((pkg) => `\\`${pkg.value}\\``)\n .join(\", \");\n ensureManagedSection({\n path: \"README.md\",\n name: \"libraries\",\n createContent: (section) =>\n `# Data project\\n\\nCreated with [setup-data-project](https://github.com/nshiab/setup-data-project).\\n\\n${section}`,\n content: `${libraries ? `Installed libraries: ${libraries}.\\n\\n` : \"\"}Use sda/main.ts to process source data from sda/data/ and write results to sda/output/. Both data folders are ignored by Git. Put reusable helpers in sda/helpers/ and tests in sda/tests/. Import test utilities from \\`vite-plus/test\\`.\n\n- \\`${run} sda\\`: run the analysis and watch for changes.\n- \\`${run} test\\`: run tests; the default command also succeeds when no tests exist.\n- \\`${run} all-tests\\`: check types, lint, formatting, and tests.\n- \\`${run} fix\\`: apply formatting and automatic fixes.\n- \\`${run} docs\\`: refresh documentation for the installed library versions.\n- \\`${run} clean\\`: delete cached results and temporary files in .sda-cache/, .journalism-cache/, and .tmp/.\n\nIn VS Code, install the recommended Vite+ extension pack for Oxc formatting and linting and the Vitest test runner. Generated .vscode/settings.json enables formatting and lint fixes on save, plus visual line wrapping. Existing VS Code configuration files are preserved.\n\nThe generated docs/ folder is ignored by Git. Refresh it after cloning or updating dependencies. See AGENTS.md for documentation pointers.`,\n });\n}\n","import { execFile } from \"node:child_process\";\nimport { getRuntime } from \"./getRuntime.ts\";\nexport function runPackageManager(args: string[]): Promise<void> {\n const command = getRuntime() === \"bun\" ? \"bun\" : process.platform === \"win32\" ? \"npm.cmd\" : \"npm\";\n return new Promise((resolve, reject) => {\n execFile(\n command,\n args,\n { maxBuffer: 10 * 1024 * 1024, shell: process.platform === \"win32\" },\n (error, stdout, stderr) => {\n if (error)\n reject(\n new Error(`${command} ${args.join(\" \")} failed.\\n${stderr || stdout}`, {\n cause: error,\n }),\n );\n else resolve();\n },\n );\n });\n}\nexport async function installPackages(\n packages: string[],\n options: { development?: boolean } = {},\n): Promise<void> {\n if (packages.length === 0) return;\n const bun = getRuntime() === \"bun\";\n await runPackageManager([\n bun ? \"add\" : \"install\",\n ...(options.development ? (bun ? [\"--dev\"] : [\"--save-dev\"]) : []),\n ...packages,\n ]);\n}\n","import { existsSync, writeFileSync } from \"node:fs\";\nimport { ProjectManifest } from \"./projectManifest.ts\";\nimport { getRuntime } from \"./getRuntime.ts\";\nimport { installPackages } from \"./installPackages.ts\";\nconst tools = [\"vite-plus\", \"typescript\", \"@types/node\"];\nexport async function ensureTooling(manifest: ProjectManifest): Promise<void> {\n const runtime = getRuntime();\n const runtimeTools = runtime === \"bun\" ? [...tools, \"@types/bun\"] : tools;\n const installed = manifest.getInstalledPackages();\n await installPackages(\n runtimeTools.filter((pkg) => !installed.includes(pkg)).map((pkg) => `${pkg}@latest`),\n { development: true },\n );\n if (\n ![\n \"vite.config.ts\",\n \"vite.config.js\",\n \"vite.config.mts\",\n \"vite.config.mjs\",\n \"vite.config.cts\",\n \"vite.config.cjs\",\n ].some((file) => existsSync(file))\n ) {\n writeFileSync(\n \"vite.config.ts\",\n `import { defineConfig, loadEnv } from \"vite-plus\";\n\nexport default defineConfig({\n test: { env: loadEnv(\"test\", process.cwd(), \"\") },\n lint: { options: { typeAware: true, typeCheck: true } },\n fmt: { ignorePatterns: [\"docs/**\", \"sda/data/**\", \"sda/output/**\"] },\n});\n`,\n );\n }\n if (!existsSync(\"tsconfig.json\"))\n writeFileSync(\n \"tsconfig.json\",\n `{\n \"compilerOptions\": {\n \"target\": \"ES2023\",\n \"module\": \"NodeNext\",\n \"strict\": true,\n \"noEmit\": true,\n \"allowImportingTsExtensions\": true,\n \"erasableSyntaxOnly\": ${runtime === \"node\"},\n \"types\": ${runtime === \"bun\" ? '[\"node\", \"bun\"]' : '[\"node\"]'},\n \"skipLibCheck\": true\n },\n \"include\": [\"sda/**/*.ts\", \"vite.config.*\"]\n}\n`,\n );\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\n\nexport function ensureVscode(): void {\n mkdirSync(\".vscode\", { recursive: true });\n const formatter = \"oxc.oxc-vscode\";\n const files = {\n \"extensions.json\": { recommendations: [\"VoidZero.vite-plus-extension-pack\"] },\n \"settings.json\": {\n \"editor.defaultFormatter\": formatter,\n \"[javascript]\": { \"editor.defaultFormatter\": formatter },\n \"[javascriptreact]\": { \"editor.defaultFormatter\": formatter },\n \"[typescript]\": { \"editor.defaultFormatter\": formatter },\n \"[typescriptreact]\": { \"editor.defaultFormatter\": formatter },\n \"oxc.disableNestedConfig\": true,\n \"oxc.fmt.disableNestedConfig\": true,\n \"editor.formatOnSave\": true,\n \"editor.formatOnSaveMode\": \"file\",\n \"editor.codeActionsOnSave\": { \"source.fixAll.oxc\": \"explicit\" },\n \"editor.wordWrap\": \"on\",\n },\n };\n for (const [name, config] of Object.entries(files)) {\n const path = `.vscode/${name}`;\n if (!existsSync(path)) writeFileSync(path, `${JSON.stringify(config, null, 2)}\\n`);\n }\n}\n","","import { getRuntime, type Runtime } from \"./getRuntime.ts\";\nimport metadata from \"../../package.json\" with { type: \"json\" };\nexport function getProjectTasks(runtime: Runtime = getRuntime()) {\n const vp = runtime === \"bun\" ? \"bun run --bun vp\" : \"vp\";\n return {\n sda:\n runtime === \"bun\"\n ? \"bun run --watch sda/main.ts\"\n : \"node --env-file-if-exists=.env --watch sda/main.ts\",\n test: `${vp} test --passWithNoTests`,\n \"all-tests\": `${vp} check && ${runtime === \"bun\" ? \"bun\" : \"npm\"} run test`,\n clean: \"rm -rf .sda-cache .journalism-cache .tmp\",\n fix: `${vp} check --fix`,\n docs: `${runtime === \"bun\" ? \"bunx --bun\" : \"npx\"} @nshiab/setup-data-project@${metadata.version} --docs`,\n };\n}\n","import { existsSync, lstatSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { log } from \"@clack/prompts\";\n\nexport function createFolderStructure(selectedPackages: string[]) {\n const sdaFolder = \"sda\";\n const folders = [\"data\", \"helpers\", \"output\", \"tests\"];\n\n if (!existsSync(sdaFolder)) {\n mkdirSync(sdaFolder, { recursive: true });\n }\n\n for (const folder of folders) {\n const path = join(sdaFolder, folder);\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n }\n\n const mainTsPath = join(sdaFolder, \"main.ts\");\n\n let mainTsContent = 'console.log(\"Hello simple-data-analysis!\");\\n';\n\n if (\n selectedPackages.includes(\"@nshiab/simple-data-analysis\") ||\n selectedPackages.includes(\"@nshiab/simple-data-analysis-core\")\n ) {\n const pkg = selectedPackages.includes(\"@nshiab/simple-data-analysis\")\n ? \"@nshiab/simple-data-analysis\"\n : \"@nshiab/simple-data-analysis-core\";\n mainTsContent = `import { SimpleDB } from \"${pkg}\";\n\nconst sdb = new SimpleDB();\nconst table = sdb.newTable();\n\nawait table.loadArray([{ message: \"Hello simple-data-analysis!\" }]).log();\n\nawait sdb.close();\n`;\n }\n\n if (lstatSync(mainTsPath, { throwIfNoEntry: false }) === undefined) {\n writeFileSync(mainTsPath, mainTsContent);\n log.info(`Created ${mainTsPath}`);\n }\n\n return sdaFolder;\n}\n","import { lstatSync, writeFileSync } from \"node:fs\";\nimport { log } from \"@clack/prompts\";\n\nexport function ensureEnvFile() {\n if (lstatSync(\".env\", { throwIfNoEntry: false }) === undefined) {\n writeFileSync(\".env\", \"\");\n log.info(\"Created .env\");\n }\n}\n","import type { PackageDocs } from \"./fetchPackageDocs.ts\";\nimport { ensureManagedSection } from \"./ensureManagedSection.ts\";\nimport { getInstalledPackageConfigs } from \"./packageRegistry.ts\";\nimport type { Runtime } from \"./getRuntime.ts\";\nexport function ensureAgents(\n docsMapping: Record<string, PackageDocs>,\n runtime: Runtime,\n installedPackages: string[] = Object.keys(docsMapping),\n) {\n const run = runtime === \"bun\" ? \"bun run\" : \"npm run\";\n const command =\n runtime === \"bun\" ? \"bun run sda/main.ts\" : \"node --env-file-if-exists=.env sda/main.ts\";\n const links = getInstalledPackageConfigs(installedPackages).map((pkg) => {\n if (pkg.value === \"@observablehq/plot\")\n return `- Observable Plot charts and maps: read \\`docs/observable-plot/llm.md\\` for use with writeChart and writeMap.`;\n return `- \\`${pkg.value}\\`: start at \\`docs/${pkg.value.slice(\"@nshiab/\".length)}/llms.txt\\`, then read the relevant API pages and examples.`;\n });\n ensureManagedSection({\n path: \"AGENTS.md\",\n name: \"agents\",\n createContent: (section) => section,\n content: `Read package.json for the installed libraries and scripts. Prefer the installed data libraries when they cover the task.\n\nUse sda/main.ts as the entry point and sda/helpers/ for reusable helpers. Put tests in sda/tests/, source data in sda/data/, and results in sda/output/. Import test utilities from \\`vite-plus/test\\`.\n\nFor a single execution, run \\`${command}\\`. The sda script watches for changes. Before handing off code changes, run \\`${run} all-tests\\` and resolve failures.\n\nThe clean script removes cached results and temporary files. Run it only when those cached results can be discarded.\n\nLibrary documentation in docs/ is generated and ignored by Git. Run \\`${run} docs\\` when documentation is missing or after dependency changes; resolve refresh failures before using possibly stale references. Edit project source files rather than downloaded documentation.\n\n${links.join(\"\\n\")}`,\n });\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { isObject } from \"./jsonObject.ts\";\nexport class ProjectManifest {\n #config: Record<string, unknown>;\n private constructor(config: Record<string, unknown>) {\n this.#config = config;\n }\n static open(): ProjectManifest {\n if (!existsSync(\"package.json\"))\n return new ProjectManifest({ name: \"data-project\", private: true, type: \"module\" });\n const config: unknown = JSON.parse(readFileSync(\"package.json\", \"utf8\"));\n if (!isObject(config)) throw new Error(\"package.json must contain a JSON object.\");\n return new ProjectManifest(config);\n }\n reload(): void {\n this.#config = ProjectManifest.open().#config;\n }\n getInstalledPackages(): string[] {\n return Object.keys(this.getInstalledPackageSpecifiers());\n }\n getInstalledPackageSpecifiers(): Record<string, string> {\n const packages: Record<string, string> = {};\n for (const key of [\"dependencies\", \"devDependencies\"]) {\n const dependencies = this.#config[key];\n if (isObject(dependencies))\n for (const [name, version] of Object.entries(dependencies)) {\n if (typeof version === \"string\") packages[name] = version;\n }\n }\n return packages;\n }\n updateTasks(tasks: Record<string, string>): void {\n if (this.#config.type === \"commonjs\") {\n throw new Error(\n 'Setup requires an ESM project. Set \"type\": \"module\" in package.json, or use --docs to refresh documentation only.',\n );\n }\n if (this.#config.type === undefined) this.#config.type = \"module\";\n const existing = this.#config.scripts;\n this.#config.scripts = { ...tasks, ...(isObject(existing) ? existing : {}) };\n writeFileSync(\"package.json\", JSON.stringify(this.#config, null, 2) + \"\\n\");\n }\n}\n","import { log } from \"@clack/prompts\";\nimport {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join, posix } from \"node:path\";\nimport { x } from \"tar\";\nimport { DOCUMENTED_PACKAGES } from \"./packageRegistry.ts\";\nexport interface PackageDocs {\n readme?: string;\n index?: string;\n llm?: string;\n plot?: { version: string; pages: string[] };\n}\nexport async function fetchPackageDocs(pkg: string, version: string): Promise<PackageDocs> {\n const config = DOCUMENTED_PACKAGES.find(\n (item) => item.value === pkg && item.value.startsWith(\"@nshiab/\"),\n );\n if (!config || !/^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/.test(version))\n throw new Error(`Unsupported package or version: ${pkg}@${version}`);\n const repo = pkg.slice(\"@nshiab/\".length);\n mkdirSync(\"docs\", { recursive: true });\n const staging = mkdtempSync(join(\"docs\", \".download-\"));\n const contents = join(staging, \"contents\");\n const target = join(\"docs\", repo);\n const backup = join(staging, \"previous\");\n try {\n const url = `https://github.com/nshiab/${repo}/releases/download/v${version}/documentation.tar.gz`;\n const response = await fetch(url);\n if (!response.ok) throw new Error(`HTTP ${response.status} from ${url}`);\n const archive = join(staging, \"documentation.tar.gz\");\n writeFileSync(archive, Buffer.from(await response.arrayBuffer()));\n mkdirSync(contents);\n let unsafeEntry: string | undefined;\n await x({\n file: archive,\n cwd: contents,\n strict: true,\n preservePaths: false,\n filter(path, entry) {\n const normalized = posix.normalize(path);\n if (\n path.includes(\"\\\\\") ||\n path.startsWith(\"/\") ||\n normalized === \"..\" ||\n normalized.startsWith(\"../\") ||\n !(\"type\" in entry) ||\n ![\"File\", \"Directory\"].includes(entry.type)\n ) {\n unsafeEntry = path;\n return false;\n }\n return true;\n },\n });\n if (unsafeEntry !== undefined) throw new Error(`Unsafe archive entry: ${unsafeEntry}`);\n for (const path of [\"README.md\", \"LICENSE\", \"llms.txt\", \"docs\"]) {\n if (!existsSync(join(contents, path)))\n throw new Error(`Documentation archive is missing ${path}.`);\n }\n const readme = readFileSync(join(contents, \"README.md\"), \"utf8\");\n const index = readFileSync(join(contents, \"llms.txt\"), \"utf8\");\n if (existsSync(target)) renameSync(target, backup);\n try {\n renameSync(contents, target);\n } catch (error) {\n if (existsSync(backup)) renameSync(backup, target);\n throw error;\n }\n return { readme, index };\n } catch (error) {\n log.warn(\n `Could not refresh ${pkg}@${version}: ${String(error)} Existing documentation was preserved and may be stale. Run the docs script again after resolving the error.`,\n );\n return {};\n } finally {\n rmSync(staging, { recursive: true, force: true });\n }\n}\n","import { posix } from \"node:path\";\n\n// The Plot source uses ATX headings, explicit VitePress IDs, and Markdown fences.\n// Keep code verbatim; rewrite only prose links and anchors while joining pages.\nexport function combinePlotDocs(version: string, documents: Map<string, string>): string {\n const pages = [...documents.keys()].sort();\n const source = `https://github.com/observablehq/plot/tree/v${version}/docs`;\n const anchors = new Map<string, Map<string, string>>();\n const sections = new Map<string, { line: number; title: string; id: string }[]>();\n const pageId = (page: string) => `plot-${page.replace(/\\.md$/, \"\").replaceAll(\"/\", \"--\")}`;\n\n for (const page of pages) {\n const ids = new Map<string, string>();\n const headings: { line: number; title: string; id: string }[] = [];\n const counts = new Map<string, number>();\n proseLines(documents.get(page) ?? \"\", (line, number) => {\n for (const match of line.matchAll(/\\bid=[\"']([^\"']+)[\"']/g)) {\n ids.set(match[1], `${pageId(page)}--${match[1]}`);\n }\n const heading = line.match(/^ {0,3}#{1,6}\\s+(.+?)\\s*#*\\s*$/);\n if (!heading) return line;\n const explicit = heading[1].match(/\\{#([^}]+)\\}/)?.[1];\n const title = heading[1].replace(/\\s*\\{#[^}]+\\}/g, \"\");\n const slug =\n explicit ??\n title\n .replace(/<[^>]*>/g, \"\")\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}_\\s-]/gu, \"\")\n .trim()\n .replace(/\\s+/g, \"-\");\n const count = counts.get(slug) ?? 0;\n counts.set(slug, count + 1);\n const localId = `${slug}${count ? `-${count}` : \"\"}`;\n const id = `${pageId(page)}--${localId}`;\n ids.set(localId, id);\n headings.push({ line: number, title, id });\n return line;\n });\n anchors.set(page, ids);\n sections.set(page, headings);\n }\n\n function link(target: string, page: string): string {\n if (/^(?:[a-z][a-z\\d+.-]*:|\\/\\/)/i.test(target)) return target;\n const [pathAndQuery, fragment] = target.split(\"#\", 2);\n const path = pathAndQuery.split(\"?\", 1)[0];\n const resolved =\n path === \"\"\n ? page\n : posix.normalize(\n path.startsWith(\"/\") ? path.slice(1) : posix.join(posix.dirname(page), path),\n );\n const markdown = [resolved, `${resolved}.md`, `${resolved}/index.md`].find((candidate) =>\n documents.has(candidate),\n );\n if (markdown) {\n const id = fragment\n ? anchors.get(markdown)?.get(decodeURIComponent(fragment))\n : pageId(markdown);\n if (id) return `#${id}`;\n // Preserve an upstream target when a fragment is not a known heading/ID.\n return `${source}/${markdown}${fragment ? `#${fragment}` : \"\"}`;\n }\n if (resolved.endsWith(\".md\")) {\n return `${source}/${resolved}${fragment ? `#${fragment}` : \"\"}`;\n }\n const base =\n \"https://raw.githubusercontent.com/observablehq/plot/\" + `refs/tags/v${version}/docs/`;\n return path.startsWith(\"/\")\n ? new URL(`public${target}`, base).href\n : new URL(target, `${base}${page}`).href;\n }\n\n const contents = pages\n .flatMap((page) => [\n `- [${page}](#${pageId(page)})`,\n ...(sections.get(page) ?? []).map(\n ({ title, id }) => ` - [${title.replace(/[[\\]]/g, \"\")}](#${id})`,\n ),\n ])\n .join(\"\\n\");\n const combined = pages\n .map((page) => {\n const headings = new Map(\n (sections.get(page) ?? []).map((heading) => [heading.line, heading]),\n );\n const body = proseLines(documents.get(page) ?? \"\", (line, number) => {\n const heading = headings.get(number);\n // Inline code also remains verbatim. Plot's prose links have simple destinations.\n line = line\n .split(/(`+[^`]*`+)/g)\n .map((part, index) => {\n if (index % 2) return part;\n return part\n .replace(\n /(\\]\\()([^\\s)]+)([^)]*\\))/g,\n (_match: string, before: string, target: string, after: string) =>\n `${before}${link(target, page)}${after}`,\n )\n .replace(\n /^( {0,3}\\[[^\\]]+\\]:\\s*)(\\S+)/,\n (_match: string, before: string, target: string) =>\n `${before}${link(target, page)}`,\n )\n .replace(\n /(?<!:)\\b(href|src)=([\"'])([^\"']+)\\2/g,\n (_match: string, attr: string, quote: string, target: string) =>\n `${attr}=${quote}${link(target, page)}${quote}`,\n )\n .replace(\n /\\bid=([\"'])([^\"']+)\\1/g,\n (_match: string, quote: string, id: string) =>\n `id=${quote}${anchors.get(page)?.get(id) ?? id}${quote}`,\n );\n })\n .join(\"\");\n return heading\n ? `<a id=\"${heading.id}\"></a>\\n\\n${line.replace(/\\s*\\{#[^}]+\\}/g, \"\")}`\n : line;\n });\n return `<a id=\"${pageId(page)}\"></a>\\n\\n# ${page}\\n\\nSource: ${source}/${page}\\n\\n${body}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n return `# Observable Plot ${version}\\n\\nPackage: \\`@observablehq/plot@${version}\\`. Source: [v${version}](${source}).\\n\\nThis reference combines selected upstream documentation for static charts and maps. Introductory and site pages, interaction helpers, and the Auto and Tip marks are omitted. Vue components and plot fences are retained as source examples. Use the table of contents to find API signatures and examples; links to omitted pages lead to the tagged upstream documentation.\\n\\n## Table of contents\\n\\n${contents}\\n\\n---\\n\\n${combined}\\n\\n<!-- setup-data-project:observable-plot:${version}:complete -->\\n`;\n}\n\nfunction proseLines(content: string, transform: (line: string, number: number) => string): string {\n let fence: { character: string; length: number } | undefined;\n let script = false;\n return content\n .split(\"\\n\")\n .map((line, number) => {\n const marker = line.match(/^ {0,3}(`{3,}|~{3,})/);\n if (fence) {\n if (\n marker?.[1][0] === fence.character &&\n marker[1].length >= fence.length &&\n /^ {0,3}(?:`+|~+)\\s*$/.test(line)\n )\n fence = undefined;\n return line;\n }\n if (marker) {\n fence = { character: marker[1][0], length: marker[1].length };\n return line;\n }\n if (/^\\s*<script\\b/.test(line)) script = true;\n if (script) {\n if (/<\\/script>/.test(line)) script = false;\n return line;\n }\n return transform(line, number);\n })\n .join(\"\\n\");\n}\n","// Static chart creation references. Keep this explicit so new upstream pages do\n// not silently expand the installed agent reference.\nexport const PLOT_DOC_PAGES: string[] = [\n \"features/plots.md\",\n \"features/marks.md\",\n \"features/scales.md\",\n \"features/projections.md\",\n \"features/legends.md\",\n \"features/facets.md\",\n \"features/formats.md\",\n \"features/curves.md\",\n \"transforms/bin.md\",\n \"transforms/group.md\",\n \"transforms/stack.md\",\n \"transforms/normalize.md\",\n \"transforms/centroid.md\",\n \"transforms/sort.md\",\n \"marks/area.md\",\n \"marks/arrow.md\",\n \"marks/axis.md\",\n \"marks/bar.md\",\n \"marks/bollinger.md\",\n \"marks/box.md\",\n \"marks/cell.md\",\n \"marks/contour.md\",\n \"marks/delaunay.md\",\n \"marks/density.md\",\n \"marks/difference.md\",\n \"marks/dot.md\",\n \"marks/frame.md\",\n \"marks/geo.md\",\n \"marks/grid.md\",\n \"marks/hexgrid.md\",\n \"marks/image.md\",\n \"marks/line.md\",\n \"marks/linear-regression.md\",\n \"marks/link.md\",\n \"marks/raster.md\",\n \"marks/rect.md\",\n \"marks/rule.md\",\n \"marks/text.md\",\n \"marks/tick.md\",\n \"marks/tree.md\",\n \"marks/vector.md\",\n \"marks/waffle.md\",\n].sort();\n","import { log } from \"@clack/prompts\";\nimport { mkdirSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { combinePlotDocs } from \"./combinePlotDocs.ts\";\nimport { PLOT_DOC_PAGES } from \"./plotDocPages.ts\";\nimport type { PackageDocs } from \"./fetchPackageDocs.ts\";\n\n// Publish one reference only after every tagged page has been fetched.\nexport async function fetchPlotDocs(\n version: string,\n options: { preferStored?: boolean } = {},\n): Promise<PackageDocs> {\n const tag = `v${version}`;\n const directory = join(\"docs\", \"observable-plot\");\n try {\n let llm: string | undefined;\n if (options.preferStored !== false) {\n try {\n const response = await fetch(\n \"https://raw.githubusercontent.com/nshiab/setup-data-project/\" +\n `refs/heads/main/docs-cache/observable-plot/${version}/llm.md`,\n );\n if (response.ok) {\n const cached = await response.text();\n if (isStoredReference(cached, version)) llm = cached;\n }\n } catch {\n // A cache is an optimization. An unavailable cache never blocks the tag.\n }\n }\n if (llm === undefined) llm = await generateReference(version);\n mkdirSync(directory, { recursive: true });\n const temporaryPath = join(directory, \".llm.md.tmp\");\n try {\n writeFileSync(temporaryPath, llm);\n renameSync(temporaryPath, join(directory, \"llm.md\"));\n } finally {\n rmSync(temporaryPath, { force: true });\n }\n return { llm, plot: { version, pages: [...PLOT_DOC_PAGES] } };\n } catch (error) {\n log.warn(\n `Could not fetch complete Observable Plot documentation for ${tag}. ` +\n \"Existing files were preserved, but may not match the installed \" +\n \"version. Resolve the refresh failure before using this reference. \" +\n String(error),\n );\n return {};\n }\n}\n\nasync function generateReference(version: string): Promise<string> {\n const tag = `v${version}`;\n const pages = PLOT_DOC_PAGES;\n const documents = new Map<string, string>();\n const failed: string[] = [];\n // Fetch in small batches to avoid overwhelming GitHub on the first run.\n for (let offset = 0; offset < pages.length; offset += 8) {\n await Promise.all(\n pages.slice(offset, offset + 8).map(async (page) => {\n try {\n const url =\n \"https://raw.githubusercontent.com/observablehq/plot/\" +\n `refs/tags/${tag}/docs/${page}`;\n const response = await fetch(url);\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const content = await response.text();\n documents.set(page, content);\n } catch {\n failed.push(page);\n }\n }),\n );\n }\n\n if (failed.length > 0) {\n throw new Error(`Could not fetch ${failed.length} Markdown pages`);\n }\n return combinePlotDocs(version, documents);\n}\n\nfunction isStoredReference(content: string, version: string): boolean {\n const source = `https://github.com/observablehq/plot/tree/v${version}/docs`;\n const metadata = content.split(/\\n\\s*\\n/)[1]?.replace(/\\s+/g, \" \");\n if (\n !content.startsWith(`# Observable Plot ${version}\\n\\n`) ||\n metadata !== `Package: \\`@observablehq/plot@${version}\\`. Source: [v${version}](${source}).` ||\n !content.trimEnd().endsWith(`<!-- setup-data-project:observable-plot:${version}:complete -->`)\n )\n return false;\n\n // Match actual page sections, not TOC entries. Require every selected page\n // exactly once and some upstream heading/content after its source record.\n const sections = [\n ...content.matchAll(/<a id=\"(plot-[^\"]+)\"><\\/a>\\n\\n# ([^\\n]+\\.md)\\n\\nSource:\\s+([^\\s]+)\\n\\n/g),\n ];\n if (sections.length !== PLOT_DOC_PAGES.length) return false;\n const found = new Set<string>();\n for (let index = 0; index < sections.length; index++) {\n const section = sections[index];\n const page = section[2];\n const id = `plot-${page.replace(/\\.md$/, \"\").replaceAll(\"/\", \"--\")}`;\n if (\n !PLOT_DOC_PAGES.includes(page) ||\n found.has(page) ||\n section[1] !== id ||\n section[3] !== `${source}/${page}`\n )\n return false;\n const body = content.slice(section.index + section[0].length, sections[index + 1]?.index);\n if (!/^#{1,6}\\s+\\S/m.test(body)) return false;\n found.add(page);\n }\n return true;\n}\n","import { log } from \"@clack/prompts\";\nimport { fetchPackageDocs, type PackageDocs } from \"./fetchPackageDocs.ts\";\nimport { fetchPlotDocs } from \"./fetchPlotDocs.ts\";\nimport { getInstalledPackageConfigs } from \"./packageRegistry.ts\";\nexport async function syncPackageDocs(\n installedPackages: string[],\n installedVersions: Record<string, string>,\n): Promise<Record<string, PackageDocs>> {\n const mapping: Record<string, PackageDocs> = {};\n for (const pkg of getInstalledPackageConfigs(installedPackages)) {\n const version = installedVersions[pkg.value];\n if (!version) {\n log.warn(\n `Could not determine the installed version of ${pkg.value}. Install the project dependencies, then run the docs script again. Existing documentation may be stale.`,\n );\n continue;\n }\n const docs =\n pkg.value === \"@observablehq/plot\"\n ? await fetchPlotDocs(version)\n : await fetchPackageDocs(pkg.value, version);\n if (docs.index !== undefined || docs.plot) mapping[pkg.value] = docs;\n }\n return mapping;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isObject } from \"./jsonObject.ts\";\nexport function getInstalledPackageVersions(\n packageSpecifiers: Record<string, string>,\n): Record<string, string> {\n const versions: Record<string, string> = {};\n for (const pkg of Object.keys(packageSpecifiers)) {\n const path = join(\"node_modules\", pkg, \"package.json\");\n if (!existsSync(path)) continue;\n const config: unknown = JSON.parse(readFileSync(path, \"utf8\"));\n if (\n isObject(config) &&\n typeof config.version === \"string\" &&\n /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/.test(config.version)\n )\n versions[pkg] = config.version;\n }\n return versions;\n}\n","import { SUPPORTED_PACKAGES } from \"./packageRegistry.ts\";\n\nexport interface CliOptions {\n help: boolean;\n docs: boolean;\n packages: string[];\n}\n\nconst packageFlags = new Map(\n SUPPORTED_PACKAGES.map((pkg) => [\n `--${pkg.label.replace(/^simple-data-analysis/, \"sda\").replace(/^journalism-/, \"\")}`,\n pkg.value,\n ]),\n);\n\nexport const CLI_HELP = `Usage: setup-data-project [library flags | --docs] [--help]\n\n${Array.from(packageFlags, ([flag, pkg]) => ` ${flag.padEnd(16)} Select ${pkg}.`).join(\"\\n\")}\n --docs Refresh documentation only for installed libraries.\n -h, --help Show this help and exit.\n\nWithout a package flag, choose packages interactively.\nCombine package flags to select libraries without prompting.\nPackage flags keep existing versions and still set up project files and docs.`;\n\nexport function parseArguments(args: string[]): CliOptions {\n const options: CliOptions = { help: false, docs: false, packages: [] };\n\n for (const arg of args) {\n const pkg = packageFlags.get(arg);\n if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n } else if (arg === \"--docs\") {\n options.docs = true;\n } else if (pkg) {\n if (!options.packages.includes(pkg)) options.packages.push(pkg);\n } else {\n throw new Error(`Unknown argument: ${arg}. Use --help for usage.`);\n }\n }\n\n if (options.docs && options.packages.length > 0)\n throw new Error(\"--docs cannot be combined with package flags.\");\n return options;\n}\n","#!/usr/bin/env node\nimport { cancel, intro, isCancel, multiselect, outro, select, spinner } from \"@clack/prompts\";\nimport process from \"node:process\";\nimport { execFileSync } from \"node:child_process\";\n\nimport { getRuntime } from \"./helpers/getRuntime.ts\";\nimport { PACKAGE_OPTIONS } from \"./helpers/packageOptions.ts\";\nimport { ensureGitignore } from \"./helpers/ensureGitignore.ts\";\nimport { ensureReadme } from \"./helpers/ensureReadme.ts\";\nimport { ensureTooling } from \"./helpers/ensureTooling.ts\";\nimport { ensureVscode } from \"./helpers/ensureVscode.ts\";\nimport { runPackageManager, installPackages } from \"./helpers/installPackages.ts\";\nimport { getProjectTasks } from \"./helpers/getProjectTasks.ts\";\nimport { createFolderStructure } from \"./helpers/createFolderStructure.ts\";\nimport { ensureEnvFile } from \"./helpers/ensureEnvFile.ts\";\nimport { ensureAgents } from \"./helpers/ensureAgents.ts\";\nimport { getInstalledPackageConfigs } from \"./helpers/packageRegistry.ts\";\nimport { ProjectManifest } from \"./helpers/projectManifest.ts\";\nimport { syncPackageDocs } from \"./helpers/syncPackageDocs.ts\";\nimport { getInstalledPackageVersions } from \"./helpers/getInstalledPackageVersions.ts\";\nimport { CLI_HELP, parseArguments } from \"./helpers/parseArguments.ts\";\n\nasync function main() {\n const cliOptions = parseArguments(process.argv.slice(2));\n if (cliOptions.help) {\n console.log(CLI_HELP);\n return;\n }\n\n const runtime = getRuntime();\n const projectManifest = ProjectManifest.open();\n if (cliOptions.docs) {\n await refreshDocs(projectManifest);\n return;\n }\n console.log();\n intro(`Hi! 👋 (Running on ${runtime})`);\n\n const installedPackages = projectManifest.getInstalledPackages();\n const options = PACKAGE_OPTIONS.map((opt) => ({\n ...opt,\n label: installedPackages.includes(opt.value)\n ? `${opt.label} \\x1b[2m(installed)\\x1b[22m`\n : opt.label,\n }));\n\n const selectedPackages =\n cliOptions.packages.length > 0\n ? cliOptions.packages\n : await multiselect({\n message:\n \"Which libraries would you like to install?\\n\\x1b[2m(space to select, arrows to navigate, enter to confirm)\\x1b[22m\\n\",\n options,\n required: false,\n });\n\n if (isCancel(selectedPackages)) {\n cancel(\"Installation cancelled.\");\n process.exit(0);\n }\n\n const alreadyInstalled = selectedPackages.filter((pkg) => installedPackages.includes(pkg));\n\n const packagesToInstall: string[] = [];\n\n for (const pkg of selectedPackages) {\n if (alreadyInstalled.includes(pkg)) {\n if (cliOptions.packages.length > 0) continue;\n\n const action = await select({\n message: `${pkg} is already installed. What would you like to do?`,\n options: [\n { value: \"skip\", label: \"Keep existing version\" },\n { value: \"update\", label: \"Update to latest\" },\n ],\n });\n\n if (isCancel(action)) {\n cancel(\"Installation cancelled.\");\n process.exit(0);\n }\n\n if (action === \"update\") {\n packagesToInstall.push(pkg);\n }\n } else {\n packagesToInstall.push(pkg);\n }\n }\n\n projectManifest.updateTasks(getProjectTasks(runtime));\n\n const sInstall = spinner();\n sInstall.start(\"Installing packages...\");\n\n try {\n await installPackages(packagesToInstall);\n projectManifest.reload();\n const declared = projectManifest.getInstalledPackageSpecifiers();\n if (\n projectManifest\n .getInstalledPackages()\n .some((pkg) =>\n [\"@nshiab/simple-data-analysis\", \"@nshiab/journalism-dataviz\"].includes(pkg),\n ) &&\n !declared[\"@observablehq/plot\"]\n ) {\n await installPackages([\"@observablehq/plot\"]);\n projectManifest.reload();\n }\n await ensureTooling(projectManifest);\n // Reinstall declared dependencies when a project was cloned without node_modules.\n projectManifest.reload();\n const versions = getInstalledPackageVersions(projectManifest.getInstalledPackageSpecifiers());\n if (projectManifest.getInstalledPackages().some((pkg) => !versions[pkg]))\n await runPackageManager([\"install\"]);\n } catch (error) {\n sInstall.stop(\"Package installation failed.\");\n throw error;\n }\n sInstall.stop(\"✅ Package installation complete.\");\n\n projectManifest.reload();\n projectManifest.updateTasks(getProjectTasks());\n execFileSync(process.execPath, [\"node_modules/vite-plus/bin/vp\", \"fmt\", \"package.json\"], {\n stdio: \"pipe\",\n });\n\n const finalInstalledPackages = getInstalledPackageConfigs(\n projectManifest.getInstalledPackages(),\n ).map((pkg) => pkg.value);\n const docsMapping = await refreshDocs(projectManifest);\n\n createFolderStructure(finalInstalledPackages);\n\n ensureGitignore();\n\n ensureEnvFile();\n\n ensureVscode();\n\n ensureReadme(runtime, finalInstalledPackages);\n\n ensureAgents(docsMapping, runtime, finalInstalledPackages);\n\n outro(\n process.exitCode\n ? \"Project setup complete; documentation needs attention.\"\n : \"You are all set! 🙌\",\n );\n}\n\nasync function refreshDocs(manifest: ProjectManifest) {\n const packages = getInstalledPackageConfigs(manifest.getInstalledPackages()).map(\n (pkg) => pkg.value,\n );\n const mapping = await syncPackageDocs(\n packages,\n getInstalledPackageVersions(manifest.getInstalledPackageSpecifiers()),\n );\n if (Object.keys(mapping).length !== packages.length) {\n console.error(\"Documentation refresh incomplete. See the warnings above.\");\n process.exitCode = 1;\n }\n return mapping;\n}\n\nmain().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`❌ Error: ${message}`);\n process.exitCode = 1;\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"main.mjs","names":["process","metadata.version","process"],"sources":["../src/helpers/getRuntime.ts","../src/helpers/packageRegistry.ts","../src/helpers/packageOptions.ts","../src/helpers/gitignoreEntries.ts","../src/helpers/ensureGitignore.ts","../src/helpers/ensureManagedSection.ts","../src/helpers/ensureReadme.ts","../src/helpers/installPackages.ts","../src/helpers/ensureTooling.ts","../src/helpers/ensureVscode.ts","../package.json","../src/helpers/getProjectTasks.ts","../src/helpers/createFolderStructure.ts","../src/helpers/ensureEnvFile.ts","../src/helpers/ensureAgents.ts","../src/helpers/jsonObject.ts","../src/helpers/projectManifest.ts","../src/helpers/fetchPackageDocs.ts","../src/helpers/combinePlotDocs.ts","../src/helpers/plotDocPages.ts","../src/helpers/fetchPlotDocs.ts","../src/helpers/syncPackageDocs.ts","../src/helpers/getInstalledPackageVersions.ts","../src/helpers/parseArguments.ts","../src/main.ts"],"sourcesContent":["import process from \"node:process\";\nexport type Runtime = \"node\" | \"bun\";\nexport function getRuntime(versions: { bun?: string; node?: string } = process.versions): Runtime {\n return versions.bun ? \"bun\" : \"node\";\n}\n","export interface PackageConfig {\n value: string;\n label: string;\n type: \"sda\" | \"journalism\" | \"other\";\n hint?: string;\n}\n\nexport const SUPPORTED_PACKAGES: PackageConfig[] = [\n {\n value: \"@nshiab/simple-data-analysis\",\n label: \"simple-data-analysis\",\n type: \"sda\",\n hint: \"All the core functionality, plus methods for dataviz, AI, Google sheets, etc.\",\n },\n {\n value: \"@nshiab/simple-data-analysis-core\",\n label: \"simple-data-analysis-core\",\n type: \"sda\",\n hint: \"No fluff. Great for constrained environments, like a cheap server.\",\n },\n {\n value: \"@nshiab/journalism-ai\",\n label: \"journalism-ai\",\n type: \"journalism\",\n hint: \"Easily use AI local models with Ollama or remote models with Gemini/Vertex.\",\n },\n {\n value: \"@nshiab/journalism-google\",\n label: \"journalism-google\",\n type: \"journalism\",\n hint: \"Push and retrieve data from Google Sheets, Google Bucket, and more.\",\n },\n {\n value: \"@nshiab/journalism-web-scraping\",\n label: \"journalism-web-scraping\",\n type: \"journalism\",\n hint: \"Retrieve data from Statistics Canada tables, HTML table, download files...\",\n },\n {\n value: \"@nshiab/journalism-finance\",\n label: \"journalism-finance\",\n type: \"journalism\",\n hint: \"Retrieve financial data, calculate Canadian mortgage payments and taxes...\",\n },\n {\n value: \"@nshiab/journalism-format\",\n label: \"journalism-format\",\n type: \"journalism\",\n hint: \"Easily format dates, numbers, currencies...\",\n },\n {\n value: \"@nshiab/journalism-climate\",\n label: \"journalism-climate\",\n type: \"journalism\",\n hint: \"Retrieve data from Environment Canada APIs and more.\",\n },\n {\n value: \"@nshiab/journalism-dataviz\",\n label: \"journalism-dataviz\",\n type: \"journalism\",\n hint: \"Render charts/maps with Observable Plot or directly in the terminal.\",\n },\n {\n value: \"@nshiab/journalism-geo\",\n label: \"journalism-geo\",\n type: \"journalism\",\n hint: \"Calculate distances, transform 2D coordinates to 3D, wrangle GeoTIFF files...\",\n },\n {\n value: \"@nshiab/journalism-statistics\",\n label: \"journalism-statistics\",\n type: \"journalism\",\n hint: \"Functions for statistical tests, clustering, random path generation...\",\n },\n {\n value: \"@nshiab/journalism-web\",\n label: \"journalism-web\",\n type: \"journalism\",\n hint: \"Web related functions, including downloading data as CSV, extracting ZIP files to URLs...\",\n },\n {\n value: \"@nshiab/journalism-extras\",\n label: \"journalism-extras\",\n type: \"journalism\",\n hint: \"Functions to zip/unzip, sleep, reencode files, create nested directories...\",\n },\n];\n\n// Plot is installed alongside charting libraries, but is not a setup menu option.\nexport const DOCUMENTED_PACKAGES: PackageConfig[] = [\n ...SUPPORTED_PACKAGES,\n { value: \"@nshiab/journalism\", label: \"journalism\", type: \"journalism\" },\n { value: \"@observablehq/plot\", label: \"Observable Plot\", type: \"other\" },\n];\n\nexport function getInstalledPackageConfigs(installedPackages: string[]): PackageConfig[] {\n const installedSet = new Set(installedPackages);\n return DOCUMENTED_PACKAGES.filter((pkg) => installedSet.has(pkg.value));\n}\n","import { SUPPORTED_PACKAGES } from \"./packageRegistry.ts\";\n\nexport const PACKAGE_OPTIONS = SUPPORTED_PACKAGES.map((pkg) => ({\n value: pkg.value,\n label: pkg.label,\n hint: pkg.hint,\n}));\n","export const GITIGNORE_ENTRIES = [\n \"node_modules\",\n \"docs/\",\n \".tmp\",\n \".sda-cache\",\n \".journalism-cache\",\n \"sda/data\",\n \"sda/output\",\n \".env\",\n \".DS_Store\",\n];\n","import { lstatSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { GITIGNORE_ENTRIES } from \"./gitignoreEntries.ts\";\n\nexport const GITIGNORE_SENTINEL = \"# Added by setup-data-project. Do not remove this line.\";\n\nexport function ensureGitignore() {\n const path = \".gitignore\";\n const stats = lstatSync(path, { throwIfNoEntry: false });\n\n if (stats?.isSymbolicLink()) {\n return;\n }\n\n const content = stats === undefined ? \"\" : readFileSync(path, \"utf-8\");\n const hasSentinel = content.split(\"\\n\").some((line) => line.trim() === GITIGNORE_SENTINEL);\n\n if (hasSentinel) {\n const entries = new Set(content.split(\"\\n\").map((line) => line.trim()));\n const missing = GITIGNORE_ENTRIES.filter((entry) => !entries.has(entry));\n if (missing.length)\n writeFileSync(\n path,\n content + (content.endsWith(\"\\n\") ? \"\" : \"\\n\") + missing.join(\"\\n\") + \"\\n\",\n );\n return;\n }\n\n const separator = content === \"\" ? \"\" : content.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n const block = `${GITIGNORE_SENTINEL}\\n${GITIGNORE_ENTRIES.join(\"\\n\")}\\n`;\n writeFileSync(path, content + separator + block);\n}\n","import { log } from \"@clack/prompts\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\n\ninterface ManagedSectionOptions {\n path: string;\n name: string;\n content: string;\n createContent: (section: string) => string;\n}\n\nexport function ensureManagedSection(\n options: ManagedSectionOptions,\n): \"created\" | \"updated\" | \"unchanged\" | \"missing-markers\" {\n const startMarker = `<!-- Do not remove / setup-data-project:${options.name}:start -->`;\n const endMarker = `<!-- Do not remove / setup-data-project:${options.name}:end -->`;\n const trimmedContent = options.content.trim();\n const section =\n trimmedContent === \"\"\n ? `${startMarker}\\n${endMarker}`\n : `${startMarker}\\n\\n${trimmedContent}\\n\\n${endMarker}`;\n\n if (!existsSync(options.path)) {\n writeFileSync(options.path, ensureFinalNewline(options.createContent(section)));\n return \"created\";\n }\n\n const currentContent = readFileSync(options.path, \"utf-8\");\n const start = currentContent.indexOf(startMarker);\n const end = currentContent.indexOf(endMarker);\n\n if (start === -1 || end === -1 || end < start) {\n log.warn(\n `${options.path} was not updated because its setup-data-project markers ` +\n `were not found. Add ${startMarker} and ${endMarker}, then rerun the ` +\n \"script.\",\n );\n return \"missing-markers\";\n }\n\n const nextContent =\n currentContent.slice(0, start) + section + currentContent.slice(end + endMarker.length);\n\n if (nextContent === currentContent) {\n return \"unchanged\";\n }\n\n writeFileSync(options.path, ensureFinalNewline(nextContent));\n return \"updated\";\n}\n\nfunction ensureFinalNewline(content: string): string {\n return content.endsWith(\"\\n\") ? content : content + \"\\n\";\n}\n","import { ensureManagedSection } from \"./ensureManagedSection.ts\";\nimport { getInstalledPackageConfigs } from \"./packageRegistry.ts\";\nimport type { Runtime } from \"./getRuntime.ts\";\nexport function ensureReadme(runtime: Runtime, installedPackages: string[] = []) {\n const run = runtime === \"bun\" ? \"bun run\" : \"npm run\";\n const libraries = getInstalledPackageConfigs(installedPackages)\n .map((pkg) => `\\`${pkg.value}\\``)\n .join(\", \");\n ensureManagedSection({\n path: \"README.md\",\n name: \"libraries\",\n createContent: (section) =>\n `# Data project\\n\\nCreated with [setup-data-project](https://github.com/nshiab/setup-data-project).\\n\\n${section}`,\n content: `${libraries ? `Installed libraries: ${libraries}.\\n\\n` : \"\"}Use sda/main.ts to process source data from sda/data/ and write results to sda/output/. Both data folders are ignored by Git. Put reusable helpers in sda/helpers/ and tests in sda/tests/. Import test utilities from \\`vite-plus/test\\`.\n\n- \\`${run} sda\\`: run the analysis and watch for changes.\n- \\`${run} test\\`: run tests; the default command also succeeds when no tests exist.\n- \\`${run} all-tests\\`: check types, lint, formatting, and tests.\n- \\`${run} fix\\`: apply formatting and automatic fixes.\n- \\`${run} docs\\`: refresh documentation for the installed library versions.\n- \\`${run} clean\\`: delete cached results and temporary files in .sda-cache/, .journalism-cache/, and .tmp/.\n\nIn VS Code, install the recommended Vite+ extension pack for Oxc formatting and linting and the Vitest test runner. Generated .vscode/settings.json enables formatting and lint fixes on save, plus visual line wrapping. Existing VS Code configuration files are preserved.\n\nThe generated docs/ folder is ignored by Git. Refresh it after cloning or updating dependencies. See AGENTS.md for documentation pointers.`,\n });\n}\n","import { execFile } from \"node:child_process\";\nimport { getRuntime } from \"./getRuntime.ts\";\nexport function runPackageManager(args: string[]): Promise<void> {\n const command = getRuntime() === \"bun\" ? \"bun\" : process.platform === \"win32\" ? \"npm.cmd\" : \"npm\";\n return new Promise((resolve, reject) => {\n execFile(\n command,\n args,\n { maxBuffer: 10 * 1024 * 1024, shell: process.platform === \"win32\" },\n (error, stdout, stderr) => {\n if (error)\n reject(\n new Error(`${command} ${args.join(\" \")} failed.\\n${stderr || stdout}`, {\n cause: error,\n }),\n );\n else resolve();\n },\n );\n });\n}\nexport async function installPackages(\n packages: string[],\n options: { development?: boolean } = {},\n): Promise<void> {\n if (packages.length === 0) return;\n const bun = getRuntime() === \"bun\";\n await runPackageManager([\n bun ? \"add\" : \"install\",\n ...(options.development ? (bun ? [\"--dev\"] : [\"--save-dev\"]) : []),\n ...packages,\n ]);\n}\n","import { existsSync, writeFileSync } from \"node:fs\";\nimport { ProjectManifest } from \"./projectManifest.ts\";\nimport { getRuntime } from \"./getRuntime.ts\";\nimport { installPackages } from \"./installPackages.ts\";\nconst tools = [\"vite-plus\", \"typescript\", \"@types/node\"];\nexport async function ensureTooling(manifest: ProjectManifest): Promise<void> {\n const runtime = getRuntime();\n const runtimeTools = runtime === \"bun\" ? [...tools, \"@types/bun\"] : tools;\n const installed = manifest.getInstalledPackages();\n await installPackages(\n runtimeTools.filter((pkg) => !installed.includes(pkg)).map((pkg) => `${pkg}@latest`),\n { development: true },\n );\n if (\n ![\n \"vite.config.ts\",\n \"vite.config.js\",\n \"vite.config.mts\",\n \"vite.config.mjs\",\n \"vite.config.cts\",\n \"vite.config.cjs\",\n ].some((file) => existsSync(file))\n ) {\n writeFileSync(\n \"vite.config.ts\",\n `import { defineConfig, loadEnv } from \"vite-plus\";\n\nexport default defineConfig({\n test: { env: loadEnv(\"test\", process.cwd(), \"\") },\n lint: { options: { typeAware: true, typeCheck: true } },\n fmt: { ignorePatterns: [\"docs/**\", \"sda/data/**\", \"sda/output/**\"] },\n});\n`,\n );\n }\n if (!existsSync(\"tsconfig.json\"))\n writeFileSync(\n \"tsconfig.json\",\n `{\n \"compilerOptions\": {\n \"target\": \"ES2023\",\n \"module\": \"NodeNext\",\n \"strict\": true,\n \"noEmit\": true,\n \"allowImportingTsExtensions\": true,\n \"erasableSyntaxOnly\": ${runtime === \"node\"},\n \"types\": ${runtime === \"bun\" ? '[\"node\", \"bun\"]' : '[\"node\"]'},\n \"skipLibCheck\": true\n },\n \"include\": [\"sda/**/*.ts\", \"vite.config.*\"]\n}\n`,\n );\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\n\nexport function ensureVscode(): void {\n mkdirSync(\".vscode\", { recursive: true });\n const formatter = \"oxc.oxc-vscode\";\n const files = {\n \"extensions.json\": `{\n \"recommendations\": [\"VoidZero.vite-plus-extension-pack\"]\n}\n`,\n \"settings.json\": `${JSON.stringify(\n {\n \"editor.defaultFormatter\": formatter,\n \"[javascript]\": { \"editor.defaultFormatter\": formatter },\n \"[javascriptreact]\": { \"editor.defaultFormatter\": formatter },\n \"[typescript]\": { \"editor.defaultFormatter\": formatter },\n \"[typescriptreact]\": { \"editor.defaultFormatter\": formatter },\n \"oxc.disableNestedConfig\": true,\n \"oxc.fmt.disableNestedConfig\": true,\n \"editor.formatOnSave\": true,\n \"editor.formatOnSaveMode\": \"file\",\n \"editor.codeActionsOnSave\": { \"source.fixAll.oxc\": \"explicit\" },\n \"editor.wordWrap\": \"on\",\n },\n null,\n 2,\n )}\\n`,\n };\n for (const [name, config] of Object.entries(files)) {\n const path = `.vscode/${name}`;\n if (!existsSync(path)) writeFileSync(path, config);\n }\n}\n","","import { getRuntime, type Runtime } from \"./getRuntime.ts\";\nimport metadata from \"../../package.json\" with { type: \"json\" };\nexport function getProjectTasks(runtime: Runtime = getRuntime()) {\n const vp = runtime === \"bun\" ? \"bun run --bun vp\" : \"vp\";\n return {\n sda:\n runtime === \"bun\"\n ? \"bun run --watch sda/main.ts\"\n : \"node --env-file-if-exists=.env --watch sda/main.ts\",\n test: `${vp} test --passWithNoTests`,\n \"all-tests\": `${vp} check && ${runtime === \"bun\" ? \"bun\" : \"npm\"} run test`,\n clean: \"rm -rf .sda-cache .journalism-cache .tmp\",\n fix: `${vp} check --fix`,\n docs: `${runtime === \"bun\" ? \"bunx --bun\" : \"npx\"} @nshiab/setup-data-project@${metadata.version} --docs`,\n };\n}\n","import { existsSync, lstatSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport function createFolderStructure(selectedPackages: string[]) {\n const sdaFolder = \"sda\";\n const folders = [\"data\", \"helpers\", \"output\", \"tests\"];\n\n if (!existsSync(sdaFolder)) {\n mkdirSync(sdaFolder, { recursive: true });\n }\n\n for (const folder of folders) {\n const path = join(sdaFolder, folder);\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n }\n\n const mainTsPath = join(sdaFolder, \"main.ts\");\n\n let mainTsContent = 'console.log(\"Hello simple-data-analysis!\");\\n';\n\n if (\n selectedPackages.includes(\"@nshiab/simple-data-analysis\") ||\n selectedPackages.includes(\"@nshiab/simple-data-analysis-core\")\n ) {\n const pkg = selectedPackages.includes(\"@nshiab/simple-data-analysis\")\n ? \"@nshiab/simple-data-analysis\"\n : \"@nshiab/simple-data-analysis-core\";\n mainTsContent = `import { SimpleDB } from \"${pkg}\";\n\nconst sdb = new SimpleDB();\nconst table = sdb.newTable();\n\nawait table.loadArray([{ message: \"Hello simple-data-analysis!\" }]).log();\n\nawait sdb.close();\n`;\n }\n\n if (lstatSync(mainTsPath, { throwIfNoEntry: false }) === undefined) {\n writeFileSync(mainTsPath, mainTsContent);\n }\n\n return sdaFolder;\n}\n","import { lstatSync, writeFileSync } from \"node:fs\";\n\nexport function ensureEnvFile() {\n if (lstatSync(\".env\", { throwIfNoEntry: false }) === undefined) {\n writeFileSync(\".env\", \"\");\n }\n}\n","import type { PackageDocs } from \"./fetchPackageDocs.ts\";\nimport { ensureManagedSection } from \"./ensureManagedSection.ts\";\nimport { getInstalledPackageConfigs } from \"./packageRegistry.ts\";\nimport type { Runtime } from \"./getRuntime.ts\";\nexport function ensureAgents(\n docsMapping: Record<string, PackageDocs>,\n runtime: Runtime,\n installedPackages: string[] = Object.keys(docsMapping),\n) {\n const run = runtime === \"bun\" ? \"bun run\" : \"npm run\";\n const command =\n runtime === \"bun\" ? \"bun run sda/main.ts\" : \"node --env-file-if-exists=.env sda/main.ts\";\n const links = getInstalledPackageConfigs(installedPackages).map((pkg) => {\n if (pkg.value === \"@observablehq/plot\")\n return `- Observable Plot charts and maps: read \\`docs/observable-plot/llm.md\\` for use with writeChart and writeMap.`;\n return `- \\`${pkg.value}\\`: start at \\`docs/${pkg.value.slice(\"@nshiab/\".length)}/llms.txt\\`, then read the relevant API pages and examples.`;\n });\n ensureManagedSection({\n path: \"AGENTS.md\",\n name: \"agents\",\n createContent: (section) => section,\n content: `Read package.json for the installed libraries and scripts. Prefer the installed data libraries when they cover the task.\n\nUse sda/main.ts as the entry point and sda/helpers/ for reusable helpers. Put tests in sda/tests/, source data in sda/data/, and results in sda/output/. Import test utilities from \\`vite-plus/test\\`.\n\nFor a single execution, run \\`${command}\\`. The sda script watches for changes. Before handing off code changes, run \\`${run} all-tests\\` and resolve failures.\n\nThe clean script removes cached results and temporary files. Run it only when those cached results can be discarded.\n\nLibrary documentation in docs/ is generated and ignored by Git. Run \\`${run} docs\\` when documentation is missing or after dependency changes; resolve refresh failures before using possibly stale references. Edit project source files rather than downloaded documentation.\n\n${links.join(\"\\n\")}`,\n });\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { isObject } from \"./jsonObject.ts\";\nexport class ProjectManifest {\n #config: Record<string, unknown>;\n private constructor(config: Record<string, unknown>) {\n this.#config = config;\n }\n static open(): ProjectManifest {\n if (!existsSync(\"package.json\"))\n return new ProjectManifest({ name: \"data-project\", private: true, type: \"module\" });\n const config: unknown = JSON.parse(readFileSync(\"package.json\", \"utf8\"));\n if (!isObject(config)) throw new Error(\"package.json must contain a JSON object.\");\n return new ProjectManifest(config);\n }\n reload(): void {\n this.#config = ProjectManifest.open().#config;\n }\n getInstalledPackages(): string[] {\n return Object.keys(this.getInstalledPackageSpecifiers());\n }\n getInstalledPackageSpecifiers(): Record<string, string> {\n const packages: Record<string, string> = {};\n for (const key of [\"dependencies\", \"devDependencies\"]) {\n const dependencies = this.#config[key];\n if (isObject(dependencies))\n for (const [name, version] of Object.entries(dependencies)) {\n if (typeof version === \"string\") packages[name] = version;\n }\n }\n return packages;\n }\n updateTasks(tasks: Record<string, string>): void {\n if (this.#config.type === \"commonjs\") {\n throw new Error(\n 'Setup requires an ESM project. Set \"type\": \"module\" in package.json, or use --docs to refresh documentation only.',\n );\n }\n if (this.#config.type === undefined) this.#config.type = \"module\";\n const existing = this.#config.scripts;\n this.#config.scripts = { ...tasks, ...(isObject(existing) ? existing : {}) };\n writeFileSync(\"package.json\", JSON.stringify(this.#config, null, 2) + \"\\n\");\n }\n}\n","import { log } from \"@clack/prompts\";\nimport {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join, posix } from \"node:path\";\nimport { x } from \"tar\";\nimport { DOCUMENTED_PACKAGES } from \"./packageRegistry.ts\";\nexport interface PackageDocs {\n readme?: string;\n index?: string;\n llm?: string;\n plot?: { version: string; pages: string[] };\n}\nexport async function fetchPackageDocs(pkg: string, version: string): Promise<PackageDocs> {\n const config = DOCUMENTED_PACKAGES.find(\n (item) => item.value === pkg && item.value.startsWith(\"@nshiab/\"),\n );\n if (!config || !/^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/.test(version))\n throw new Error(`Unsupported package or version: ${pkg}@${version}`);\n const repo = pkg.slice(\"@nshiab/\".length);\n mkdirSync(\"docs\", { recursive: true });\n const staging = mkdtempSync(join(\"docs\", \".download-\"));\n const contents = join(staging, \"contents\");\n const target = join(\"docs\", repo);\n const backup = join(staging, \"previous\");\n try {\n const url = `https://github.com/nshiab/${repo}/releases/download/v${version}/documentation.tar.gz`;\n const response = await fetch(url);\n if (!response.ok) throw new Error(`HTTP ${response.status} from ${url}`);\n const archive = join(staging, \"documentation.tar.gz\");\n writeFileSync(archive, Buffer.from(await response.arrayBuffer()));\n mkdirSync(contents);\n let unsafeEntry: string | undefined;\n await x({\n file: archive,\n cwd: contents,\n strict: true,\n preservePaths: false,\n filter(path, entry) {\n const normalized = posix.normalize(path);\n if (\n path.includes(\"\\\\\") ||\n path.startsWith(\"/\") ||\n normalized === \"..\" ||\n normalized.startsWith(\"../\") ||\n !(\"type\" in entry) ||\n ![\"File\", \"Directory\"].includes(entry.type)\n ) {\n unsafeEntry = path;\n return false;\n }\n return true;\n },\n });\n if (unsafeEntry !== undefined) throw new Error(`Unsafe archive entry: ${unsafeEntry}`);\n for (const path of [\"README.md\", \"LICENSE\", \"llms.txt\", \"docs\"]) {\n if (!existsSync(join(contents, path)))\n throw new Error(`Documentation archive is missing ${path}.`);\n }\n const readme = readFileSync(join(contents, \"README.md\"), \"utf8\");\n const index = readFileSync(join(contents, \"llms.txt\"), \"utf8\");\n if (existsSync(target)) renameSync(target, backup);\n try {\n renameSync(contents, target);\n } catch (error) {\n if (existsSync(backup)) renameSync(backup, target);\n throw error;\n }\n return { readme, index };\n } catch (error) {\n log.warn(\n `Could not refresh ${pkg}@${version}: ${String(error)} Existing documentation was preserved and may be stale. Run the docs script again after resolving the error.`,\n );\n return {};\n } finally {\n rmSync(staging, { recursive: true, force: true });\n }\n}\n","import { posix } from \"node:path\";\n\n// The Plot source uses ATX headings, explicit VitePress IDs, and Markdown fences.\n// Keep code verbatim; rewrite only prose links and anchors while joining pages.\nexport function combinePlotDocs(version: string, documents: Map<string, string>): string {\n const pages = [...documents.keys()].sort();\n const source = `https://github.com/observablehq/plot/tree/v${version}/docs`;\n const anchors = new Map<string, Map<string, string>>();\n const sections = new Map<string, { line: number; title: string; id: string }[]>();\n const pageId = (page: string) => `plot-${page.replace(/\\.md$/, \"\").replaceAll(\"/\", \"--\")}`;\n\n for (const page of pages) {\n const ids = new Map<string, string>();\n const headings: { line: number; title: string; id: string }[] = [];\n const counts = new Map<string, number>();\n proseLines(documents.get(page) ?? \"\", (line, number) => {\n for (const match of line.matchAll(/\\bid=[\"']([^\"']+)[\"']/g)) {\n ids.set(match[1], `${pageId(page)}--${match[1]}`);\n }\n const heading = line.match(/^ {0,3}#{1,6}\\s+(.+?)\\s*#*\\s*$/);\n if (!heading) return line;\n const explicit = heading[1].match(/\\{#([^}]+)\\}/)?.[1];\n const title = heading[1].replace(/\\s*\\{#[^}]+\\}/g, \"\");\n const slug =\n explicit ??\n title\n .replace(/<[^>]*>/g, \"\")\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}_\\s-]/gu, \"\")\n .trim()\n .replace(/\\s+/g, \"-\");\n const count = counts.get(slug) ?? 0;\n counts.set(slug, count + 1);\n const localId = `${slug}${count ? `-${count}` : \"\"}`;\n const id = `${pageId(page)}--${localId}`;\n ids.set(localId, id);\n headings.push({ line: number, title, id });\n return line;\n });\n anchors.set(page, ids);\n sections.set(page, headings);\n }\n\n function link(target: string, page: string): string {\n if (/^(?:[a-z][a-z\\d+.-]*:|\\/\\/)/i.test(target)) return target;\n const [pathAndQuery, fragment] = target.split(\"#\", 2);\n const path = pathAndQuery.split(\"?\", 1)[0];\n const resolved =\n path === \"\"\n ? page\n : posix.normalize(\n path.startsWith(\"/\") ? path.slice(1) : posix.join(posix.dirname(page), path),\n );\n const markdown = [resolved, `${resolved}.md`, `${resolved}/index.md`].find((candidate) =>\n documents.has(candidate),\n );\n if (markdown) {\n const id = fragment\n ? anchors.get(markdown)?.get(decodeURIComponent(fragment))\n : pageId(markdown);\n if (id) return `#${id}`;\n // Preserve an upstream target when a fragment is not a known heading/ID.\n return `${source}/${markdown}${fragment ? `#${fragment}` : \"\"}`;\n }\n if (resolved.endsWith(\".md\")) {\n return `${source}/${resolved}${fragment ? `#${fragment}` : \"\"}`;\n }\n const base =\n \"https://raw.githubusercontent.com/observablehq/plot/\" + `refs/tags/v${version}/docs/`;\n return path.startsWith(\"/\")\n ? new URL(`public${target}`, base).href\n : new URL(target, `${base}${page}`).href;\n }\n\n const contents = pages\n .flatMap((page) => [\n `- [${page}](#${pageId(page)})`,\n ...(sections.get(page) ?? []).map(\n ({ title, id }) => ` - [${title.replace(/[[\\]]/g, \"\")}](#${id})`,\n ),\n ])\n .join(\"\\n\");\n const combined = pages\n .map((page) => {\n const headings = new Map(\n (sections.get(page) ?? []).map((heading) => [heading.line, heading]),\n );\n const body = proseLines(documents.get(page) ?? \"\", (line, number) => {\n const heading = headings.get(number);\n // Inline code also remains verbatim. Plot's prose links have simple destinations.\n line = line\n .split(/(`+[^`]*`+)/g)\n .map((part, index) => {\n if (index % 2) return part;\n return part\n .replace(\n /(\\]\\()([^\\s)]+)([^)]*\\))/g,\n (_match: string, before: string, target: string, after: string) =>\n `${before}${link(target, page)}${after}`,\n )\n .replace(\n /^( {0,3}\\[[^\\]]+\\]:\\s*)(\\S+)/,\n (_match: string, before: string, target: string) =>\n `${before}${link(target, page)}`,\n )\n .replace(\n /(?<!:)\\b(href|src)=([\"'])([^\"']+)\\2/g,\n (_match: string, attr: string, quote: string, target: string) =>\n `${attr}=${quote}${link(target, page)}${quote}`,\n )\n .replace(\n /\\bid=([\"'])([^\"']+)\\1/g,\n (_match: string, quote: string, id: string) =>\n `id=${quote}${anchors.get(page)?.get(id) ?? id}${quote}`,\n );\n })\n .join(\"\");\n return heading\n ? `<a id=\"${heading.id}\"></a>\\n\\n${line.replace(/\\s*\\{#[^}]+\\}/g, \"\")}`\n : line;\n });\n return `<a id=\"${pageId(page)}\"></a>\\n\\n# ${page}\\n\\nSource: ${source}/${page}\\n\\n${body}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n return `# Observable Plot ${version}\\n\\nPackage: \\`@observablehq/plot@${version}\\`. Source: [v${version}](${source}).\\n\\nThis reference combines selected upstream documentation for static charts and maps. Introductory and site pages, interaction helpers, and the Auto and Tip marks are omitted. Vue components and plot fences are retained as source examples. Use the table of contents to find API signatures and examples; links to omitted pages lead to the tagged upstream documentation.\\n\\n## Table of contents\\n\\n${contents}\\n\\n---\\n\\n${combined}\\n\\n<!-- setup-data-project:observable-plot:${version}:complete -->\\n`;\n}\n\nfunction proseLines(content: string, transform: (line: string, number: number) => string): string {\n let fence: { character: string; length: number } | undefined;\n let script = false;\n return content\n .split(\"\\n\")\n .map((line, number) => {\n const marker = line.match(/^ {0,3}(`{3,}|~{3,})/);\n if (fence) {\n if (\n marker?.[1][0] === fence.character &&\n marker[1].length >= fence.length &&\n /^ {0,3}(?:`+|~+)\\s*$/.test(line)\n )\n fence = undefined;\n return line;\n }\n if (marker) {\n fence = { character: marker[1][0], length: marker[1].length };\n return line;\n }\n if (/^\\s*<script\\b/.test(line)) script = true;\n if (script) {\n if (/<\\/script>/.test(line)) script = false;\n return line;\n }\n return transform(line, number);\n })\n .join(\"\\n\");\n}\n","// Static chart creation references. Keep this explicit so new upstream pages do\n// not silently expand the installed agent reference.\nexport const PLOT_DOC_PAGES: string[] = [\n \"features/plots.md\",\n \"features/marks.md\",\n \"features/scales.md\",\n \"features/projections.md\",\n \"features/legends.md\",\n \"features/facets.md\",\n \"features/formats.md\",\n \"features/curves.md\",\n \"transforms/bin.md\",\n \"transforms/group.md\",\n \"transforms/stack.md\",\n \"transforms/normalize.md\",\n \"transforms/centroid.md\",\n \"transforms/sort.md\",\n \"marks/area.md\",\n \"marks/arrow.md\",\n \"marks/axis.md\",\n \"marks/bar.md\",\n \"marks/bollinger.md\",\n \"marks/box.md\",\n \"marks/cell.md\",\n \"marks/contour.md\",\n \"marks/delaunay.md\",\n \"marks/density.md\",\n \"marks/difference.md\",\n \"marks/dot.md\",\n \"marks/frame.md\",\n \"marks/geo.md\",\n \"marks/grid.md\",\n \"marks/hexgrid.md\",\n \"marks/image.md\",\n \"marks/line.md\",\n \"marks/linear-regression.md\",\n \"marks/link.md\",\n \"marks/raster.md\",\n \"marks/rect.md\",\n \"marks/rule.md\",\n \"marks/text.md\",\n \"marks/tick.md\",\n \"marks/tree.md\",\n \"marks/vector.md\",\n \"marks/waffle.md\",\n].sort();\n","import { log } from \"@clack/prompts\";\nimport { mkdirSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { combinePlotDocs } from \"./combinePlotDocs.ts\";\nimport { PLOT_DOC_PAGES } from \"./plotDocPages.ts\";\nimport type { PackageDocs } from \"./fetchPackageDocs.ts\";\n\n// Publish one reference only after every tagged page has been fetched.\nexport async function fetchPlotDocs(\n version: string,\n options: { preferStored?: boolean } = {},\n): Promise<PackageDocs> {\n const tag = `v${version}`;\n const directory = join(\"docs\", \"observable-plot\");\n try {\n let llm: string | undefined;\n if (options.preferStored !== false) {\n try {\n const response = await fetch(\n \"https://raw.githubusercontent.com/nshiab/setup-data-project/\" +\n `refs/heads/main/docs-cache/observable-plot/${version}/llm.md`,\n );\n if (response.ok) {\n const cached = await response.text();\n if (isStoredReference(cached, version)) llm = cached;\n }\n } catch {\n // A cache is an optimization. An unavailable cache never blocks the tag.\n }\n }\n if (llm === undefined) llm = await generateReference(version);\n mkdirSync(directory, { recursive: true });\n const temporaryPath = join(directory, \".llm.md.tmp\");\n try {\n writeFileSync(temporaryPath, llm);\n renameSync(temporaryPath, join(directory, \"llm.md\"));\n } finally {\n rmSync(temporaryPath, { force: true });\n }\n return { llm, plot: { version, pages: [...PLOT_DOC_PAGES] } };\n } catch (error) {\n log.warn(\n `Could not fetch complete Observable Plot documentation for ${tag}. ` +\n \"Existing files were preserved, but may not match the installed \" +\n \"version. Resolve the refresh failure before using this reference. \" +\n String(error),\n );\n return {};\n }\n}\n\nasync function generateReference(version: string): Promise<string> {\n const tag = `v${version}`;\n const pages = PLOT_DOC_PAGES;\n const documents = new Map<string, string>();\n const failed: string[] = [];\n // Fetch in small batches to avoid overwhelming GitHub on the first run.\n for (let offset = 0; offset < pages.length; offset += 8) {\n await Promise.all(\n pages.slice(offset, offset + 8).map(async (page) => {\n try {\n const url =\n \"https://raw.githubusercontent.com/observablehq/plot/\" +\n `refs/tags/${tag}/docs/${page}`;\n const response = await fetch(url);\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const content = await response.text();\n documents.set(page, content);\n } catch {\n failed.push(page);\n }\n }),\n );\n }\n\n if (failed.length > 0) {\n throw new Error(`Could not fetch ${failed.length} Markdown pages`);\n }\n return combinePlotDocs(version, documents);\n}\n\nfunction isStoredReference(content: string, version: string): boolean {\n const source = `https://github.com/observablehq/plot/tree/v${version}/docs`;\n const metadata = content.split(/\\n\\s*\\n/)[1]?.replace(/\\s+/g, \" \");\n if (\n !content.startsWith(`# Observable Plot ${version}\\n\\n`) ||\n metadata !== `Package: \\`@observablehq/plot@${version}\\`. Source: [v${version}](${source}).` ||\n !content.trimEnd().endsWith(`<!-- setup-data-project:observable-plot:${version}:complete -->`)\n )\n return false;\n\n // Match actual page sections, not TOC entries. Require every selected page\n // exactly once and some upstream heading/content after its source record.\n const sections = [\n ...content.matchAll(/<a id=\"(plot-[^\"]+)\"><\\/a>\\n\\n# ([^\\n]+\\.md)\\n\\nSource:\\s+([^\\s]+)\\n\\n/g),\n ];\n if (sections.length !== PLOT_DOC_PAGES.length) return false;\n const found = new Set<string>();\n for (let index = 0; index < sections.length; index++) {\n const section = sections[index];\n const page = section[2];\n const id = `plot-${page.replace(/\\.md$/, \"\").replaceAll(\"/\", \"--\")}`;\n if (\n !PLOT_DOC_PAGES.includes(page) ||\n found.has(page) ||\n section[1] !== id ||\n section[3] !== `${source}/${page}`\n )\n return false;\n const body = content.slice(section.index + section[0].length, sections[index + 1]?.index);\n if (!/^#{1,6}\\s+\\S/m.test(body)) return false;\n found.add(page);\n }\n return true;\n}\n","import { log } from \"@clack/prompts\";\nimport { fetchPackageDocs, type PackageDocs } from \"./fetchPackageDocs.ts\";\nimport { fetchPlotDocs } from \"./fetchPlotDocs.ts\";\nimport { getInstalledPackageConfigs } from \"./packageRegistry.ts\";\nexport async function syncPackageDocs(\n installedPackages: string[],\n installedVersions: Record<string, string>,\n): Promise<Record<string, PackageDocs>> {\n const mapping: Record<string, PackageDocs> = {};\n for (const pkg of getInstalledPackageConfigs(installedPackages)) {\n const version = installedVersions[pkg.value];\n if (!version) {\n log.warn(\n `Could not determine the installed version of ${pkg.value}. Install the project dependencies, then run the docs script again. Existing documentation may be stale.`,\n );\n continue;\n }\n const docs =\n pkg.value === \"@observablehq/plot\"\n ? await fetchPlotDocs(version)\n : await fetchPackageDocs(pkg.value, version);\n if (docs.index !== undefined || docs.plot) mapping[pkg.value] = docs;\n }\n return mapping;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isObject } from \"./jsonObject.ts\";\nexport function getInstalledPackageVersions(\n packageSpecifiers: Record<string, string>,\n): Record<string, string> {\n const versions: Record<string, string> = {};\n for (const pkg of Object.keys(packageSpecifiers)) {\n const path = join(\"node_modules\", pkg, \"package.json\");\n if (!existsSync(path)) continue;\n const config: unknown = JSON.parse(readFileSync(path, \"utf8\"));\n if (\n isObject(config) &&\n typeof config.version === \"string\" &&\n /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/.test(config.version)\n )\n versions[pkg] = config.version;\n }\n return versions;\n}\n","import { SUPPORTED_PACKAGES } from \"./packageRegistry.ts\";\n\nexport interface CliOptions {\n help: boolean;\n docs: boolean;\n packages: string[];\n}\n\nconst packageFlags = new Map(\n SUPPORTED_PACKAGES.map((pkg) => [\n `--${pkg.label.replace(/^simple-data-analysis/, \"sda\").replace(/^journalism-/, \"\")}`,\n pkg.value,\n ]),\n);\n\nexport const CLI_HELP = `Usage: setup-data-project [library flags | --docs] [--help]\n\n${Array.from(packageFlags, ([flag, pkg]) => ` ${flag.padEnd(16)} Select ${pkg}.`).join(\"\\n\")}\n --docs Refresh documentation only for installed libraries.\n -h, --help Show this help and exit.\n\nWithout a package flag, choose packages interactively.\nCombine package flags to select libraries without prompting.\nPackage flags keep existing versions and still set up project files and docs.`;\n\nexport function parseArguments(args: string[]): CliOptions {\n const options: CliOptions = { help: false, docs: false, packages: [] };\n\n for (const arg of args) {\n const pkg = packageFlags.get(arg);\n if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n } else if (arg === \"--docs\") {\n options.docs = true;\n } else if (pkg) {\n if (!options.packages.includes(pkg)) options.packages.push(pkg);\n } else {\n throw new Error(`Unknown argument: ${arg}. Use --help for usage.`);\n }\n }\n\n if (options.docs && options.packages.length > 0)\n throw new Error(\"--docs cannot be combined with package flags.\");\n return options;\n}\n","#!/usr/bin/env node\nimport { cancel, intro, isCancel, multiselect, outro, select, spinner } from \"@clack/prompts\";\nimport process from \"node:process\";\nimport { execFileSync } from \"node:child_process\";\n\nimport { getRuntime } from \"./helpers/getRuntime.ts\";\nimport { PACKAGE_OPTIONS } from \"./helpers/packageOptions.ts\";\nimport { ensureGitignore } from \"./helpers/ensureGitignore.ts\";\nimport { ensureReadme } from \"./helpers/ensureReadme.ts\";\nimport { ensureTooling } from \"./helpers/ensureTooling.ts\";\nimport { ensureVscode } from \"./helpers/ensureVscode.ts\";\nimport { runPackageManager, installPackages } from \"./helpers/installPackages.ts\";\nimport { getProjectTasks } from \"./helpers/getProjectTasks.ts\";\nimport { createFolderStructure } from \"./helpers/createFolderStructure.ts\";\nimport { ensureEnvFile } from \"./helpers/ensureEnvFile.ts\";\nimport { ensureAgents } from \"./helpers/ensureAgents.ts\";\nimport { getInstalledPackageConfigs } from \"./helpers/packageRegistry.ts\";\nimport { ProjectManifest } from \"./helpers/projectManifest.ts\";\nimport { syncPackageDocs } from \"./helpers/syncPackageDocs.ts\";\nimport { getInstalledPackageVersions } from \"./helpers/getInstalledPackageVersions.ts\";\nimport { CLI_HELP, parseArguments } from \"./helpers/parseArguments.ts\";\n\nasync function main() {\n const cliOptions = parseArguments(process.argv.slice(2));\n if (cliOptions.help) {\n console.log(CLI_HELP);\n return;\n }\n\n const runtime = getRuntime();\n const projectManifest = ProjectManifest.open();\n if (cliOptions.docs) {\n await refreshDocs(projectManifest);\n return;\n }\n console.log();\n intro(`Hi! 👋 (Running on ${runtime})`);\n\n const installedPackages = projectManifest.getInstalledPackages();\n const options = PACKAGE_OPTIONS.map((opt) => ({\n ...opt,\n label: installedPackages.includes(opt.value)\n ? `${opt.label} \\x1b[2m(installed)\\x1b[22m`\n : opt.label,\n }));\n\n const selectedPackages =\n cliOptions.packages.length > 0\n ? cliOptions.packages\n : await multiselect({\n message:\n \"Which libraries would you like to install?\\n\\x1b[2m(space to select, arrows to navigate, enter to confirm)\\x1b[22m\\n\",\n options,\n required: false,\n });\n\n if (isCancel(selectedPackages)) {\n cancel(\"Installation cancelled.\");\n process.exit(0);\n }\n\n const alreadyInstalled = selectedPackages.filter((pkg) => installedPackages.includes(pkg));\n\n const packagesToInstall: string[] = [];\n\n for (const pkg of selectedPackages) {\n if (alreadyInstalled.includes(pkg)) {\n if (cliOptions.packages.length > 0) continue;\n\n const action = await select({\n message: `${pkg} is already installed. What would you like to do?`,\n options: [\n { value: \"skip\", label: \"Keep existing version\" },\n { value: \"update\", label: \"Update to latest\" },\n ],\n });\n\n if (isCancel(action)) {\n cancel(\"Installation cancelled.\");\n process.exit(0);\n }\n\n if (action === \"update\") {\n packagesToInstall.push(pkg);\n }\n } else {\n packagesToInstall.push(pkg);\n }\n }\n\n projectManifest.updateTasks(getProjectTasks(runtime));\n\n const sInstall = spinner();\n sInstall.start(\"Installing packages...\");\n\n try {\n await installPackages(packagesToInstall);\n projectManifest.reload();\n const declared = projectManifest.getInstalledPackageSpecifiers();\n if (\n projectManifest\n .getInstalledPackages()\n .some((pkg) =>\n [\"@nshiab/simple-data-analysis\", \"@nshiab/journalism-dataviz\"].includes(pkg),\n ) &&\n !declared[\"@observablehq/plot\"]\n ) {\n await installPackages([\"@observablehq/plot\"]);\n projectManifest.reload();\n }\n await ensureTooling(projectManifest);\n // Reinstall declared dependencies when a project was cloned without node_modules.\n projectManifest.reload();\n const versions = getInstalledPackageVersions(projectManifest.getInstalledPackageSpecifiers());\n if (projectManifest.getInstalledPackages().some((pkg) => !versions[pkg]))\n await runPackageManager([\"install\"]);\n } catch (error) {\n sInstall.stop(\"Package installation failed.\");\n throw error;\n }\n sInstall.stop(\"Packages installed.\");\n\n projectManifest.reload();\n const finalInstalledPackages = getInstalledPackageConfigs(\n projectManifest.getInstalledPackages(),\n ).map((pkg) => pkg.value);\n const docsMapping = await refreshDocs(projectManifest);\n\n const sConfig = spinner();\n sConfig.start(\"Preparing project files and configuration...\");\n try {\n projectManifest.updateTasks(getProjectTasks());\n execFileSync(process.execPath, [\"node_modules/vite-plus/bin/vp\", \"fmt\", \"package.json\"], {\n stdio: \"pipe\",\n });\n\n createFolderStructure(finalInstalledPackages);\n ensureGitignore();\n ensureEnvFile();\n ensureVscode();\n ensureReadme(runtime, finalInstalledPackages);\n ensureAgents(docsMapping, runtime, finalInstalledPackages);\n } catch (error) {\n sConfig.stop(\"Project configuration failed.\");\n throw error;\n }\n sConfig.stop(\"Project files and configuration ready.\");\n\n outro(\n process.exitCode\n ? \"Project setup complete; documentation needs attention.\"\n : \"You are all set! 🙌\",\n );\n}\n\nasync function refreshDocs(manifest: ProjectManifest) {\n const packages = getInstalledPackageConfigs(manifest.getInstalledPackages()).map(\n (pkg) => pkg.value,\n );\n const sDocs = spinner();\n sDocs.start(\"Downloading documentation...\");\n try {\n const mapping = await syncPackageDocs(\n packages,\n getInstalledPackageVersions(manifest.getInstalledPackageSpecifiers()),\n );\n if (Object.keys(mapping).length !== packages.length) {\n sDocs.stop(\"Documentation incomplete. See the warnings above.\");\n process.exitCode = 1;\n } else {\n sDocs.stop(\n packages.length > 0 ? \"Documentation downloaded.\" : \"No library documentation to download.\",\n );\n }\n return mapping;\n } catch (error) {\n sDocs.stop(\"Documentation download failed.\");\n throw error;\n }\n}\n\nmain().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`❌ Error: ${message}`);\n process.exitCode = 1;\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nshiab/setup-data-project",
3
- "version": "3.0.0",
3
+ "version": "3.0.2",
4
4
  "description": "Quickly kick off a project using simple-data-analysis-core, simple-data-analysis, and journalism libraries.",
5
5
  "license": "MIT",
6
6
  "repository": "https://github.com/nshiab/setup-data-project",