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.
@@ -382,7 +382,8 @@ var WELL_KNOWN_ADDRESSES = /* @__PURE__ */ new Map([
382
382
  ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", "tokenProgramAddress"],
383
383
  ["TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", "token2022ProgramAddress"],
384
384
  ["ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", "associatedTokenProgramAddress"],
385
- ["MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr", "memoProgramAddress"],
385
+ ["Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH", "memoProgramAddress"],
386
+ ["MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr", "memoLegacyProgramAddressV3"],
386
387
  ["Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo", "memoLegacyProgramAddress"],
387
388
  // Metaplex programs
388
389
  ["metaqbxxU9qX8rZXkmUJ7haCrXXz2W1PSUq1Rn3E1od", "tokenMetadataProgramAddress"],
@@ -501,7 +502,8 @@ function getDiscriminatorValidationFragment(node, scope) {
501
502
  `Discriminator size must be a non-negative safe integer, got ${discriminator.size}.`
502
503
  );
503
504
  }
504
- return fragment`if (bytes.length - offset != ${fragmentFromString(String(discriminator.size))}) {
505
+ const comparison = node.kind === "accountNode" ? "<" : "!=";
506
+ return fragment`if (bytes.length - offset ${fragmentFromString(comparison)} ${fragmentFromString(String(discriminator.size))}) {
505
507
  throw ${use("SolanaError", "solanaErrors")}(
506
508
  ${use("SolanaErrorCode", "solanaErrors")}.codecsInvalidByteLength,
507
509
  {
@@ -615,7 +617,12 @@ function emptyTypeManifest() {
615
617
 
616
618
  // src/visitors/getTypeManifestVisitor.ts
617
619
  function getTypeManifestVisitor(input) {
618
- const { nameApi, linkables, nonScalarEnums = [] } = input;
620
+ const {
621
+ nameApi,
622
+ linkables,
623
+ nonScalarEnums = [],
624
+ linkOverrides = {}
625
+ } = input;
619
626
  const baseVisitor = staticVisitor(
620
627
  (node) => {
621
628
  throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {
@@ -743,8 +750,8 @@ function getTypeManifestVisitor(input) {
743
750
  },
744
751
  visitArrayType(node, { self }) {
745
752
  const itemManifest = visit(node.item, self);
746
- const encoderSizeExpr = getArraySizeExpression(node, "Encoder");
747
- const decoderSizeExpr = getArraySizeExpression(node, "Decoder");
753
+ const encoderSizeExpr = getArraySizeExpression(node, "Encoder", self);
754
+ const decoderSizeExpr = getArraySizeExpression(node, "Decoder", self);
748
755
  const itemType = fragmentFromString(itemManifest.type.content);
749
756
  const itemEncoder = fragment`${use(
750
757
  "transformEncoder",
@@ -767,8 +774,8 @@ function getTypeManifestVisitor(input) {
767
774
  visitMapType(node, { self }) {
768
775
  const keyManifest = visit(node.key, self);
769
776
  const valueManifest = visit(node.value, self);
770
- const encoderSizeExpr = getMapSizeExpression(node, "Encoder");
771
- const decoderSizeExpr = getMapSizeExpression(node, "Decoder");
777
+ const encoderSizeExpr = getMapSizeExpression(node, "Encoder", self);
778
+ const decoderSizeExpr = getMapSizeExpression(node, "Decoder", self);
772
779
  return {
773
780
  type: fragment`Map<${keyManifest.type}, ${valueManifest.type}>`,
774
781
  encoder: fragment`${use(
@@ -785,8 +792,8 @@ function getTypeManifestVisitor(input) {
785
792
  },
786
793
  visitSetType(node, { self }) {
787
794
  const itemManifest = visit(node.item, self);
788
- const encoderSizeExpr = getSetSizeExpression(node, "Encoder");
789
- const decoderSizeExpr = getSetSizeExpression(node, "Decoder");
795
+ const encoderSizeExpr = getSetSizeExpression(node, "Encoder", self);
796
+ const decoderSizeExpr = getSetSizeExpression(node, "Decoder", self);
790
797
  return {
791
798
  type: fragment`Set<${itemManifest.type}>`,
792
799
  encoder: fragment`${use(
@@ -1096,6 +1103,17 @@ function getTypeManifestVisitor(input) {
1096
1103
  },
1097
1104
  visitDefinedTypeLink(node, { self }) {
1098
1105
  const name = node.name;
1106
+ const override = linkOverrides[name];
1107
+ if (override != null) {
1108
+ const moduleKey2 = `linkOverride:${override.path}`;
1109
+ return {
1110
+ type: use(override.type, moduleKey2),
1111
+ encoder: use(override.encoder, moduleKey2),
1112
+ decoder: use(override.decoder, moduleKey2),
1113
+ value: emptyTypeManifest().value,
1114
+ isEnum: false
1115
+ };
1116
+ }
1099
1117
  const typeName = nameApi.dataType(name);
1100
1118
  const isNonScalar = nonScalarEnums.includes(node.name);
1101
1119
  const moduleKey = `definedType:${snakeCase(name)}`;
@@ -1177,7 +1195,7 @@ function getNumberCodecExpression(node, codecType) {
1177
1195
  const config = node.endian === "be" ? fragment`${use("NumberCodecConfig", "solanaCodecsNumbers")}(endian: ${use("Endian", "dartTypedData")}.big)` : "";
1178
1196
  return fragment`${use(`get${name}${codecType}`, "solanaCodecsNumbers")}(${config})`;
1179
1197
  }
1180
- function getArraySizeExpression(node, codecType) {
1198
+ function getArraySizeExpression(node, codecType, self) {
1181
1199
  if (!("count" in node) || !node.count) return "";
1182
1200
  const count = node.count;
1183
1201
  switch (count.kind) {
@@ -1186,17 +1204,17 @@ function getArraySizeExpression(node, codecType) {
1186
1204
  case "remainderCountNode":
1187
1205
  return ", size: RemainderArraySize()";
1188
1206
  case "prefixedCountNode": {
1189
- const resolvedPrefix = resolveNestedTypeNode(count.prefix);
1190
- if (resolvedPrefix.format === "u32" && (!resolvedPrefix.endian || resolvedPrefix.endian === "le")) {
1207
+ if (count.prefix.kind === "numberTypeNode" && count.prefix.format === "u32" && (!count.prefix.endian || count.prefix.endian === "le")) {
1191
1208
  return "";
1192
1209
  }
1193
- return fragment`, size: PrefixedArraySize(${getNumberCodecExpression(resolvedPrefix, codecType)})`;
1210
+ const prefix = visit(count.prefix, self);
1211
+ return fragment`, size: PrefixedArraySize(${codecType === "Encoder" ? prefix.encoder : prefix.decoder})`;
1194
1212
  }
1195
1213
  default:
1196
1214
  return "";
1197
1215
  }
1198
1216
  }
1199
- function getMapSizeExpression(node, codecType) {
1217
+ function getMapSizeExpression(node, codecType, self) {
1200
1218
  if (!("count" in node) || !node.count) return "";
1201
1219
  const count = node.count;
1202
1220
  switch (count.kind) {
@@ -1205,17 +1223,17 @@ function getMapSizeExpression(node, codecType) {
1205
1223
  case "remainderCountNode":
1206
1224
  return ", size: RemainderArraySize()";
1207
1225
  case "prefixedCountNode": {
1208
- const resolvedPrefix = resolveNestedTypeNode(count.prefix);
1209
- if (resolvedPrefix.format === "u32" && (!resolvedPrefix.endian || resolvedPrefix.endian === "le")) {
1226
+ if (count.prefix.kind === "numberTypeNode" && count.prefix.format === "u32" && (!count.prefix.endian || count.prefix.endian === "le")) {
1210
1227
  return "";
1211
1228
  }
1212
- return fragment`, size: PrefixedArraySize(${getNumberCodecExpression(resolvedPrefix, codecType)})`;
1229
+ const prefix = visit(count.prefix, self);
1230
+ return fragment`, size: PrefixedArraySize(${codecType === "Encoder" ? prefix.encoder : prefix.decoder})`;
1213
1231
  }
1214
1232
  default:
1215
1233
  return "";
1216
1234
  }
1217
1235
  }
1218
- function getSetSizeExpression(node, codecType) {
1236
+ function getSetSizeExpression(node, codecType, self) {
1219
1237
  if (!("count" in node) || !node.count) return "";
1220
1238
  const count = node.count;
1221
1239
  switch (count.kind) {
@@ -1224,11 +1242,11 @@ function getSetSizeExpression(node, codecType) {
1224
1242
  case "remainderCountNode":
1225
1243
  return ", size: RemainderArraySize()";
1226
1244
  case "prefixedCountNode": {
1227
- const resolvedPrefix = resolveNestedTypeNode(count.prefix);
1228
- if (resolvedPrefix.format === "u32" && (!resolvedPrefix.endian || resolvedPrefix.endian === "le")) {
1245
+ if (count.prefix.kind === "numberTypeNode" && count.prefix.format === "u32" && (!count.prefix.endian || count.prefix.endian === "le")) {
1229
1246
  return "";
1230
1247
  }
1231
- return fragment`, size: PrefixedArraySize(${getNumberCodecExpression(resolvedPrefix, codecType)})`;
1248
+ const prefix = visit(count.prefix, self);
1249
+ return fragment`, size: PrefixedArraySize(${codecType === "Encoder" ? prefix.encoder : prefix.decoder})`;
1232
1250
  }
1233
1251
  default:
1234
1252
  return "";
@@ -1590,7 +1608,7 @@ function getIndexPageFragment(fileNames, relativePath = "") {
1590
1608
  "// Auto-generated. Do not edit.\n// ignore_for_file: type=lint\n"
1591
1609
  );
1592
1610
  }
1593
- const exports = fileNames.sort().map((f) => {
1611
+ const exports$1 = fileNames.sort().map((f) => {
1594
1612
  const path = relativePath ? `${relativePath}/${f}` : f;
1595
1613
  return `export '${path}';`;
1596
1614
  }).join("\n");
@@ -1598,17 +1616,17 @@ function getIndexPageFragment(fileNames, relativePath = "") {
1598
1616
  `// Auto-generated. Do not edit.
1599
1617
  // ignore_for_file: type=lint
1600
1618
 
1601
- ${exports}
1619
+ ${exports$1}
1602
1620
  `
1603
1621
  );
1604
1622
  }
1605
1623
  function getRootIndexPageFragment(categories) {
1606
- const exports = categories.sort().map((cat) => `export '${cat}/${cat}.dart';`).join("\n");
1624
+ const exports$1 = categories.sort().map((cat) => `export '${cat}/${cat}.dart';`).join("\n");
1607
1625
  return fragmentFromString(
1608
1626
  `// Auto-generated. Do not edit.
1609
1627
  // ignore_for_file: type=lint
1610
1628
 
1611
- ${exports}
1629
+ ${exports$1}
1612
1630
  `
1613
1631
  );
1614
1632
  }
@@ -2715,7 +2733,9 @@ function getRenderMapVisitor(options = {}) {
2715
2733
  const linkables = new LinkableDictionary();
2716
2734
  const typeManifestVisitor = getTypeManifestVisitor({
2717
2735
  nameApi,
2718
- linkables});
2736
+ linkables,
2737
+ linkOverrides: options.linkOverrides
2738
+ });
2719
2739
  const scope = {
2720
2740
  nameApi,
2721
2741
  typeManifestVisitor};
@@ -2894,13 +2914,14 @@ function renderVisitor(outputDir, options = {}) {
2894
2914
  deleteFolderBeforeRendering = true,
2895
2915
  formatCode = false,
2896
2916
  nameApi,
2897
- dependencyMap
2917
+ dependencyMap,
2918
+ linkOverrides
2898
2919
  } = options;
2899
2920
  return rootNodeVisitor((root) => {
2900
2921
  const normalizedRoot = normalizeRootNode(root);
2901
2922
  const renderMap = visit(
2902
2923
  normalizedRoot,
2903
- getRenderMapVisitor({ nameApi, dependencyMap })
2924
+ getRenderMapVisitor({ nameApi, dependencyMap, linkOverrides })
2904
2925
  );
2905
2926
  const typePathMap = {};
2906
2927
  for (const renderPath of renderMap.keys()) {
@@ -2925,7 +2946,14 @@ function renderVisitor(outputDir, options = {}) {
2925
2946
  }
2926
2947
  internalMap[key] = rel;
2927
2948
  }
2928
- const content = resolveFragmentContent(frag, dependencyMap ?? {}, internalMap);
2949
+ const content = resolveFragmentContent(
2950
+ frag,
2951
+ {
2952
+ ...dependencyMap ?? {},
2953
+ ...linkOverrideImports(outputDir, filePath, options.linkOverrides ?? {})
2954
+ },
2955
+ internalMap
2956
+ );
2929
2957
  files.push([fullPath, content]);
2930
2958
  }
2931
2959
  if (deleteFolderBeforeRendering && existsSync(outputDir)) {
@@ -2940,6 +2968,35 @@ function renderVisitor(outputDir, options = {}) {
2940
2968
  }
2941
2969
  });
2942
2970
  }
2971
+ function linkOverrideImports(outputDir, generatedFilePath, overrides) {
2972
+ const resolved = {};
2973
+ if (Object.keys(overrides).length === 0) return resolved;
2974
+ const libRoot = findLibRoot(outputDir);
2975
+ if (libRoot == null) {
2976
+ throw new Error(
2977
+ `Cannot resolve linkOverrides because the render output directory "${outputDir}" has no "lib" ancestor.`
2978
+ );
2979
+ }
2980
+ const generatedAbsolute = posix.join(
2981
+ posix.resolve(outputDir),
2982
+ generatedFilePath
2983
+ );
2984
+ for (const override of Object.values(overrides)) {
2985
+ const overrideAbsolute = posix.join(libRoot, override.path);
2986
+ let rel = posix.relative(posix.dirname(generatedAbsolute), overrideAbsolute);
2987
+ if (!rel.startsWith(".")) {
2988
+ rel = `./${rel}`;
2989
+ }
2990
+ resolved[`linkOverride:${override.path}`] = rel;
2991
+ }
2992
+ return resolved;
2993
+ }
2994
+ function findLibRoot(outputDir) {
2995
+ const segments = posix.resolve(outputDir).split("/");
2996
+ const libIndex = segments.lastIndexOf("lib");
2997
+ if (libIndex < 0) return null;
2998
+ return segments.slice(0, libIndex + 1).join("/");
2999
+ }
2943
3000
  function resolveFragmentContent(frag, dependencyMap, internalMap = {}) {
2944
3001
  const { content, imports } = frag;
2945
3002
  const importStr = imports.toString({