codama-renderers-dart 0.5.4 → 0.5.6

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.
@@ -386,7 +386,8 @@ var WELL_KNOWN_ADDRESSES = /* @__PURE__ */ new Map([
386
386
  ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", "tokenProgramAddress"],
387
387
  ["TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", "token2022ProgramAddress"],
388
388
  ["ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", "associatedTokenProgramAddress"],
389
- ["MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr", "memoProgramAddress"],
389
+ ["Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH", "memoProgramAddress"],
390
+ ["MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr", "memoLegacyProgramAddressV3"],
390
391
  ["Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo", "memoLegacyProgramAddress"],
391
392
  // Metaplex programs
392
393
  ["metaqbxxU9qX8rZXkmUJ7haCrXXz2W1PSUq1Rn3E1od", "tokenMetadataProgramAddress"],
@@ -505,7 +506,8 @@ function getDiscriminatorValidationFragment(node, scope) {
505
506
  `Discriminator size must be a non-negative safe integer, got ${discriminator.size}.`
506
507
  );
507
508
  }
508
- return fragment`if (bytes.length - offset != ${fragmentFromString(String(discriminator.size))}) {
509
+ const comparison = node.kind === "accountNode" ? "<" : "!=";
510
+ return fragment`if (bytes.length - offset ${fragmentFromString(comparison)} ${fragmentFromString(String(discriminator.size))}) {
509
511
  throw ${use("SolanaError", "solanaErrors")}(
510
512
  ${use("SolanaErrorCode", "solanaErrors")}.codecsInvalidByteLength,
511
513
  {
@@ -619,7 +621,12 @@ function emptyTypeManifest() {
619
621
 
620
622
  // src/visitors/getTypeManifestVisitor.ts
621
623
  function getTypeManifestVisitor(input) {
622
- const { nameApi, linkables, nonScalarEnums = [] } = input;
624
+ const {
625
+ nameApi,
626
+ linkables,
627
+ nonScalarEnums = [],
628
+ linkOverrides = {}
629
+ } = input;
623
630
  const baseVisitor = visitorsCore.staticVisitor(
624
631
  (node) => {
625
632
  throw new errors.CodamaError(errors.CODAMA_ERROR__UNEXPECTED_NODE_KIND, {
@@ -747,8 +754,8 @@ function getTypeManifestVisitor(input) {
747
754
  },
748
755
  visitArrayType(node, { self }) {
749
756
  const itemManifest = visitorsCore.visit(node.item, self);
750
- const encoderSizeExpr = getArraySizeExpression(node, "Encoder");
751
- const decoderSizeExpr = getArraySizeExpression(node, "Decoder");
757
+ const encoderSizeExpr = getArraySizeExpression(node, "Encoder", self);
758
+ const decoderSizeExpr = getArraySizeExpression(node, "Decoder", self);
752
759
  const itemType = fragmentFromString(itemManifest.type.content);
753
760
  const itemEncoder = fragment`${use(
754
761
  "transformEncoder",
@@ -771,8 +778,8 @@ function getTypeManifestVisitor(input) {
771
778
  visitMapType(node, { self }) {
772
779
  const keyManifest = visitorsCore.visit(node.key, self);
773
780
  const valueManifest = visitorsCore.visit(node.value, self);
774
- const encoderSizeExpr = getMapSizeExpression(node, "Encoder");
775
- const decoderSizeExpr = getMapSizeExpression(node, "Decoder");
781
+ const encoderSizeExpr = getMapSizeExpression(node, "Encoder", self);
782
+ const decoderSizeExpr = getMapSizeExpression(node, "Decoder", self);
776
783
  return {
777
784
  type: fragment`Map<${keyManifest.type}, ${valueManifest.type}>`,
778
785
  encoder: fragment`${use(
@@ -789,8 +796,8 @@ function getTypeManifestVisitor(input) {
789
796
  },
790
797
  visitSetType(node, { self }) {
791
798
  const itemManifest = visitorsCore.visit(node.item, self);
792
- const encoderSizeExpr = getSetSizeExpression(node, "Encoder");
793
- const decoderSizeExpr = getSetSizeExpression(node, "Decoder");
799
+ const encoderSizeExpr = getSetSizeExpression(node, "Encoder", self);
800
+ const decoderSizeExpr = getSetSizeExpression(node, "Decoder", self);
794
801
  return {
795
802
  type: fragment`Set<${itemManifest.type}>`,
796
803
  encoder: fragment`${use(
@@ -1100,6 +1107,17 @@ function getTypeManifestVisitor(input) {
1100
1107
  },
1101
1108
  visitDefinedTypeLink(node, { self }) {
1102
1109
  const name = node.name;
1110
+ const override = linkOverrides[name];
1111
+ if (override != null) {
1112
+ const moduleKey2 = `linkOverride:${override.path}`;
1113
+ return {
1114
+ type: use(override.type, moduleKey2),
1115
+ encoder: use(override.encoder, moduleKey2),
1116
+ decoder: use(override.decoder, moduleKey2),
1117
+ value: emptyTypeManifest().value,
1118
+ isEnum: false
1119
+ };
1120
+ }
1103
1121
  const typeName = nameApi.dataType(name);
1104
1122
  const isNonScalar = nonScalarEnums.includes(node.name);
1105
1123
  const moduleKey = `definedType:${snakeCase(name)}`;
@@ -1181,7 +1199,7 @@ function getNumberCodecExpression(node, codecType) {
1181
1199
  const config = node.endian === "be" ? fragment`${use("NumberCodecConfig", "solanaCodecsNumbers")}(endian: ${use("Endian", "dartTypedData")}.big)` : "";
1182
1200
  return fragment`${use(`get${name}${codecType}`, "solanaCodecsNumbers")}(${config})`;
1183
1201
  }
1184
- function getArraySizeExpression(node, codecType) {
1202
+ function getArraySizeExpression(node, codecType, self) {
1185
1203
  if (!("count" in node) || !node.count) return "";
1186
1204
  const count = node.count;
1187
1205
  switch (count.kind) {
@@ -1190,17 +1208,17 @@ function getArraySizeExpression(node, codecType) {
1190
1208
  case "remainderCountNode":
1191
1209
  return ", size: RemainderArraySize()";
1192
1210
  case "prefixedCountNode": {
1193
- const resolvedPrefix = nodes.resolveNestedTypeNode(count.prefix);
1194
- if (resolvedPrefix.format === "u32" && (!resolvedPrefix.endian || resolvedPrefix.endian === "le")) {
1211
+ if (count.prefix.kind === "numberTypeNode" && count.prefix.format === "u32" && (!count.prefix.endian || count.prefix.endian === "le")) {
1195
1212
  return "";
1196
1213
  }
1197
- return fragment`, size: PrefixedArraySize(${getNumberCodecExpression(resolvedPrefix, codecType)})`;
1214
+ const prefix = visitorsCore.visit(count.prefix, self);
1215
+ return fragment`, size: PrefixedArraySize(${codecType === "Encoder" ? prefix.encoder : prefix.decoder})`;
1198
1216
  }
1199
1217
  default:
1200
1218
  return "";
1201
1219
  }
1202
1220
  }
1203
- function getMapSizeExpression(node, codecType) {
1221
+ function getMapSizeExpression(node, codecType, self) {
1204
1222
  if (!("count" in node) || !node.count) return "";
1205
1223
  const count = node.count;
1206
1224
  switch (count.kind) {
@@ -1209,17 +1227,17 @@ function getMapSizeExpression(node, codecType) {
1209
1227
  case "remainderCountNode":
1210
1228
  return ", size: RemainderArraySize()";
1211
1229
  case "prefixedCountNode": {
1212
- const resolvedPrefix = nodes.resolveNestedTypeNode(count.prefix);
1213
- if (resolvedPrefix.format === "u32" && (!resolvedPrefix.endian || resolvedPrefix.endian === "le")) {
1230
+ if (count.prefix.kind === "numberTypeNode" && count.prefix.format === "u32" && (!count.prefix.endian || count.prefix.endian === "le")) {
1214
1231
  return "";
1215
1232
  }
1216
- return fragment`, size: PrefixedArraySize(${getNumberCodecExpression(resolvedPrefix, codecType)})`;
1233
+ const prefix = visitorsCore.visit(count.prefix, self);
1234
+ return fragment`, size: PrefixedArraySize(${codecType === "Encoder" ? prefix.encoder : prefix.decoder})`;
1217
1235
  }
1218
1236
  default:
1219
1237
  return "";
1220
1238
  }
1221
1239
  }
1222
- function getSetSizeExpression(node, codecType) {
1240
+ function getSetSizeExpression(node, codecType, self) {
1223
1241
  if (!("count" in node) || !node.count) return "";
1224
1242
  const count = node.count;
1225
1243
  switch (count.kind) {
@@ -1228,11 +1246,11 @@ function getSetSizeExpression(node, codecType) {
1228
1246
  case "remainderCountNode":
1229
1247
  return ", size: RemainderArraySize()";
1230
1248
  case "prefixedCountNode": {
1231
- const resolvedPrefix = nodes.resolveNestedTypeNode(count.prefix);
1232
- if (resolvedPrefix.format === "u32" && (!resolvedPrefix.endian || resolvedPrefix.endian === "le")) {
1249
+ if (count.prefix.kind === "numberTypeNode" && count.prefix.format === "u32" && (!count.prefix.endian || count.prefix.endian === "le")) {
1233
1250
  return "";
1234
1251
  }
1235
- return fragment`, size: PrefixedArraySize(${getNumberCodecExpression(resolvedPrefix, codecType)})`;
1252
+ const prefix = visitorsCore.visit(count.prefix, self);
1253
+ return fragment`, size: PrefixedArraySize(${codecType === "Encoder" ? prefix.encoder : prefix.decoder})`;
1236
1254
  }
1237
1255
  default:
1238
1256
  return "";
@@ -1594,7 +1612,7 @@ function getIndexPageFragment(fileNames, relativePath = "") {
1594
1612
  "// Auto-generated. Do not edit.\n// ignore_for_file: type=lint\n"
1595
1613
  );
1596
1614
  }
1597
- const exports = fileNames.sort().map((f) => {
1615
+ const exports$1 = fileNames.sort().map((f) => {
1598
1616
  const path = relativePath ? `${relativePath}/${f}` : f;
1599
1617
  return `export '${path}';`;
1600
1618
  }).join("\n");
@@ -1602,17 +1620,17 @@ function getIndexPageFragment(fileNames, relativePath = "") {
1602
1620
  `// Auto-generated. Do not edit.
1603
1621
  // ignore_for_file: type=lint
1604
1622
 
1605
- ${exports}
1623
+ ${exports$1}
1606
1624
  `
1607
1625
  );
1608
1626
  }
1609
1627
  function getRootIndexPageFragment(categories) {
1610
- const exports = categories.sort().map((cat) => `export '${cat}/${cat}.dart';`).join("\n");
1628
+ const exports$1 = categories.sort().map((cat) => `export '${cat}/${cat}.dart';`).join("\n");
1611
1629
  return fragmentFromString(
1612
1630
  `// Auto-generated. Do not edit.
1613
1631
  // ignore_for_file: type=lint
1614
1632
 
1615
- ${exports}
1633
+ ${exports$1}
1616
1634
  `
1617
1635
  );
1618
1636
  }
@@ -2719,7 +2737,9 @@ function getRenderMapVisitor(options = {}) {
2719
2737
  const linkables = new visitorsCore.LinkableDictionary();
2720
2738
  const typeManifestVisitor = getTypeManifestVisitor({
2721
2739
  nameApi,
2722
- linkables});
2740
+ linkables,
2741
+ linkOverrides: options.linkOverrides
2742
+ });
2723
2743
  const scope = {
2724
2744
  nameApi,
2725
2745
  typeManifestVisitor};
@@ -2898,13 +2918,14 @@ function renderVisitor(outputDir, options = {}) {
2898
2918
  deleteFolderBeforeRendering = true,
2899
2919
  formatCode = false,
2900
2920
  nameApi,
2901
- dependencyMap
2921
+ dependencyMap,
2922
+ linkOverrides
2902
2923
  } = options;
2903
2924
  return visitorsCore.rootNodeVisitor((root) => {
2904
2925
  const normalizedRoot = normalizeRootNode(root);
2905
2926
  const renderMap = visitorsCore.visit(
2906
2927
  normalizedRoot,
2907
- getRenderMapVisitor({ nameApi, dependencyMap })
2928
+ getRenderMapVisitor({ nameApi, dependencyMap, linkOverrides })
2908
2929
  );
2909
2930
  const typePathMap = {};
2910
2931
  for (const renderPath of renderMap.keys()) {
@@ -2929,7 +2950,14 @@ function renderVisitor(outputDir, options = {}) {
2929
2950
  }
2930
2951
  internalMap[key] = rel;
2931
2952
  }
2932
- const content = resolveFragmentContent(frag, dependencyMap ?? {}, internalMap);
2953
+ const content = resolveFragmentContent(
2954
+ frag,
2955
+ {
2956
+ ...dependencyMap ?? {},
2957
+ ...linkOverrideImports(outputDir, filePath, options.linkOverrides ?? {})
2958
+ },
2959
+ internalMap
2960
+ );
2933
2961
  files.push([fullPath, content]);
2934
2962
  }
2935
2963
  if (deleteFolderBeforeRendering && fs.existsSync(outputDir)) {
@@ -2944,6 +2972,35 @@ function renderVisitor(outputDir, options = {}) {
2944
2972
  }
2945
2973
  });
2946
2974
  }
2975
+ function linkOverrideImports(outputDir, generatedFilePath, overrides) {
2976
+ const resolved = {};
2977
+ if (Object.keys(overrides).length === 0) return resolved;
2978
+ const libRoot = findLibRoot(outputDir);
2979
+ if (libRoot == null) {
2980
+ throw new Error(
2981
+ `Cannot resolve linkOverrides because the render output directory "${outputDir}" has no "lib" ancestor.`
2982
+ );
2983
+ }
2984
+ const generatedAbsolute = path.posix.join(
2985
+ path.posix.resolve(outputDir),
2986
+ generatedFilePath
2987
+ );
2988
+ for (const override of Object.values(overrides)) {
2989
+ const overrideAbsolute = path.posix.join(libRoot, override.path);
2990
+ let rel = path.posix.relative(path.posix.dirname(generatedAbsolute), overrideAbsolute);
2991
+ if (!rel.startsWith(".")) {
2992
+ rel = `./${rel}`;
2993
+ }
2994
+ resolved[`linkOverride:${override.path}`] = rel;
2995
+ }
2996
+ return resolved;
2997
+ }
2998
+ function findLibRoot(outputDir) {
2999
+ const segments = path.posix.resolve(outputDir).split("/");
3000
+ const libIndex = segments.lastIndexOf("lib");
3001
+ if (libIndex < 0) return null;
3002
+ return segments.slice(0, libIndex + 1).join("/");
3003
+ }
2947
3004
  function resolveFragmentContent(frag, dependencyMap, internalMap = {}) {
2948
3005
  const { content, imports } = frag;
2949
3006
  const importStr = imports.toString({