@nshiab/setup-data-project 2.0.0 → 2.0.1

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.
Files changed (46) hide show
  1. package/README.md +2 -1
  2. package/esm/helpers/ensureAgents.d.ts +2 -1
  3. package/esm/helpers/ensureAgents.d.ts.map +1 -1
  4. package/esm/helpers/ensureAgents.js +38 -4
  5. package/esm/helpers/fetchPackageDocs.d.ts +8 -0
  6. package/esm/helpers/fetchPackageDocs.d.ts.map +1 -0
  7. package/esm/helpers/fetchPackageDocs.js +75 -0
  8. package/esm/helpers/getInstalledPackageVersions.d.ts +2 -0
  9. package/esm/helpers/getInstalledPackageVersions.d.ts.map +1 -0
  10. package/esm/helpers/getInstalledPackageVersions.js +91 -0
  11. package/esm/helpers/installPackages.d.ts +7 -0
  12. package/esm/helpers/installPackages.d.ts.map +1 -0
  13. package/esm/helpers/installPackages.js +59 -0
  14. package/esm/helpers/projectManifest.d.ts +1 -0
  15. package/esm/helpers/projectManifest.d.ts.map +1 -1
  16. package/esm/helpers/projectManifest.js +9 -2
  17. package/esm/helpers/syncPackageDocs.d.ts +2 -1
  18. package/esm/helpers/syncPackageDocs.d.ts.map +1 -1
  19. package/esm/helpers/syncPackageDocs.js +31 -12
  20. package/esm/main.js +10 -5
  21. package/package.json +1 -1
  22. package/script/helpers/ensureAgents.d.ts +2 -1
  23. package/script/helpers/ensureAgents.d.ts.map +1 -1
  24. package/script/helpers/ensureAgents.js +38 -4
  25. package/script/helpers/fetchPackageDocs.d.ts +8 -0
  26. package/script/helpers/fetchPackageDocs.d.ts.map +1 -0
  27. package/script/helpers/fetchPackageDocs.js +78 -0
  28. package/script/helpers/getInstalledPackageVersions.d.ts +2 -0
  29. package/script/helpers/getInstalledPackageVersions.d.ts.map +1 -0
  30. package/script/helpers/getInstalledPackageVersions.js +94 -0
  31. package/script/helpers/installPackages.d.ts +7 -0
  32. package/script/helpers/installPackages.d.ts.map +1 -0
  33. package/script/helpers/installPackages.js +96 -0
  34. package/script/helpers/projectManifest.d.ts +1 -0
  35. package/script/helpers/projectManifest.d.ts.map +1 -1
  36. package/script/helpers/projectManifest.js +9 -2
  37. package/script/helpers/syncPackageDocs.d.ts +2 -1
  38. package/script/helpers/syncPackageDocs.d.ts.map +1 -1
  39. package/script/helpers/syncPackageDocs.js +30 -11
  40. package/script/main.js +10 -5
  41. package/esm/helpers/installPackagesAndFetchDocs.d.ts +0 -10
  42. package/esm/helpers/installPackagesAndFetchDocs.d.ts.map +0 -1
  43. package/esm/helpers/installPackagesAndFetchDocs.js +0 -109
  44. package/script/helpers/installPackagesAndFetchDocs.d.ts +0 -10
  45. package/script/helpers/installPackagesAndFetchDocs.d.ts.map +0 -1
  46. package/script/helpers/installPackagesAndFetchDocs.js +0 -147
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchPackageDocs = fetchPackageDocs;
4
+ const prompts_1 = require("@clack/prompts");
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const PACKAGE_DOCUMENTS = [
8
+ {
9
+ remoteName: "README.md",
10
+ localName: "README.md",
11
+ key: "readme",
12
+ label: "README",
13
+ },
14
+ {
15
+ remoteName: "llm.md",
16
+ localName: "llm.md",
17
+ key: "llm",
18
+ label: "API documentation",
19
+ },
20
+ ];
21
+ async function fetchPackageDocs(pkg, version, options = {}) {
22
+ const repoName = pkg.split("/")[1];
23
+ const docsDirectory = (0, node_path_1.join)("docs", repoName);
24
+ (0, node_fs_1.mkdirSync)(docsDirectory, { recursive: true });
25
+ const sFetch = (0, prompts_1.spinner)();
26
+ if (!options.silent) {
27
+ sFetch.start(`Fetching documentation for ${pkg}@${version}...`);
28
+ }
29
+ const fetchedDocuments = await Promise.all(PACKAGE_DOCUMENTS.map(async (document) => {
30
+ const localPath = (0, node_path_1.join)(docsDirectory, document.localName);
31
+ try {
32
+ const url = "https://raw.githubusercontent.com/nshiab/" + repoName +
33
+ `/refs/tags/v${version}/${document.remoteName}`;
34
+ const response = await fetch(url);
35
+ if (!response.ok) {
36
+ warnAboutFailedFetch(pkg, version, document.label, localPath);
37
+ return { key: document.key, content: undefined };
38
+ }
39
+ const content = await response.text();
40
+ (0, node_fs_1.writeFileSync)(localPath, content);
41
+ return { key: document.key, content };
42
+ }
43
+ catch (error) {
44
+ warnAboutFailedFetch(pkg, version, document.label, localPath);
45
+ console.error(error);
46
+ return { key: document.key, content: undefined };
47
+ }
48
+ }));
49
+ const docs = {};
50
+ for (const document of fetchedDocuments) {
51
+ if (document.content !== undefined) {
52
+ docs[document.key] = document.content;
53
+ }
54
+ }
55
+ const savedCount = fetchedDocuments.filter((document) => document.content !== undefined)
56
+ .length;
57
+ if (!options.silent) {
58
+ if (savedCount === PACKAGE_DOCUMENTS.length) {
59
+ sFetch.stop(`✅ Documentation for ${pkg}@${version} saved!`);
60
+ }
61
+ else if (savedCount > 0) {
62
+ sFetch.stop(`⚠️ Some documentation for ${pkg}@${version} could not be fetched.`);
63
+ }
64
+ else {
65
+ sFetch.stop(`❌ Failed to fetch documentation for ${pkg}@${version}.`);
66
+ }
67
+ }
68
+ return docs;
69
+ }
70
+ function warnAboutFailedFetch(pkg, version, label, localPath) {
71
+ const existingFileGuidance = (0, node_fs_1.existsSync)(localPath)
72
+ ? ` The existing file at ${localPath} was preserved, but it may not ` +
73
+ "match the installed version. Double-check it before relying on it, or " +
74
+ "remove it."
75
+ : "";
76
+ prompts_1.log.warn(`Could not fetch ${label} for ${pkg}@${version} from its GitHub tag.` +
77
+ existingFileGuidance);
78
+ }
@@ -0,0 +1,2 @@
1
+ export declare function getInstalledPackageVersions(packageSpecifiers: Record<string, string>): Record<string, string>;
2
+ //# sourceMappingURL=getInstalledPackageVersions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getInstalledPackageVersions.d.ts","sourceRoot":"","sources":["../../src/helpers/getInstalledPackageVersions.ts"],"names":[],"mappings":"AAKA,wBAAgB,2BAA2B,CACzC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuBxB"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getInstalledPackageVersions = getInstalledPackageVersions;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ function getInstalledPackageVersions(packageSpecifiers) {
7
+ const denoLock = readJsonFile("deno.lock");
8
+ const packageLock = readJsonFile("package-lock.json");
9
+ const bunLock = (0, node_fs_1.existsSync)("bun.lock")
10
+ ? (0, node_fs_1.readFileSync)("bun.lock", "utf-8")
11
+ : undefined;
12
+ const versions = {};
13
+ for (const [pkg, specifier] of Object.entries(packageSpecifiers)) {
14
+ const version = specifier.startsWith("jsr:")
15
+ ? getDenoLockVersion(pkg, specifier, denoLock) ??
16
+ getExactVersion(specifier)
17
+ : getNodeModulesVersion(pkg) ??
18
+ getPackageLockVersion(pkg, packageLock) ??
19
+ getBunLockVersion(pkg, bunLock) ??
20
+ getExactVersion(specifier);
21
+ if (version !== undefined) {
22
+ versions[pkg] = version;
23
+ }
24
+ }
25
+ return versions;
26
+ }
27
+ function getNodeModulesVersion(pkg) {
28
+ const packageJson = readJsonFile((0, node_path_1.join)("node_modules", ...pkg.split("/"), "package.json"));
29
+ return typeof packageJson?.version === "string"
30
+ ? getExactVersion(packageJson.version)
31
+ : undefined;
32
+ }
33
+ function getDenoLockVersion(pkg, specifier, lock) {
34
+ if (!lock || !specifier.startsWith("jsr:"))
35
+ return undefined;
36
+ const specifiers = asObject(lock.specifiers);
37
+ if (!specifiers)
38
+ return undefined;
39
+ const directVersion = specifiers[specifier];
40
+ if (typeof directVersion === "string")
41
+ return getExactVersion(directVersion);
42
+ const prefix = `jsr:${pkg}@`;
43
+ const matchingVersions = Object.entries(specifiers)
44
+ .filter(([key, value]) => key.startsWith(prefix) && typeof value === "string")
45
+ .flatMap(([, value]) => {
46
+ const version = getExactVersion(value);
47
+ return version === undefined ? [] : [version];
48
+ });
49
+ const uniqueVersions = [...new Set(matchingVersions)];
50
+ return uniqueVersions.length === 1 ? uniqueVersions[0] : undefined;
51
+ }
52
+ function getPackageLockVersion(pkg, lock) {
53
+ if (!lock)
54
+ return undefined;
55
+ const packages = asObject(lock.packages);
56
+ const packageEntry = packages
57
+ ? asObject(packages[`node_modules/${pkg}`])
58
+ : undefined;
59
+ if (typeof packageEntry?.version === "string") {
60
+ return getExactVersion(packageEntry.version);
61
+ }
62
+ const dependencies = asObject(lock.dependencies);
63
+ const dependencyEntry = dependencies
64
+ ? asObject(dependencies[pkg])
65
+ : undefined;
66
+ return typeof dependencyEntry?.version === "string"
67
+ ? getExactVersion(dependencyEntry.version)
68
+ : undefined;
69
+ }
70
+ function getBunLockVersion(pkg, lock) {
71
+ if (!lock)
72
+ return undefined;
73
+ const escapedPackage = pkg.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
74
+ const match = lock.match(new RegExp(`"${escapedPackage}"\\s*:\\s*\\[\\s*"${escapedPackage}@(\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?)"`));
75
+ return match?.[1];
76
+ }
77
+ function getExactVersion(specifier) {
78
+ return specifier.match(/(?:^|@)(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/)?.[1];
79
+ }
80
+ function readJsonFile(path) {
81
+ if (!(0, node_fs_1.existsSync)(path))
82
+ return undefined;
83
+ try {
84
+ return asObject(JSON.parse((0, node_fs_1.readFileSync)(path, "utf-8")));
85
+ }
86
+ catch {
87
+ return undefined;
88
+ }
89
+ }
90
+ function asObject(value) {
91
+ return value !== null && typeof value === "object" && !Array.isArray(value)
92
+ ? value
93
+ : undefined;
94
+ }
@@ -0,0 +1,7 @@
1
+ export declare const commandRunner: {
2
+ exec: any;
3
+ };
4
+ export declare function installPackages(selectedPackages: string[], options?: {
5
+ silent?: boolean;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=installPackages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installPackages.d.ts","sourceRoot":"","sources":["../../src/helpers/installPackages.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa;;CAEzB,CAAC;AASF,wBAAsB,eAAe,CACnC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,IAAI,CAAC,CAmDf"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.commandRunner = void 0;
37
+ exports.installPackages = installPackages;
38
+ const prompts_1 = require("@clack/prompts");
39
+ const childProcess = __importStar(require("node:child_process"));
40
+ const getRuntime_js_1 = require("./getRuntime.js");
41
+ exports.commandRunner = {
42
+ exec: childProcess.exec,
43
+ };
44
+ // Temporary: remove this bypass after the 2.0 release window.
45
+ // https://github.com/nshiab/setup-data-project/issues/15
46
+ const PACKAGES_WITH_FRESH_DENO_RELEASES = new Set([
47
+ "@nshiab/simple-data-analysis-core",
48
+ "@nshiab/simple-data-analysis",
49
+ ]);
50
+ async function installPackages(selectedPackages, options = {}) {
51
+ const runtime = (0, getRuntime_js_1.getRuntime)();
52
+ for (const selectedPackage of selectedPackages) {
53
+ const packagesToInstall = [selectedPackage];
54
+ if (selectedPackage === "@nshiab/simple-data-analysis" ||
55
+ selectedPackage === "@nshiab/journalism-dataviz") {
56
+ packagesToInstall.push("@observablehq/plot");
57
+ }
58
+ for (const pkg of packagesToInstall) {
59
+ const s = (0, prompts_1.spinner)();
60
+ const isObservablePlot = pkg === "@observablehq/plot";
61
+ const minimumDependencyAgeOption = PACKAGES_WITH_FRESH_DENO_RELEASES.has(pkg) ? " --min-dep-age=0" : "";
62
+ const installCmd = runtime === "deno"
63
+ ? (isObservablePlot
64
+ ? "deno add npm:" + pkg
65
+ : "deno add" + minimumDependencyAgeOption + " jsr:" +
66
+ pkg)
67
+ : runtime === "bun"
68
+ ? "bun add " + pkg
69
+ : "npm install " + pkg;
70
+ if (!options.silent) {
71
+ s.start("Installing " + pkg + " via " + runtime + "...");
72
+ }
73
+ try {
74
+ await new Promise((resolve, reject) => {
75
+ exports.commandRunner.exec(installCmd, (error) => {
76
+ if (error) {
77
+ reject(error);
78
+ }
79
+ else {
80
+ resolve();
81
+ }
82
+ });
83
+ });
84
+ if (!options.silent) {
85
+ s.stop("✅ " + pkg + " installed!");
86
+ }
87
+ }
88
+ catch (error) {
89
+ if (!options.silent) {
90
+ s.stop("❌ Failed to install " + pkg + ".");
91
+ }
92
+ throw error;
93
+ }
94
+ }
95
+ }
96
+ }
@@ -5,6 +5,7 @@ export declare class ProjectManifest {
5
5
  static open(runtime: Runtime): ProjectManifest;
6
6
  reload(): void;
7
7
  getInstalledPackages(): string[];
8
+ getInstalledPackageSpecifiers(): Record<string, string>;
8
9
  updateTasks(tasks: Record<string, string>): void;
9
10
  }
10
11
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"projectManifest.d.ts","sourceRoot":"","sources":["../../src/helpers/projectManifest.ts"],"names":[],"mappings":"AAEA,KAAK,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAGvC,qBAAa,eAAe;;IAM1B,OAAO;IAYP,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe;IA6B9C,MAAM,IAAI,IAAI;IAId,oBAAoB,IAAI,MAAM,EAAE;IAgBhC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;CAcjD"}
1
+ {"version":3,"file":"projectManifest.d.ts","sourceRoot":"","sources":["../../src/helpers/projectManifest.ts"],"names":[],"mappings":"AAEA,KAAK,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAGvC,qBAAa,eAAe;;IAM1B,OAAO;IAYP,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe;IA6B9C,MAAM,IAAI,IAAI;IAId,oBAAoB,IAAI,MAAM,EAAE;IAIhC,6BAA6B,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAoBvD,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;CAcjD"}
@@ -40,12 +40,19 @@ class ProjectManifest {
40
40
  __classPrivateFieldSet(this, _ProjectManifest_config, readManifest(__classPrivateFieldGet(this, _ProjectManifest_path, "f")), "f");
41
41
  }
42
42
  getInstalledPackages() {
43
- const installed = [];
43
+ return Object.keys(this.getInstalledPackageSpecifiers());
44
+ }
45
+ getInstalledPackageSpecifiers() {
46
+ const installed = {};
44
47
  for (const key of __classPrivateFieldGet(this, _ProjectManifest_dependencyKeys, "f")) {
45
48
  const dependencies = __classPrivateFieldGet(this, _ProjectManifest_config, "f")[key];
46
49
  if (dependencies && typeof dependencies === "object" &&
47
50
  !Array.isArray(dependencies)) {
48
- installed.push(...Object.keys(dependencies));
51
+ for (const [name, specifier] of Object.entries(dependencies)) {
52
+ if (typeof specifier === "string") {
53
+ installed[name] = specifier;
54
+ }
55
+ }
49
56
  }
50
57
  }
51
58
  return installed;
@@ -1,2 +1,3 @@
1
- export declare function syncPackageDocs(installedPackages: string[], docsAlreadyRefreshed?: string[]): Promise<Record<string, string>>;
1
+ import { type PackageDocs } from "./fetchPackageDocs.js";
2
+ export declare function syncPackageDocs(installedPackages: string[], installedVersions: Record<string, string>): Promise<Record<string, PackageDocs>>;
2
3
  //# sourceMappingURL=syncPackageDocs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"syncPackageDocs.d.ts","sourceRoot":"","sources":["../../src/helpers/syncPackageDocs.ts"],"names":[],"mappings":"AAMA,wBAAsB,eAAe,CACnC,iBAAiB,EAAE,MAAM,EAAE,EAC3B,oBAAoB,GAAE,MAAM,EAAO,GAClC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0BjC"}
1
+ {"version":3,"file":"syncPackageDocs.d.ts","sourceRoot":"","sources":["../../src/helpers/syncPackageDocs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG3E,wBAAsB,eAAe,CACnC,iBAAiB,EAAE,MAAM,EAAE,EAC3B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CA+CtC"}
@@ -4,26 +4,45 @@ exports.syncPackageDocs = syncPackageDocs;
4
4
  const prompts_1 = require("@clack/prompts");
5
5
  const node_fs_1 = require("node:fs");
6
6
  const node_path_1 = require("node:path");
7
- const installPackagesAndFetchDocs_js_1 = require("./installPackagesAndFetchDocs.js");
7
+ const fetchPackageDocs_js_1 = require("./fetchPackageDocs.js");
8
8
  const packageRegistry_js_1 = require("./packageRegistry.js");
9
- async function syncPackageDocs(installedPackages, docsAlreadyRefreshed = []) {
9
+ async function syncPackageDocs(installedPackages, installedVersions) {
10
10
  const installedSet = new Set(installedPackages);
11
- const refreshedSet = new Set(docsAlreadyRefreshed);
12
11
  const docsMapping = {};
13
12
  for (const pkg of packageRegistry_js_1.SUPPORTED_PACKAGES) {
14
- const docPath = (0, node_path_1.join)("docs", pkg.value.split("/")[1] + ".md");
13
+ const repoName = pkg.value.split("/")[1];
14
+ const docsDirectory = (0, node_path_1.join)("docs", repoName);
15
+ const llmDocsPath = (0, node_path_1.join)(docsDirectory, "llm.md");
16
+ const legacyDocsPath = (0, node_path_1.join)("docs", repoName + ".md");
15
17
  if (!installedSet.has(pkg.value)) {
16
- if ((0, node_fs_1.existsSync)(docPath)) {
17
- (0, node_fs_1.rmSync)(docPath);
18
- prompts_1.log.info(`Removed stale documentation at ${docPath}.`);
18
+ for (const path of [docsDirectory, legacyDocsPath]) {
19
+ if ((0, node_fs_1.existsSync)(path)) {
20
+ (0, node_fs_1.rmSync)(path, { recursive: true });
21
+ prompts_1.log.info(`Removed stale documentation at ${path}.`);
22
+ }
19
23
  }
20
24
  continue;
21
25
  }
22
- if (!(0, node_fs_1.existsSync)(docPath) && !refreshedSet.has(pkg.value)) {
23
- await (0, installPackagesAndFetchDocs_js_1.fetchPackageDocs)(pkg.value, { silent: true });
26
+ if ((0, node_fs_1.existsSync)(legacyDocsPath)) {
27
+ if (!(0, node_fs_1.existsSync)(llmDocsPath)) {
28
+ (0, node_fs_1.mkdirSync)(docsDirectory, { recursive: true });
29
+ (0, node_fs_1.renameSync)(legacyDocsPath, llmDocsPath);
30
+ prompts_1.log.info(`Moved documentation to ${llmDocsPath}.`);
31
+ }
32
+ else {
33
+ (0, node_fs_1.rmSync)(legacyDocsPath);
34
+ }
35
+ }
36
+ const version = installedVersions[pkg.value];
37
+ if (version === undefined) {
38
+ prompts_1.log.warn(`Could not determine the exact installed version of ${pkg.value}. ` +
39
+ "Existing local documentation was preserved but will not be " +
40
+ "included in AGENTS.md.");
41
+ continue;
24
42
  }
25
- if ((0, node_fs_1.existsSync)(docPath)) {
26
- docsMapping[pkg.value] = (0, node_fs_1.readFileSync)(docPath, "utf-8");
43
+ const docs = await (0, fetchPackageDocs_js_1.fetchPackageDocs)(pkg.value, version, { silent: true });
44
+ if (docs.readme !== undefined || docs.llm !== undefined) {
45
+ docsMapping[pkg.value] = docs;
27
46
  }
28
47
  }
29
48
  return docsMapping;
package/script/main.js CHANGED
@@ -10,7 +10,7 @@ const getRuntime_js_1 = require("./helpers/getRuntime.js");
10
10
  const packageOptions_js_1 = require("./helpers/packageOptions.js");
11
11
  const ensureGitignore_js_1 = require("./helpers/ensureGitignore.js");
12
12
  const ensureReadme_js_1 = require("./helpers/ensureReadme.js");
13
- const installPackagesAndFetchDocs_js_1 = require("./helpers/installPackagesAndFetchDocs.js");
13
+ const installPackages_js_1 = require("./helpers/installPackages.js");
14
14
  const getProjectTasks_js_1 = require("./helpers/getProjectTasks.js");
15
15
  const createFolderStructure_js_1 = require("./helpers/createFolderStructure.js");
16
16
  const ensureEnvFile_js_1 = require("./helpers/ensureEnvFile.js");
@@ -18,6 +18,7 @@ const ensureAgents_js_1 = require("./helpers/ensureAgents.js");
18
18
  const packageRegistry_js_1 = require("./helpers/packageRegistry.js");
19
19
  const projectManifest_js_1 = require("./helpers/projectManifest.js");
20
20
  const syncPackageDocs_js_1 = require("./helpers/syncPackageDocs.js");
21
+ const getInstalledPackageVersions_js_1 = require("./helpers/getInstalledPackageVersions.js");
21
22
  async function main() {
22
23
  const runtime = (0, getRuntime_js_1.getRuntime)();
23
24
  console.log();
@@ -64,10 +65,10 @@ async function main() {
64
65
  }
65
66
  }
66
67
  const sInstall = (0, prompts_1.spinner)();
67
- sInstall.start("Installing packages and fetching documentation...");
68
+ sInstall.start("Installing packages...");
68
69
  for (const pkg of packagesToInstall) {
69
70
  try {
70
- await (0, installPackagesAndFetchDocs_js_1.installPackagesAndFetchDocs)([pkg], { silent: true });
71
+ await (0, installPackages_js_1.installPackages)([pkg], { silent: true });
71
72
  }
72
73
  catch (error) {
73
74
  sInstall.stop(`❌ Failed to install ${pkg}.`);
@@ -75,11 +76,15 @@ async function main() {
75
76
  node_process_1.default.exit(1);
76
77
  }
77
78
  }
78
- sInstall.stop("✅ Packages installed and documentation fetched.");
79
+ sInstall.stop("✅ Package installation complete.");
79
80
  projectManifest.reload();
80
81
  projectManifest.updateTasks((0, getProjectTasks_js_1.getProjectTasks)());
81
82
  const finalInstalledPackages = (0, packageRegistry_js_1.getInstalledPackageConfigs)(projectManifest.getInstalledPackages()).map((pkg) => pkg.value);
82
- const docsMapping = await (0, syncPackageDocs_js_1.syncPackageDocs)(finalInstalledPackages, packagesToInstall);
83
+ const finalInstalledVersions = (0, getInstalledPackageVersions_js_1.getInstalledPackageVersions)(projectManifest.getInstalledPackageSpecifiers());
84
+ const sDocs = (0, prompts_1.spinner)();
85
+ sDocs.start("Fetching documentation for installed package versions...");
86
+ const docsMapping = await (0, syncPackageDocs_js_1.syncPackageDocs)(finalInstalledPackages, finalInstalledVersions);
87
+ sDocs.stop("✅ Documentation synchronization complete.");
83
88
  (0, createFolderStructure_js_1.createFolderStructure)(finalInstalledPackages);
84
89
  (0, ensureGitignore_js_1.ensureGitignore)();
85
90
  (0, ensureEnvFile_js_1.ensureEnvFile)();
@@ -1,10 +0,0 @@
1
- export declare const commandRunner: {
2
- exec: any;
3
- };
4
- export declare function fetchPackageDocs(pkg: string, options?: {
5
- silent?: boolean;
6
- }): Promise<string | undefined>;
7
- export declare function installPackagesAndFetchDocs(selectedPackages: string[], options?: {
8
- silent?: boolean;
9
- }): Promise<string | void>;
10
- //# sourceMappingURL=installPackagesAndFetchDocs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"installPackagesAndFetchDocs.d.ts","sourceRoot":"","sources":["../../src/helpers/installPackagesAndFetchDocs.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,aAAa;;CAEzB,CAAC;AASF,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4C7B;AAED,wBAAsB,2BAA2B,CAC/C,gBAAgB,EAAE,MAAM,EAAE,EAC1B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgExB"}
@@ -1,109 +0,0 @@
1
- import { log, spinner } from "@clack/prompts";
2
- import * as childProcess from "node:child_process";
3
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
4
- import { join } from "node:path";
5
- import { getRuntime } from "./getRuntime.js";
6
- export const commandRunner = {
7
- exec: childProcess.exec,
8
- };
9
- // Temporary: remove this bypass after the 2.0 release window.
10
- // https://github.com/nshiab/setup-data-project/issues/15
11
- const PACKAGES_WITH_FRESH_DENO_RELEASES = new Set([
12
- "@nshiab/simple-data-analysis-core",
13
- "@nshiab/simple-data-analysis",
14
- ]);
15
- export async function fetchPackageDocs(pkg, options = {}) {
16
- if (!existsSync("docs")) {
17
- mkdirSync("docs");
18
- }
19
- const sFetch = spinner();
20
- if (!options.silent) {
21
- sFetch.start("Fetching documentation for " + pkg + "...");
22
- }
23
- try {
24
- const repoName = pkg.split("/")[1];
25
- const url = "https://raw.githubusercontent.com/nshiab/" + repoName +
26
- "/refs/heads/main/llm.md";
27
- const response = await fetch(url);
28
- if (!response.ok) {
29
- if (!options.silent) {
30
- sFetch.stop("⚠️ No documentation (llm.md) found for " + pkg + ".");
31
- }
32
- log.warn(`Documentation for ${pkg} could not be refreshed. Rerun the script ` +
33
- "later to try again.");
34
- return undefined;
35
- }
36
- const docContent = await response.text();
37
- writeFileSync(join("docs", repoName + ".md"), docContent);
38
- if (!options.silent) {
39
- sFetch.stop("✅ Documentation for " + pkg + " saved!");
40
- }
41
- return docContent;
42
- }
43
- catch (error) {
44
- if (!options.silent) {
45
- sFetch.stop("❌ Failed to fetch documentation for " + pkg + ".");
46
- }
47
- log.warn(`Documentation for ${pkg} could not be refreshed. Rerun the script ` +
48
- "later to try again.");
49
- console.error(error);
50
- return undefined;
51
- }
52
- }
53
- export async function installPackagesAndFetchDocs(selectedPackages, options = {}) {
54
- const runtime = getRuntime();
55
- if (Array.isArray(selectedPackages) && selectedPackages.length > 0) {
56
- if (!existsSync("docs")) {
57
- mkdirSync("docs");
58
- }
59
- let lastDoc = "";
60
- for (const pkg of selectedPackages) {
61
- const s = spinner();
62
- const pkgsToInstall = [pkg];
63
- if (pkg === "@nshiab/simple-data-analysis" ||
64
- pkg === "@nshiab/journalism-dataviz") {
65
- pkgsToInstall.push("@observablehq/plot");
66
- }
67
- for (const p of pkgsToInstall) {
68
- const isObservablePlot = p === "@observablehq/plot";
69
- const minimumDependencyAgeOption = PACKAGES_WITH_FRESH_DENO_RELEASES.has(p) ? " --min-dep-age=0" : "";
70
- const installCmd = runtime === "deno"
71
- ? (isObservablePlot
72
- ? "deno add npm:" + p
73
- : "deno add" + minimumDependencyAgeOption + " jsr:" + p)
74
- : runtime === "bun"
75
- ? "bun add " + p
76
- : "npm install " + p;
77
- if (!options.silent) {
78
- s.start("Installing " + p + " via " + runtime + "...");
79
- }
80
- try {
81
- await new Promise((resolve, reject) => {
82
- commandRunner.exec(installCmd, (error) => {
83
- if (error) {
84
- reject(error);
85
- }
86
- else {
87
- resolve(void 0);
88
- }
89
- });
90
- });
91
- if (!options.silent) {
92
- s.stop("✅ " + p + " installed!");
93
- }
94
- }
95
- catch (error) {
96
- if (!options.silent) {
97
- s.stop("❌ Failed to install " + p + ".");
98
- }
99
- throw error;
100
- }
101
- }
102
- const docContent = await fetchPackageDocs(pkg, options);
103
- if (docContent !== undefined) {
104
- lastDoc = docContent;
105
- }
106
- }
107
- return lastDoc;
108
- }
109
- }
@@ -1,10 +0,0 @@
1
- export declare const commandRunner: {
2
- exec: any;
3
- };
4
- export declare function fetchPackageDocs(pkg: string, options?: {
5
- silent?: boolean;
6
- }): Promise<string | undefined>;
7
- export declare function installPackagesAndFetchDocs(selectedPackages: string[], options?: {
8
- silent?: boolean;
9
- }): Promise<string | void>;
10
- //# sourceMappingURL=installPackagesAndFetchDocs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"installPackagesAndFetchDocs.d.ts","sourceRoot":"","sources":["../../src/helpers/installPackagesAndFetchDocs.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,aAAa;;CAEzB,CAAC;AASF,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4C7B;AAED,wBAAsB,2BAA2B,CAC/C,gBAAgB,EAAE,MAAM,EAAE,EAC1B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgExB"}