@codama/renderers-js 1.5.0 → 1.5.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.
@@ -100,6 +100,10 @@ function importMapToString(importMap, dependencyMap = {}, useGranularImports = f
100
100
  return `import { ${innerImports} } from '${module}';`;
101
101
  }).join("\n");
102
102
  }
103
+ function getExternalDependencies(importMap, dependencyMap, useGranularImports) {
104
+ const resolvedImports = resolveImportMapModules(importMap, dependencyMap, useGranularImports);
105
+ return new Set([...resolvedImports.keys()].filter((module) => !module.startsWith(".")));
106
+ }
103
107
  function resolveImportMapModules(importMap, dependencyMap, useGranularImports) {
104
108
  const dependencyMapWithDefaults = {
105
109
  ...useGranularImports ? DEFAULT_GRANULAR_EXTERNAL_MODULE_MAP : DEFAULT_EXTERNAL_MODULE_MAP,
@@ -471,6 +475,177 @@ function getImportFromFactory(overrides, customAccountData, customInstructionDat
471
475
  };
472
476
  }
473
477
 
478
+ // src/utils/packageJson.ts
479
+ import { CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS, CodamaError as CodamaError2, logWarn } from "@codama/errors";
480
+ import { fileExists, joinPath, readJson, writeFile } from "@codama/renderers-core";
481
+ import { lt as ltVersion, minVersion, subset } from "semver";
482
+ var DEFAULT_DEPENDENCY_VERSIONS = {
483
+ "@solana/accounts": "^5.0.0",
484
+ "@solana/addresses": "^5.0.0",
485
+ "@solana/codecs": "^5.0.0",
486
+ "@solana/errors": "^5.0.0",
487
+ "@solana/instructions": "^5.0.0",
488
+ "@solana/kit": "^5.0.0",
489
+ "@solana/programs": "^5.0.0",
490
+ "@solana/rpc-types": "^5.0.0",
491
+ "@solana/signers": "^5.0.0"
492
+ };
493
+ function syncPackageJson(renderMap, options) {
494
+ const shouldSyncPackageJson = options.syncPackageJson ?? false;
495
+ const packageFolder = options.packageFolder;
496
+ if (!packageFolder) {
497
+ if (shouldSyncPackageJson) {
498
+ logWarn("Cannot sync package.json. Please provide the 'packageFolder' option.");
499
+ }
500
+ return;
501
+ }
502
+ const packageJsonPath = joinPath(packageFolder, "package.json");
503
+ const usedDependencies = getUsedDependencyVersions(
504
+ renderMap,
505
+ options.dependencyMap ?? {},
506
+ options.dependencyVersions ?? {},
507
+ options.useGranularImports ?? false
508
+ );
509
+ if (!shouldSyncPackageJson) {
510
+ if (fileExists(packageJsonPath)) {
511
+ checkExistingPackageJson(readJson(packageJsonPath), usedDependencies);
512
+ }
513
+ return;
514
+ }
515
+ if (fileExists(packageJsonPath)) {
516
+ const packageJson = updateExistingPackageJson(readJson(packageJsonPath), usedDependencies);
517
+ writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n");
518
+ } else {
519
+ const packageJson = createNewPackageJson(usedDependencies);
520
+ writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n");
521
+ }
522
+ }
523
+ function createNewPackageJson(dependencyVersions) {
524
+ return updateExistingPackageJson(
525
+ {
526
+ name: "js-client",
527
+ version: "1.0.0",
528
+ // eslint-disable-next-line sort-keys-fix/sort-keys-fix
529
+ description: "",
530
+ main: "src/index.ts",
531
+ scripts: { test: 'echo "Error: no test specified" && exit 1' },
532
+ // eslint-disable-next-line sort-keys-fix/sort-keys-fix
533
+ keywords: [],
534
+ // eslint-disable-next-line sort-keys-fix/sort-keys-fix
535
+ author: ""
536
+ },
537
+ dependencyVersions
538
+ );
539
+ }
540
+ function updateExistingPackageJson(packageJson, dependencyVersions) {
541
+ const updatedDependencies = { ...packageJson.dependencies };
542
+ const updatedPeerDependencies = { ...packageJson.peerDependencies };
543
+ const updatedDevDependencies = { ...packageJson.devDependencies };
544
+ for (const [dependency, requiredRange] of Object.entries(dependencyVersions)) {
545
+ let found = false;
546
+ if (updatedDependencies[dependency]) {
547
+ updateDependency(updatedDependencies, dependency, requiredRange);
548
+ found = true;
549
+ }
550
+ if (updatedPeerDependencies[dependency]) {
551
+ updateDependency(updatedPeerDependencies, dependency, requiredRange);
552
+ found = true;
553
+ }
554
+ if (updatedDevDependencies[dependency]) {
555
+ updateDependency(updatedDevDependencies, dependency, requiredRange);
556
+ found = true;
557
+ }
558
+ if (!found) {
559
+ const dependencyGroupToAdd = dependency === "@solana/kit" ? updatedPeerDependencies : updatedDependencies;
560
+ dependencyGroupToAdd[dependency] = requiredRange;
561
+ }
562
+ }
563
+ return {
564
+ ...packageJson,
565
+ ...Object.entries(updatedPeerDependencies).length > 0 ? { peerDependencies: updatedPeerDependencies } : {},
566
+ ...Object.entries(updatedDependencies).length > 0 ? { dependencies: updatedDependencies } : {},
567
+ ...Object.entries(updatedDevDependencies).length > 0 ? { devDependencies: updatedDevDependencies } : {}
568
+ };
569
+ }
570
+ function checkExistingPackageJson(packageJson, dependencyVersions) {
571
+ const missingDependencies = [];
572
+ const dependenciesToUpdate = [];
573
+ const existingDependencies = {
574
+ ...packageJson.devDependencies,
575
+ ...packageJson.peerDependencies,
576
+ ...packageJson.dependencies
577
+ };
578
+ for (const [dependency, requiredRange] of Object.entries(dependencyVersions)) {
579
+ if (!existingDependencies[dependency]) {
580
+ missingDependencies.push(dependency);
581
+ } else if (shouldUpdateRange(dependency, existingDependencies[dependency], requiredRange)) {
582
+ dependenciesToUpdate.push(dependency);
583
+ }
584
+ }
585
+ if (missingDependencies.length === 0 && dependenciesToUpdate.length === 0) return;
586
+ const missingList = missingDependencies.map((d) => `- ${d} missing: ${dependencyVersions[d]}
587
+ `).join("");
588
+ const outdatedList = dependenciesToUpdate.map((d) => `- ${d} outdated: ${existingDependencies[d]} -> ${dependencyVersions[d]}
589
+ `).join("");
590
+ logWarn(
591
+ `The following dependencies in your \`package.json\` are out-of-date or missing:
592
+ ${missingList}${outdatedList}`
593
+ );
594
+ }
595
+ function getUsedDependencyVersions(renderMap, dependencyMap, dependencyVersions, useGranularImports) {
596
+ const dependencyVersionsWithDefaults = {
597
+ ...DEFAULT_DEPENDENCY_VERSIONS,
598
+ ...dependencyVersions
599
+ };
600
+ const fragment2 = mergeFragments([...renderMap.values()], () => "");
601
+ const usedDependencies = getExternalDependencies(fragment2.imports, dependencyMap, useGranularImports);
602
+ const [usedDependencyVersion, missingDependencies] = [...usedDependencies].reduce(
603
+ ([acc, missingDependencies2], dependency) => {
604
+ const version = dependencyVersionsWithDefaults[dependency];
605
+ if (version) {
606
+ acc[dependency] = version;
607
+ } else {
608
+ missingDependencies2.add(dependency);
609
+ }
610
+ return [acc, missingDependencies2];
611
+ },
612
+ [{}, /* @__PURE__ */ new Set()]
613
+ );
614
+ if (missingDependencies.size > 0) {
615
+ throw new CodamaError2(CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS, {
616
+ dependencies: [...missingDependencies],
617
+ message: "Please add these dependencies to the `dependencyVersions` option."
618
+ });
619
+ }
620
+ return usedDependencyVersion;
621
+ }
622
+ function shouldUpdateRange(dependency, currentRange, requiredRange) {
623
+ try {
624
+ if (subset(currentRange, requiredRange)) {
625
+ return false;
626
+ }
627
+ const minRequiredVersion = minVersion(requiredRange);
628
+ const minCurrentVersion = minVersion(currentRange);
629
+ if (!minCurrentVersion || !minRequiredVersion) {
630
+ throw new Error("Could not determine minimum versions.");
631
+ }
632
+ if (ltVersion(minCurrentVersion, minRequiredVersion)) {
633
+ return true;
634
+ }
635
+ return false;
636
+ } catch (error) {
637
+ console.warn(
638
+ `Could not parse the following ranges for dependency "${dependency}": [${currentRange}] and/or [${requiredRange}]. Caused by: ${error.message}`
639
+ );
640
+ return false;
641
+ }
642
+ }
643
+ function updateDependency(dependencyGroup, dependency, requiredRange) {
644
+ const currentRange = dependencyGroup[dependency];
645
+ if (!shouldUpdateRange(dependency, currentRange, requiredRange)) return;
646
+ dependencyGroup[dependency] = requiredRange;
647
+ }
648
+
474
649
  // src/fragments/accountFetchHelpers.ts
475
650
  function getAccountFetchHelpersFragment(scope) {
476
651
  const { accountPath, typeManifest: typeManifest2, nameApi, customAccountData } = scope;
@@ -1718,7 +1893,7 @@ function getInputTypeCallFragment(scope) {
1718
1893
  }
1719
1894
 
1720
1895
  // src/fragments/instructionPage.ts
1721
- import { logWarn } from "@codama/errors";
1896
+ import { logWarn as logWarn2 } from "@codama/errors";
1722
1897
  import { camelCase as camelCase12, definedTypeNode as definedTypeNode2, structTypeNodeFromInstructionArgumentNodes as structTypeNodeFromInstructionArgumentNodes3 } from "@codama/nodes";
1723
1898
  import {
1724
1899
  findProgramNodeFromPath as findProgramNodeFromPath6,
@@ -1926,7 +2101,7 @@ function getRenamedArgsMap(instruction) {
1926
2101
  const allNames = [...instruction.accounts.map((account) => account.name), ...argNames];
1927
2102
  const duplicates = allNames.filter((e, i, a) => a.indexOf(e) !== i);
1928
2103
  if (duplicates.length === 0) return /* @__PURE__ */ new Map();
1929
- logWarn(
2104
+ logWarn2(
1930
2105
  `[JavaScript] Accounts and args of instruction [${instruction.name}] have the following conflicting attributes [${duplicates.join(", ")}]. Thus, the arguments have been renamed to avoid conflicts in the input type.`
1931
2106
  );
1932
2107
  return new Map(duplicates.map((name) => [camelCase12(name), camelCase12(`${name}Arg`)]));
@@ -3109,6 +3284,7 @@ function getRenderMapVisitor(options = {}) {
3109
3284
  customAccountData,
3110
3285
  customInstructionData,
3111
3286
  dependencyMap: options.dependencyMap ?? {},
3287
+ dependencyVersions: options.dependencyVersions ?? {},
3112
3288
  getImportFrom: getImportFromFactory(options.linkOverrides ?? {}, customAccountData, customInstructionData),
3113
3289
  linkables,
3114
3290
  nameApi: getNameApi({ ...DEFAULT_NAME_TRANSFORMERS, ...options.nameTransformers }),
@@ -3258,6 +3434,7 @@ function renderVisitor(path, options = {}) {
3258
3434
  const prettierOptions = { ...DEFAULT_PRETTIER_OPTIONS, ...options.prettierOptions };
3259
3435
  renderMap = await mapRenderMapContentAsync(renderMap, (code) => format(code, prettierOptions));
3260
3436
  }
3437
+ syncPackageJson(renderMap, options);
3261
3438
  writeRenderMap(renderMap, path);
3262
3439
  });
3263
3440
  }
@@ -3266,6 +3443,7 @@ export {
3266
3443
  addToImportMap,
3267
3444
  createImportMap,
3268
3445
  renderVisitor as default,
3446
+ getExternalDependencies,
3269
3447
  getNameApi,
3270
3448
  getRenderMapVisitor,
3271
3449
  getTypeManifestVisitor,