@codama/renderers-js 1.5.1 → 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.
- package/README.md +18 -15
- package/dist/index.browser.cjs +228 -50
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.mjs +180 -2
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.node.cjs +229 -50
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +180 -2
- package/dist/index.node.mjs.map +1 -1
- package/dist/index.react-native.mjs +180 -2
- package/dist/index.react-native.mjs.map +1 -1
- package/dist/types/utils/importMap.d.ts +1 -0
- package/dist/types/utils/importMap.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/options.d.ts +4 -0
- package/dist/types/utils/options.d.ts.map +1 -1
- package/dist/types/utils/packageJson.d.ts +25 -0
- package/dist/types/utils/packageJson.d.ts.map +1 -0
- package/dist/types/visitors/getRenderMapVisitor.d.ts.map +1 -1
- package/dist/types/visitors/renderVisitor.d.ts.map +1 -1
- package/package.json +9 -7
|
@@ -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
|
-
|
|
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,
|