@postman-cse/onboarding-bootstrap 2.1.0 → 2.1.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.
package/dist/cli.cjs CHANGED
@@ -296676,9 +296676,19 @@ function collectParameterChecks(root, pathItem, operation, version2, operationId
296676
296676
  if (defaultSerialization) warnings.push(`CONTRACT_SCHEMA_NOT_COMPILED: parameter ${location2}:${name} schema on ${operationId} skipped (${packed.unsupported})`);
296677
296677
  continue;
296678
296678
  }
296679
- if (location2 === "path" && !pathTemplate.split("/").includes(`{${name}}`)) {
296680
- warnings.push(`CONTRACT_PATH_PARAM_COMPOUND_SEGMENT_NOT_VALIDATED: path parameter ${name} of ${operationId} is embedded in a compound path segment and is not schema-validated`);
296681
- continue;
296679
+ if (location2 === "path") {
296680
+ const containingSegment = pathTemplate.split("/").find((segment) => segment.includes(`{${name}}`));
296681
+ if (containingSegment !== void 0 && containingSegment !== `{${name}}`) {
296682
+ const segmentParts = containingSegment.split(/(\{[^}]+\})/).filter(Boolean);
296683
+ let extractable = true;
296684
+ for (let partIndex = 0; partIndex < segmentParts.length - 1; partIndex += 1) {
296685
+ if (/^\{[^}]+\}$/.test(segmentParts[partIndex]) && /^\{[^}]+\}$/.test(segmentParts[partIndex + 1])) extractable = false;
296686
+ }
296687
+ if (!extractable) {
296688
+ warnings.push(`CONTRACT_PATH_PARAM_COMPOUND_SEGMENT_NOT_VALIDATED: path parameter ${name} of ${operationId} is in an ambiguous adjacent-parameter path segment and is not schema-validated`);
296689
+ continue;
296690
+ }
296691
+ }
296682
296692
  }
296683
296693
  const scalarSchema = packedScalarSchema(packed);
296684
296694
  if (scalarSchema !== void 0) {
@@ -297398,7 +297408,7 @@ function createContractScript(operation, warnings = []) {
297398
297408
  ' function requestPathSegments() { var raw = ""; try { raw = typeof pm.request.url.getPath === "function" ? String(pm.request.url.getPath() || "") : ""; } catch (ignored) {} if (!raw) { var path = pm.request.url.path; raw = Array.isArray(path) ? "/" + path.join("/") : String(path || ""); } return raw.split("?")[0].split("#")[0].split("/").filter(function (segment) { return segment.length > 0; }); }',
297399
297409
  // Server path prefixes sit ahead of the template segments, so the
297400
297410
  // template aligns against the trailing request segments.
297401
- ' function pathParamValue(name) { var template = String(contract.path).split("/").filter(function (segment) { return segment.length > 0; }); var actual = requestPathSegments(); var offset = actual.length - template.length; if (offset < 0) return undefined; for (var i = 0; i < template.length; i += 1) { if (template[i] === "{" + name + "}") { var segment = actual[offset + i]; try { return decodeURIComponent(segment); } catch (ignored) { return segment; } } } return undefined; }',
297411
+ ' function pathParamValue(name) { var template = String(contract.path).split("/").filter(function (segment) { return segment.length > 0; }); var actual = requestPathSegments(); var offset = actual.length - template.length; if (offset < 0) return undefined; var token = "{" + name + "}"; for (var i = 0; i < template.length; i += 1) { var seg = template[i]; var actualSeg = actual[offset + i]; if (actualSeg === undefined) continue; if (seg === token) { try { return decodeURIComponent(actualSeg); } catch (ignored) { return actualSeg; } } if (seg.indexOf(token) === -1) continue; var chunks = [], j = 0, bad = false; while (j < seg.length) { if (seg.charAt(j) === "{") { var close = seg.indexOf("}", j); if (close === -1) { bad = true; break; } chunks.push({ p: seg.slice(j + 1, close) }); j = close + 1; } else { var nb = seg.indexOf("{", j); var lit = nb === -1 ? seg.slice(j) : seg.slice(j, nb); chunks.push({ l: lit }); j = nb === -1 ? seg.length : nb; } } if (bad) return undefined; var pos = 0, found, ok = true; for (var c = 0; c < chunks.length; c += 1) { var ch = chunks[c]; if (ch.l !== undefined) { if (actualSeg.indexOf(ch.l, pos) === pos) pos += ch.l.length; else { ok = false; break; } } else { var nextLit = (chunks[c + 1] && chunks[c + 1].l !== undefined) ? chunks[c + 1].l : undefined; var isLast = c === chunks.length - 1; var end; if (isLast) { end = actualSeg.length; } else if (nextLit === undefined) { ok = false; break; } else { var idx = actualSeg.indexOf(nextLit, pos + 1); if (idx === -1) { ok = false; break; } end = idx; } if (end <= pos) { ok = false; break; } if (ch.p === name) found = actualSeg.slice(pos, end); pos = end; } } if (ok && pos === actualSeg.length && found !== undefined) { try { return decodeURIComponent(found); } catch (ignored) { return found; } } } return undefined; }',
297402
297412
  ' function isPlaceholder(value) { var text = String(value).trim(); return /^<[^<>]*>$/.test(text) || text.indexOf("{{") !== -1; }',
297403
297413
  ' function splitDelimited(value, decode) { if (decode === "csv") return value.split(","); if (decode === "ssv") return value.split(/%20| /); return value.split(/%7C|\\|/i); }',
297404
297414
  " function decodeComponent(value) { try { return decodeURIComponent(value); } catch (ignored) { return value; } }",
@@ -299355,7 +299365,7 @@ function resolveActionVersion(explicit) {
299355
299365
  if (explicit) {
299356
299366
  return explicit;
299357
299367
  }
299358
- return "2.1.0" ? "2.1.0" : "unknown";
299368
+ return "2.1.1" ? "2.1.1" : "unknown";
299359
299369
  }
299360
299370
  function telemetryDisabled(env) {
299361
299371
  const flag = String(env.POSTMAN_ACTIONS_TELEMETRY ?? "").trim().toLowerCase();
@@ -311939,27 +311949,28 @@ function classifyNamedType(named) {
311939
311949
  function describeType(type) {
311940
311950
  let current = type;
311941
311951
  let nonNull = false;
311942
- let list = false;
311943
- let listItemNonNull = false;
311944
311952
  if ((0, import_graphql.isNonNullType)(current)) {
311945
311953
  nonNull = true;
311946
311954
  current = current.ofType;
311947
311955
  }
311948
- if ((0, import_graphql.isListType)(current)) {
311949
- list = true;
311956
+ const lists = [];
311957
+ while ((0, import_graphql.isListType)(current)) {
311950
311958
  current = current.ofType;
311959
+ let itemNonNull = false;
311951
311960
  if ((0, import_graphql.isNonNullType)(current)) {
311952
- listItemNonNull = true;
311961
+ itemNonNull = true;
311953
311962
  current = current.ofType;
311954
311963
  }
311964
+ lists.push({ itemNonNull });
311955
311965
  }
311956
311966
  const named = (0, import_graphql.getNamedType)(current);
311957
311967
  return {
311958
311968
  name: named.name,
311959
311969
  kind: classifyNamedType(named),
311960
311970
  nonNull,
311961
- list,
311962
- listItemNonNull
311971
+ list: lists.length > 0,
311972
+ listItemNonNull: lists.length > 0 ? lists[0].itemNonNull : false,
311973
+ lists
311963
311974
  };
311964
311975
  }
311965
311976
  function describeArgument(arg) {
@@ -311996,7 +312007,7 @@ function collectRootOperations(rootType, kind, schema, shapes) {
311996
312007
  }
311997
312008
  if (returns.kind === "union") {
311998
312009
  opWarnings.push(
311999
- `GQL_UNION_RETURN_NOT_SHAPE_ASSERTED: ${kind}.${fieldName} returns union ${returns.name}; only data.${fieldName} presence is asserted, not member-type fields`
312010
+ `GQL_UNION_MEMBER_FIELDS_NOT_EXPANDED: ${kind}.${fieldName} returns union ${returns.name}; its __typename is validated (object + declared member name) but member-specific fields are not expanded or asserted`
312000
312011
  );
312001
312012
  }
312002
312013
  if (returns.kind === "unknown") {
@@ -312060,9 +312071,12 @@ function parseGraphQLSchema(content, opts = {}) {
312060
312071
  }
312061
312072
  for (const operation of operations) warnings.push(...operation.warnings);
312062
312073
  const enumValues = {};
312074
+ const unionMembers = {};
312063
312075
  for (const namedType of Object.values(schema.getTypeMap())) {
312064
312076
  if ((0, import_graphql.isEnumType)(namedType)) {
312065
312077
  enumValues[namedType.name] = namedType.getValues().map((value) => value.name);
312078
+ } else if ((0, import_graphql.isUnionType)(namedType)) {
312079
+ unionMembers[namedType.name] = namedType.getTypes().map((member) => member.name).sort((x, y) => x.localeCompare(y));
312066
312080
  }
312067
312081
  }
312068
312082
  return {
@@ -312070,6 +312084,7 @@ function parseGraphQLSchema(content, opts = {}) {
312070
312084
  operations,
312071
312085
  objectShapes,
312072
312086
  enumValues,
312087
+ unionMembers,
312073
312088
  warnings
312074
312089
  };
312075
312090
  }
@@ -312077,6 +312092,7 @@ function parseGraphQLSchema(content, opts = {}) {
312077
312092
  // src/lib/protocols/graphql/selection.ts
312078
312093
  var SELECTION_DEPTH = 1;
312079
312094
  function selectFields(typeRef, index, depth) {
312095
+ if (typeRef.kind === "union") return [];
312080
312096
  if (typeRef.kind !== "object" && typeRef.kind !== "interface") return null;
312081
312097
  const shape = index.objectShapes[typeRef.name];
312082
312098
  if (!shape) return [];
@@ -312110,8 +312126,8 @@ var DEFAULT_URL = "{{baseUrl}}/graphql";
312110
312126
  function argTypeSdl(arg) {
312111
312127
  const ref = arg.type;
312112
312128
  let inner = ref.name;
312113
- if (ref.list) {
312114
- inner = ref.listItemNonNull ? `[${ref.name}!]` : `[${ref.name}]`;
312129
+ for (let i = ref.lists.length - 1; i >= 0; i -= 1) {
312130
+ inner = ref.lists[i].itemNonNull ? `[${inner}!]` : `[${inner}]`;
312115
312131
  }
312116
312132
  return ref.nonNull ? `${inner}!` : inner;
312117
312133
  }
@@ -312280,12 +312296,25 @@ function buildShapeAssertions(operation, index, warnings) {
312280
312296
  return emitValueAssertions("value", operation.returns, selection, operation.id, index, warnings);
312281
312297
  }
312282
312298
  function emitValueAssertions(accessor, ref, selection, ctx, index, warnings) {
312283
- if (ref.list) {
312284
- const elementRef = { ...ref, list: false };
312285
- const elementLines = emitValueAssertions("__el", elementRef, selection, `${ctx} (list element)`, index, warnings);
312299
+ if (ref.lists.length > 0) {
312300
+ const [outer, ...rest] = ref.lists;
312301
+ const innerRef = {
312302
+ ...ref,
312303
+ lists: rest,
312304
+ list: rest.length > 0,
312305
+ listItemNonNull: rest.length > 0 ? rest[0].itemNonNull : false
312306
+ };
312307
+ const elementLines = emitValueAssertions("__el", innerRef, selection, `${ctx} (list element)`, index, warnings);
312286
312308
  const lines = [`pm.expect(${accessor}, ${JSON.stringify(`${ctx}: expected a list`)}).to.be.an("array");`];
312287
- if (elementLines.length > 0) {
312288
- lines.push(`${accessor}.forEach(function (__el) {`, ...elementLines.map((line) => ` ${line}`), "});");
312309
+ const body = [];
312310
+ if (outer.itemNonNull) {
312311
+ body.push(`pm.expect(__el, ${JSON.stringify(`${ctx} (list element): a non-null list item ([T!]) was null`)}).to.not.be.null;`);
312312
+ body.push(...elementLines);
312313
+ } else if (elementLines.length > 0) {
312314
+ body.push("if (__el === null || __el === undefined) return;", ...elementLines);
312315
+ }
312316
+ if (body.length > 0) {
312317
+ lines.push(`${accessor}.forEach(function (__el) {`, ...body.map((line) => ` ${line}`), "});");
312289
312318
  }
312290
312319
  return lines;
312291
312320
  }
@@ -312303,8 +312332,22 @@ function emitValueAssertions(accessor, ref, selection, ctx, index, warnings) {
312303
312332
  return lines;
312304
312333
  }
312305
312334
  if (ref.kind === "union") {
312306
- warnings.push(`GQL_UNION_RETURN_NOT_SHAPE_ASSERTED: ${ctx} returns union ${ref.name}; only presence is asserted`);
312307
- return [];
312335
+ const members = index.unionMembers[ref.name];
312336
+ const objMsg = JSON.stringify(ctx + ": expected union " + ref.name + " value as an object");
312337
+ const presentMsg = JSON.stringify(ctx + ": union " + ref.name + " value must carry __typename");
312338
+ const stringMsg = JSON.stringify(ctx + ": union " + ref.name + " __typename must be a string");
312339
+ const lines = [
312340
+ "pm.expect(" + accessor + ", " + objMsg + ').to.be.an("object");',
312341
+ "pm.expect(" + accessor + ", " + presentMsg + ').to.have.property("__typename");',
312342
+ "pm.expect(" + accessor + " && " + accessor + ".__typename, " + stringMsg + ').to.be.a("string");'
312343
+ ];
312344
+ if (members && members.length > 0) {
312345
+ const memberMsg = JSON.stringify(ctx + ": __typename is not a declared member of union " + ref.name);
312346
+ lines.push("pm.expect(" + accessor + " && " + accessor + ".__typename, " + memberMsg + ").to.be.oneOf(" + JSON.stringify(members) + ");");
312347
+ } else {
312348
+ warnings.push("GQL_UNION_MEMBERS_UNKNOWN: " + ctx + " union " + ref.name + " member set was not resolved; only object + string __typename is asserted");
312349
+ }
312350
+ return lines;
312308
312351
  }
312309
312352
  warnings.push(`GQL_UNKNOWN_RETURN_TYPE: ${ctx} return type ${ref.name} could not be classified; only presence is asserted`);
312310
312353
  return [];
@@ -312315,6 +312358,7 @@ function emitFieldAssertions(objectAccessor, parentTypeName, field, ctx, index,
312315
312358
  const lines = [];
312316
312359
  if (field.type.nonNull) {
312317
312360
  lines.push(`pm.expect(${objectAccessor}, ${JSON.stringify(`${parentTypeName} is missing non-null field '${field.name}'`)}).to.have.property(${propName});`);
312361
+ lines.push(`pm.expect(${prop}, ${JSON.stringify(`${parentTypeName}.${field.name} is declared non-null but was null`)}).to.not.be.null;`);
312318
312362
  }
312319
312363
  const valueLines = emitValueAssertions(prop, field.type, field.selection, `${ctx}.${field.name}`, index, warnings);
312320
312364
  if (valueLines.length > 0) {
@@ -312420,19 +312464,25 @@ function asArray6(value) {
312420
312464
  }
312421
312465
  var SCALAR_JSON_TYPE = {
312422
312466
  double: { jsonType: "double" },
312423
- float: { jsonType: "double" },
312424
- int32: { jsonType: "number" },
312425
- sint32: { jsonType: "number" },
312426
- sfixed32: { jsonType: "number" },
312427
- fixed32: { jsonType: "number" },
312428
- uint32: { jsonType: "number" },
312429
- // 64-bit integers are JSON-encoded as strings by the proto JSON mapping and
312430
- // by protobufjs default toObject, so we assert `string`.
312431
- int64: { jsonType: "string" },
312432
- uint64: { jsonType: "string" },
312433
- sint64: { jsonType: "string" },
312434
- fixed64: { jsonType: "string" },
312435
- sfixed64: { jsonType: "string" },
312467
+ // proto float is float32; carry a format so the runtime enforces float32 range
312468
+ // (a finite double like 3.5e38 overflows float32 and must fail).
312469
+ float: { jsonType: "double", jsonFormat: "proto-float32" },
312470
+ // 32-bit integers JSON-encode as numbers; `intType` carries the exact protobuf
312471
+ // integer domain so the runtime range/sign-checks it (not just integrality).
312472
+ int32: { jsonType: "number", intType: "int32" },
312473
+ sint32: { jsonType: "number", intType: "sint32" },
312474
+ sfixed32: { jsonType: "number", intType: "sfixed32" },
312475
+ fixed32: { jsonType: "number", intType: "fixed32" },
312476
+ uint32: { jsonType: "number", intType: "uint32" },
312477
+ // 64-bit integers are JSON-encoded as strings by the proto JSON mapping and by
312478
+ // protobufjs default toObject; `intType` carries the exact domain so the runtime
312479
+ // lexically validates and RANGE-checks the string (string comparison avoids JS
312480
+ // double precision loss beyond 2^53).
312481
+ int64: { jsonType: "string", intType: "int64" },
312482
+ uint64: { jsonType: "string", intType: "uint64" },
312483
+ sint64: { jsonType: "string", intType: "sint64" },
312484
+ fixed64: { jsonType: "string", intType: "fixed64" },
312485
+ sfixed64: { jsonType: "string", intType: "sfixed64" },
312436
312486
  bool: { jsonType: "boolean" },
312437
312487
  string: { jsonType: "string" },
312438
312488
  // bytes are base64 strings in proto JSON.
@@ -312443,11 +312493,11 @@ var WELL_KNOWN_JSON_TYPE = {
312443
312493
  "google.protobuf.Duration": { jsonType: "string", jsonFormat: "proto-duration" },
312444
312494
  "google.protobuf.FieldMask": { jsonType: "string", jsonFormat: "proto-field-mask" },
312445
312495
  "google.protobuf.DoubleValue": { jsonType: "double", nullable: true },
312446
- "google.protobuf.FloatValue": { jsonType: "double", nullable: true },
312447
- "google.protobuf.Int32Value": { jsonType: "number", nullable: true },
312448
- "google.protobuf.UInt32Value": { jsonType: "number", nullable: true },
312449
- "google.protobuf.Int64Value": { jsonType: "string", nullable: true },
312450
- "google.protobuf.UInt64Value": { jsonType: "string", nullable: true },
312496
+ "google.protobuf.FloatValue": { jsonType: "double", jsonFormat: "proto-float32", nullable: true },
312497
+ "google.protobuf.Int32Value": { jsonType: "number", intType: "int32", nullable: true },
312498
+ "google.protobuf.UInt32Value": { jsonType: "number", intType: "uint32", nullable: true },
312499
+ "google.protobuf.Int64Value": { jsonType: "string", intType: "int64", nullable: true },
312500
+ "google.protobuf.UInt64Value": { jsonType: "string", intType: "uint64", nullable: true },
312451
312501
  "google.protobuf.BoolValue": { jsonType: "boolean", nullable: true },
312452
312502
  "google.protobuf.StringValue": { jsonType: "string", nullable: true },
312453
312503
  "google.protobuf.BytesValue": { jsonType: "string", jsonFormat: "proto-bytes", nullable: true },
@@ -312494,7 +312544,7 @@ function stripLeadingDot(name) {
312494
312544
  }
312495
312545
  function classifyValueType(protoType, resolved) {
312496
312546
  const wkt = WELL_KNOWN_JSON_TYPE[stripLeadingDot(protoType)];
312497
- if (wkt) return { jsonType: wkt.jsonType, jsonFormat: wkt.jsonFormat, nullable: wkt.nullable };
312547
+ if (wkt) return { jsonType: wkt.jsonType, jsonFormat: wkt.jsonFormat, nullable: wkt.nullable, intType: wkt.intType };
312498
312548
  if (resolved && Array.isArray(resolved.fieldsArray)) {
312499
312549
  return { jsonType: "object", messageType: stripLeadingDot(resolved.fullName) };
312500
312550
  }
@@ -312502,9 +312552,14 @@ function classifyValueType(protoType, resolved) {
312502
312552
  return { jsonType: "enum", enumType: stripLeadingDot(resolved.fullName) };
312503
312553
  }
312504
312554
  const scalar = SCALAR_JSON_TYPE[protoType];
312505
- if (scalar) return { jsonType: scalar.jsonType, jsonFormat: scalar.jsonFormat };
312555
+ if (scalar) return { jsonType: scalar.jsonType, jsonFormat: scalar.jsonFormat, intType: scalar.intType };
312506
312556
  return { jsonType: "unknown" };
312507
312557
  }
312558
+ function classifyMapKey(keyType) {
312559
+ if (keyType === "bool") return "boolean";
312560
+ if (keyType && /^(?:u?int|sint|s?fixed)(?:32|64)$/.test(keyType)) return keyType;
312561
+ return void 0;
312562
+ }
312508
312563
  function toLowerCamelCase(name) {
312509
312564
  return name.replace(/_+([a-zA-Z0-9])/g, (_match, char) => char.toUpperCase()).replace(/_+$/g, "");
312510
312565
  }
@@ -312533,6 +312588,7 @@ function fieldDescriptor(field, warnings, context) {
312533
312588
  if (value.jsonType === "unknown") {
312534
312589
  warnings.push(`PROTO_FIELD_TYPE_UNRESOLVED: map field ${context}.${field.name} has value type ${protoType} that could not be resolved; map values are not asserted`);
312535
312590
  }
312591
+ const mapKeyType = classifyMapKey(field.keyType);
312536
312592
  return {
312537
312593
  name: String(field.name),
312538
312594
  jsonName: protoJsonName(field),
@@ -312542,8 +312598,10 @@ function fieldDescriptor(field, warnings, context) {
312542
312598
  map: true,
312543
312599
  optional: Boolean(field.optional),
312544
312600
  required: Boolean(field.required),
312601
+ ...mapKeyType ? { mapKeyType } : {},
312545
312602
  ...value.jsonType !== "unknown" ? { mapValueType: value.jsonType } : {},
312546
312603
  ...value.jsonFormat ? { mapValueFormat: value.jsonFormat } : {},
312604
+ ...value.intType ? { mapValueIntType: value.intType } : {},
312547
312605
  ...value.enumType ? { mapValueEnumType: value.enumType } : {},
312548
312606
  ...value.messageType ? { mapValueMessageType: value.messageType } : {}
312549
312607
  };
@@ -312563,6 +312621,7 @@ function fieldDescriptor(field, warnings, context) {
312563
312621
  optional: Boolean(field.optional),
312564
312622
  required: Boolean(field.required),
312565
312623
  ...classified.nullable ? { nullable: true } : {},
312624
+ ...classified.intType ? { intType: classified.intType } : {},
312566
312625
  ...classified.messageType ? { messageType: classified.messageType } : {},
312567
312626
  ...classified.enumType ? { enumType: classified.enumType } : {}
312568
312627
  };
@@ -312798,13 +312857,16 @@ function buildShape(messageFullName, index, warnings, operationId, label, depth,
312798
312857
  jsonName: field.jsonName,
312799
312858
  jsonType: field.jsonType,
312800
312859
  ...field.jsonFormat ? { jsonFormat: field.jsonFormat } : {},
312860
+ ...field.intType ? { intType: field.intType } : {},
312801
312861
  repeated: field.repeated,
312802
312862
  map: field.map,
312803
312863
  required: field.required,
312804
312864
  ...field.nullable ? { nullable: true } : {},
312805
312865
  ...enumValues ? { enumValues } : {},
312866
+ ...field.mapKeyType ? { mapKeyType: field.mapKeyType } : {},
312806
312867
  ...field.mapValueType ? { mapValueType: field.mapValueType } : {},
312807
312868
  ...field.mapValueFormat ? { mapValueFormat: field.mapValueFormat } : {},
312869
+ ...field.mapValueIntType ? { mapValueIntType: field.mapValueIntType } : {},
312808
312870
  ...mapValueEnumValues ? { mapValueEnumValues } : {}
312809
312871
  };
312810
312872
  if (field.messageType && field.jsonType === "object" && !field.map) {
@@ -312871,18 +312933,38 @@ function createGrpcScript(spec) {
312871
312933
  ' if (expected === "any") return true;',
312872
312934
  " return true;",
312873
312935
  "}",
312936
+ 'var GRPC_INT_SPECS = { int32:{s:true,b:32,min:"-2147483648",max:"2147483647"}, sint32:{s:true,b:32,min:"-2147483648",max:"2147483647"}, sfixed32:{s:true,b:32,min:"-2147483648",max:"2147483647"}, uint32:{s:false,b:32,min:"0",max:"4294967295"}, fixed32:{s:false,b:32,min:"0",max:"4294967295"}, int64:{s:true,b:64,min:"-9223372036854775808",max:"9223372036854775807"}, sint64:{s:true,b:64,min:"-9223372036854775808",max:"9223372036854775807"}, sfixed64:{s:true,b:64,min:"-9223372036854775808",max:"9223372036854775807"}, uint64:{s:false,b:64,min:"0",max:"18446744073709551615"}, fixed64:{s:false,b:64,min:"0",max:"18446744073709551615"} };',
312937
+ 'function grpcDecStr(n) { var s = String(n); return (s.indexOf("e") === -1 && s.indexOf("E") === -1 && s.indexOf(".") === -1) ? s : null; }',
312938
+ 'function grpcCmpIntStr(a, b) { var na = a.charAt(0) === "-", nb = b.charAt(0) === "-"; if (na !== nb) return na ? -1 : 1; var aa = (na ? a.slice(1) : a).replace(/^0+(?=[0-9])/, ""); var bb = (nb ? b.slice(1) : b).replace(/^0+(?=[0-9])/, ""); var mag; if (aa.length !== bb.length) mag = aa.length < bb.length ? -1 : 1; else mag = aa < bb ? -1 : (aa > bb ? 1 : 0); return na ? -mag : mag; }',
312939
+ 'function grpcNormIntStr(s) { var neg = false; if (s.charAt(0) === "-") { neg = true; s = s.slice(1); } else if (s.charAt(0) === "+") { s = s.slice(1); } var ei = s.indexOf("e"); if (ei === -1) ei = s.indexOf("E"); var exp = 0; if (ei !== -1) { exp = parseInt(s.slice(ei + 1), 10); s = s.slice(0, ei); } var dot = s.indexOf("."); var intp = dot === -1 ? s : s.slice(0, dot); var frac = dot === -1 ? "" : s.slice(dot + 1); var digits = intp + frac; if (digits.length === 0) return null; if (/^0+$/.test(digits)) return "0"; if (exp >= 0) { var intpSize = intp === "0" ? 0 : intp.length; if (intpSize + exp > 20) return null; } var netExp = exp - frac.length; var out; if (netExp >= 0) { if (digits.length + netExp > 40) return null; out = digits; for (var z = 0; z < netExp; z++) out += "0"; } else { var cut = -netExp; var keepLen = digits.length - cut; var dropped = keepLen <= 0 ? digits : digits.slice(keepLen); for (var d = 0; d < dropped.length; d++) { if (dropped.charAt(d) !== "0") return null; } out = keepLen <= 0 ? "0" : digits.slice(0, keepLen); } var st = 0; while (st < out.length - 1 && out.charAt(st) === "0") st++; out = out.slice(st); if (out === "0") return "0"; if (out.length > 40) return null; return neg ? "-" + out : out; }',
312940
+ "function matchesInt(intType, value) {",
312941
+ " var spec = GRPC_INT_SPECS[intType]; if (!spec) return true;",
312942
+ " var num, canonical;",
312943
+ ' if (typeof value === "number") { if (!Number.isFinite(value) || !Number.isInteger(value)) return false; num = value; canonical = grpcDecStr(value); }',
312944
+ ' else if (typeof value === "string") { if (!/^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$/.test(value)) return false; canonical = grpcNormIntStr(value); if (canonical === null) return false; num = Number(value); }',
312945
+ " else { return false; }",
312946
+ ' if (canonical === "-0") canonical = "0";',
312947
+ ' if (!spec.s && ((canonical !== null && canonical.charAt(0) === "-") || num < 0)) return false;',
312948
+ " if (spec.b === 32) return num >= Number(spec.min) && num <= Number(spec.max);",
312949
+ " if (canonical !== null) return grpcCmpIntStr(canonical, spec.min) >= 0 && grpcCmpIntStr(canonical, spec.max) <= 0;",
312950
+ " return false;",
312951
+ "}",
312952
+ 'function matchesIntKey(intType, key) { var spec = GRPC_INT_SPECS[intType]; if (!spec) return true; if (!(spec.s ? /^[+-]?[0-9]+$/ : /^[0-9]+$/).test(key)) return false; var neg = key.charAt(0) === "-"; var body = (key.charAt(0) === "+" || key.charAt(0) === "-") ? key.slice(1) : key; if (body.length === 0) return false; var canon = neg ? "-" + body : body; return grpcCmpIntStr(canon, spec.min) >= 0 && grpcCmpIntStr(canon, spec.max) <= 0; }',
312953
+ "function matchesEnumNumber(n) { return Number.isInteger(n) && n >= -2147483648 && n <= 2147483647; }",
312874
312954
  "function daysFromCivil(y, m, d) { y -= m <= 2 ? 1 : 0; var era = Math.floor(y / 400); var yoe = y - era * 400; var mp = m + (m > 2 ? -3 : 9); var doy = Math.floor((153 * mp + 2) / 5) + d - 1; var doe = yoe * 365 + Math.floor(yoe / 4) - Math.floor(yoe / 100) + doy; return era * 146097 + doe - 719468; }",
312875
312955
  "function validDate(y, m, d) { if (y < 1 || y > 9999 || m < 1 || m > 12 || d < 1) return false; var mdays = [31, ((y % 4 === 0 && y % 100 !== 0) || y % 400 === 0) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; return d <= mdays[m - 1]; }",
312876
312956
  'function validProtoTimestamp(value) { if (typeof value !== "string") return false; var m = value.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:\\.([0-9]{1,9}))?(Z|[+-][0-9]{2}:[0-9]{2})$/); if (!m) return false; var y = Number(m[1]), mo = Number(m[2]), d = Number(m[3]), h = Number(m[4]), mi = Number(m[5]), s = Number(m[6]); if (!validDate(y, mo, d) || h > 23 || mi > 59 || s > 59) return false; var off = 0; if (m[8] !== "Z") { var sign = m[8][0] === "-" ? -1 : 1; var oh = Number(m[8].slice(1, 3)), om = Number(m[8].slice(4, 6)); if (oh > 23 || om > 59) return false; off = sign * (oh * 3600 + om * 60); } var sec = daysFromCivil(y, mo, d) * 86400 + h * 3600 + mi * 60 + s - off; return sec >= -62135596800 && sec <= 253402300799; }',
312877
312957
  'function validProtoDuration(value) { if (typeof value !== "string") return false; var m = value.match(/^[+-]?(?:(0|[1-9][0-9]*)(?:\\.[0-9]{0,9})?|\\.[0-9]{0,9})s$/); if (!m) return false; return !m[1] || Number(m[1]) <= 315576000000; }',
312878
312958
  'function validProtoFieldMask(value) { if (typeof value !== "string") return false; if (value === "") return true; var paths = value.split(","); for (var i = 0; i < paths.length; i++) { if (!/^[a-z][A-Za-z0-9]*(\\.[a-z][A-Za-z0-9]*)*$/.test(paths[i])) return false; } return true; }',
312879
312959
  'function validProtoBytes(value) { if (typeof value !== "string") return false; if (!/^(?:[A-Za-z0-9+/]*|[A-Za-z0-9_-]*)={0,2}$/.test(value)) return false; var firstPad = value.indexOf("="); if (firstPad !== -1 && firstPad < value.length - (value.endsWith("==") ? 2 : 1)) return false; var pad = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0; var raw = value.length - pad; if (raw % 4 === 1) return false; return pad === 0 || (raw + pad) % 4 === 0 && pad === (4 - raw % 4) % 4; }',
312960
+ 'function validProtoFloat32(value) { if (value === "NaN" || value === "Infinity" || value === "-Infinity") return true; var n = typeof value === "number" ? value : Number(value); if (!Number.isFinite(n)) return false; return Number.isFinite(Math.fround(n)); }',
312880
312961
  "function matchesFormat(format, value) {",
312881
312962
  " if (!format) return true;",
312882
312963
  ' if (format === "proto-timestamp") return validProtoTimestamp(value);',
312883
312964
  ' if (format === "proto-duration") return validProtoDuration(value);',
312884
312965
  ' if (format === "proto-field-mask") return validProtoFieldMask(value);',
312885
312966
  ' if (format === "proto-bytes") return validProtoBytes(value);',
312967
+ ' if (format === "proto-float32") return validProtoFloat32(value);',
312886
312968
  " return true;",
312887
312969
  "}",
312888
312970
  "function formatLabel(format) {",
@@ -312890,6 +312972,7 @@ function createGrpcScript(spec) {
312890
312972
  ' if (format === "proto-duration") return "a valid ProtoJSON Duration";',
312891
312973
  ' if (format === "proto-field-mask") return "a valid ProtoJSON FieldMask";',
312892
312974
  ' if (format === "proto-bytes") return "valid ProtoJSON base64 bytes";',
312975
+ ' if (format === "proto-float32") return "a float32-representable number";',
312893
312976
  ' return format || "valid ProtoJSON";',
312894
312977
  "}",
312895
312978
  // Recursive shape checker: validates fields (with nested message descent,
@@ -312903,14 +312986,15 @@ function createGrpcScript(spec) {
312903
312986
  ' if (field.required && !present) { pm.expect.fail("gRPC response is missing required field " + label); return; }',
312904
312987
  " if (!present) return;",
312905
312988
  " var value = obj[key];",
312906
- " if (field.nullable && value === null) return;",
312989
+ " if (value === null) return;",
312907
312990
  " if (field.repeated) {",
312908
312991
  ' if (!matchesScalar("array", value)) { pm.expect.fail("gRPC field " + label + " must be a repeated (array) value but was " + jsonTypeOf(value)); return; }',
312909
312992
  " for (var i = 0; i < value.length; i++) {",
312910
312993
  ' var elem = value[i]; var elemLabel = label + "[" + i + "]";',
312911
312994
  ' if (field.shape) { if (!matchesScalar("object", elem)) { pm.expect.fail("gRPC repeated field " + elemLabel + " must be an object but was " + jsonTypeOf(elem)); } else { grpcCheckShape(elem, field.shape, elemLabel + "."); } continue; }',
312912
- ' if (field.enumValues && field.enumValues.length > 0) { if (typeof elem === "number") { if (!Number.isInteger(elem)) pm.expect.fail("gRPC repeated enum field " + elemLabel + " must be an integer but was " + elem); continue; } if (typeof elem !== "string") { pm.expect.fail("gRPC repeated enum field " + elemLabel + " must be a string or number but was " + jsonTypeOf(elem)); } else if (field.enumValues.indexOf(elem) === -1) { pm.expect.fail("gRPC repeated enum field " + elemLabel + " has value " + elem + " not in [" + field.enumValues.join(", ") + "]"); } continue; }',
312995
+ ' if (field.enumValues && field.enumValues.length > 0) { if (typeof elem === "number") { if (!matchesEnumNumber(elem)) pm.expect.fail("gRPC repeated enum field " + elemLabel + " must be an int32-range integer but was " + elem); continue; } if (typeof elem !== "string") { pm.expect.fail("gRPC repeated enum field " + elemLabel + " must be a string or number but was " + jsonTypeOf(elem)); } else if (field.enumValues.indexOf(elem) === -1) { pm.expect.fail("gRPC repeated enum field " + elemLabel + " has value " + elem + " not in [" + field.enumValues.join(", ") + "]"); } continue; }',
312913
312996
  ' if (field.jsonType === "any") continue;',
312997
+ ' if (field.intType) { if (!matchesInt(field.intType, elem)) pm.expect.fail("gRPC repeated field " + elemLabel + " must be a valid " + field.intType + " (in range) but was " + JSON.stringify(elem)); continue; }',
312914
312998
  ' if (!matchesScalar(field.jsonType, elem)) pm.expect.fail("gRPC repeated field " + elemLabel + " must be " + field.jsonType + " but was " + jsonTypeOf(elem));',
312915
312999
  ' else if (!matchesFormat(field.jsonFormat, elem)) pm.expect.fail("gRPC repeated field " + elemLabel + " must be " + formatLabel(field.jsonFormat));',
312916
313000
  " }",
@@ -312918,17 +313002,28 @@ function createGrpcScript(spec) {
312918
313002
  " }",
312919
313003
  " if (field.map) {",
312920
313004
  ' if (!matchesScalar("object", value)) { pm.expect.fail("gRPC map field " + label + " must be an object but was " + jsonTypeOf(value)); return; }',
312921
- ' if (field.mapValueType) { var keys = Object.keys(value); for (var k = 0; k < keys.length; k++) { var mv = value[keys[k]], mvLabel = label + "[" + keys[k] + "]"; if (field.mapValueShape && matchesScalar("object", mv)) { grpcCheckShape(mv, field.mapValueShape, mvLabel + "."); } else if (field.mapValueEnumValues && field.mapValueEnumValues.length > 0) { if (typeof mv === "number") { if (!Number.isInteger(mv)) pm.expect.fail("gRPC map enum value " + mvLabel + " must be an integer but was " + mv); } else if (typeof mv !== "string") { pm.expect.fail("gRPC map enum value " + mvLabel + " must be a string or number but was " + jsonTypeOf(mv)); } else if (field.mapValueEnumValues.indexOf(mv) === -1) { pm.expect.fail("gRPC map enum value " + mvLabel + " has value " + mv + " not in [" + field.mapValueEnumValues.join(", ") + "]"); } } else if (!matchesScalar(field.mapValueType, mv)) { pm.expect.fail("gRPC map value " + mvLabel + " must be " + field.mapValueType + " but was " + jsonTypeOf(mv)); } else if (!matchesFormat(field.mapValueFormat, mv)) { pm.expect.fail("gRPC map value " + mvLabel + " must be " + formatLabel(field.mapValueFormat)); } } }',
313005
+ " var keys = Object.keys(value);",
313006
+ " for (var k = 0; k < keys.length; k++) {",
313007
+ ' var mk = keys[k], mv = value[mk], mvLabel = label + "[" + mk + "]";',
313008
+ ' if (field.mapKeyType === "boolean") { if (mk !== "true" && mk !== "false") pm.expect.fail("gRPC map key " + mvLabel + " must be the string true or false but was " + mk); }',
313009
+ ' else if (field.mapKeyType) { if (!matchesIntKey(field.mapKeyType, mk)) pm.expect.fail("gRPC map key " + mvLabel + " must be a valid " + field.mapKeyType + " string (in range) but was " + mk); }',
313010
+ ' if (field.mapValueShape && matchesScalar("object", mv)) { grpcCheckShape(mv, field.mapValueShape, mvLabel + "."); }',
313011
+ ' else if (field.mapValueIntType) { if (!matchesInt(field.mapValueIntType, mv)) pm.expect.fail("gRPC map value " + mvLabel + " must be a valid " + field.mapValueIntType + " (in range) but was " + JSON.stringify(mv)); }',
313012
+ ' else if (field.mapValueEnumValues && field.mapValueEnumValues.length > 0) { if (typeof mv === "number") { if (!matchesEnumNumber(mv)) pm.expect.fail("gRPC map enum value " + mvLabel + " must be an int32-range integer but was " + mv); } else if (typeof mv !== "string") { pm.expect.fail("gRPC map enum value " + mvLabel + " must be a string or number but was " + jsonTypeOf(mv)); } else if (field.mapValueEnumValues.indexOf(mv) === -1) { pm.expect.fail("gRPC map enum value " + mvLabel + " has value " + mv + " not in [" + field.mapValueEnumValues.join(", ") + "]"); } }',
313013
+ ' else if (field.mapValueType && !matchesScalar(field.mapValueType, mv)) { pm.expect.fail("gRPC map value " + mvLabel + " must be " + field.mapValueType + " but was " + jsonTypeOf(mv)); }',
313014
+ ' else if (field.mapValueType && !matchesFormat(field.mapValueFormat, mv)) { pm.expect.fail("gRPC map value " + mvLabel + " must be " + formatLabel(field.mapValueFormat)); }',
313015
+ " }",
312922
313016
  " return;",
312923
313017
  " }",
312924
313018
  " if (field.enumValues && field.enumValues.length > 0) {",
312925
- ' if (typeof value === "number") { if (!Number.isInteger(value)) pm.expect.fail("gRPC enum field " + label + " must be an integer but was " + value); return; }',
313019
+ ' if (typeof value === "number") { if (!matchesEnumNumber(value)) pm.expect.fail("gRPC enum field " + label + " must be an int32-range integer but was " + value); return; }',
312926
313020
  ' if (typeof value !== "string") { pm.expect.fail("gRPC enum field " + label + " must be a string or number but was " + jsonTypeOf(value)); return; }',
312927
313021
  ' if (field.enumValues.indexOf(value) === -1) pm.expect.fail("gRPC enum field " + label + " has value " + value + " not in [" + field.enumValues.join(", ") + "]");',
312928
313022
  " return;",
312929
313023
  " }",
312930
313024
  ' if (field.jsonType === "any") return;',
312931
313025
  ' if (field.shape) { if (!matchesScalar("object", value)) { pm.expect.fail("gRPC field " + label + " must be an object but was " + jsonTypeOf(value)); return; } grpcCheckShape(value, field.shape, label + "."); return; }',
313026
+ ' if (field.intType) { if (!matchesInt(field.intType, value)) pm.expect.fail("gRPC field " + label + " must be a valid " + field.intType + " (in range) but was " + JSON.stringify(value)); return; }',
312932
313027
  ' if (!matchesScalar(field.jsonType, value)) pm.expect.fail("gRPC field " + label + " must be " + field.jsonType + " but was " + jsonTypeOf(value));',
312933
313028
  ' else if (!matchesFormat(field.jsonFormat, value)) pm.expect.fail("gRPC field " + label + " must be " + formatLabel(field.jsonFormat));',
312934
313029
  "}",
@@ -312978,6 +313073,103 @@ function methodPathOf(item) {
312978
313073
  const value = payload?.methodPath;
312979
313074
  return typeof value === "string" ? value : "";
312980
313075
  }
313076
+ var GRPC_INT_SPECS = {
313077
+ int32: { signed: true, bits: 32, min: "-2147483648", max: "2147483647" },
313078
+ sint32: { signed: true, bits: 32, min: "-2147483648", max: "2147483647" },
313079
+ sfixed32: { signed: true, bits: 32, min: "-2147483648", max: "2147483647" },
313080
+ uint32: { signed: false, bits: 32, min: "0", max: "4294967295" },
313081
+ fixed32: { signed: false, bits: 32, min: "0", max: "4294967295" },
313082
+ int64: { signed: true, bits: 64, min: "-9223372036854775808", max: "9223372036854775807" },
313083
+ sint64: { signed: true, bits: 64, min: "-9223372036854775808", max: "9223372036854775807" },
313084
+ sfixed64: { signed: true, bits: 64, min: "-9223372036854775808", max: "9223372036854775807" },
313085
+ uint64: { signed: false, bits: 64, min: "0", max: "18446744073709551615" },
313086
+ fixed64: { signed: false, bits: 64, min: "0", max: "18446744073709551615" }
313087
+ };
313088
+ function grpcDecStr(n) {
313089
+ const s = String(n);
313090
+ return s.indexOf("e") === -1 && s.indexOf("E") === -1 && s.indexOf(".") === -1 ? s : null;
313091
+ }
313092
+ function grpcCmpIntStr(a, b) {
313093
+ const na = a.charAt(0) === "-";
313094
+ const nb = b.charAt(0) === "-";
313095
+ if (na !== nb) return na ? -1 : 1;
313096
+ const aa = (na ? a.slice(1) : a).replace(/^0+(?=[0-9])/, "");
313097
+ const bb = (nb ? b.slice(1) : b).replace(/^0+(?=[0-9])/, "");
313098
+ let mag;
313099
+ if (aa.length !== bb.length) mag = aa.length < bb.length ? -1 : 1;
313100
+ else mag = aa < bb ? -1 : aa > bb ? 1 : 0;
313101
+ return na ? -mag : mag;
313102
+ }
313103
+ function grpcNormIntStr(input) {
313104
+ let s = input;
313105
+ let neg = false;
313106
+ if (s.charAt(0) === "-") {
313107
+ neg = true;
313108
+ s = s.slice(1);
313109
+ } else if (s.charAt(0) === "+") {
313110
+ s = s.slice(1);
313111
+ }
313112
+ let ei = s.indexOf("e");
313113
+ if (ei === -1) ei = s.indexOf("E");
313114
+ let exp = 0;
313115
+ if (ei !== -1) {
313116
+ exp = parseInt(s.slice(ei + 1), 10);
313117
+ s = s.slice(0, ei);
313118
+ }
313119
+ const dot = s.indexOf(".");
313120
+ const intp = dot === -1 ? s : s.slice(0, dot);
313121
+ const frac = dot === -1 ? "" : s.slice(dot + 1);
313122
+ const digits = intp + frac;
313123
+ if (digits.length === 0) return null;
313124
+ if (/^0+$/.test(digits)) return "0";
313125
+ if (exp >= 0) {
313126
+ const intpSize = intp === "0" ? 0 : intp.length;
313127
+ if (intpSize + exp > 20) return null;
313128
+ }
313129
+ const netExp = exp - frac.length;
313130
+ let out;
313131
+ if (netExp >= 0) {
313132
+ if (digits.length + netExp > 40) return null;
313133
+ out = digits + "0".repeat(netExp);
313134
+ } else {
313135
+ const cut = -netExp;
313136
+ const keepLen = digits.length - cut;
313137
+ const dropped = keepLen <= 0 ? digits : digits.slice(keepLen);
313138
+ for (let d = 0; d < dropped.length; d += 1) {
313139
+ if (dropped.charAt(d) !== "0") return null;
313140
+ }
313141
+ out = keepLen <= 0 ? "0" : digits.slice(0, keepLen);
313142
+ }
313143
+ let st = 0;
313144
+ while (st < out.length - 1 && out.charAt(st) === "0") st += 1;
313145
+ out = out.slice(st);
313146
+ if (out === "0") return "0";
313147
+ if (out.length > 40) return null;
313148
+ return neg ? `-${out}` : out;
313149
+ }
313150
+ function matchesIntValue(intType, value) {
313151
+ const spec = GRPC_INT_SPECS[intType];
313152
+ if (!spec) return true;
313153
+ let num;
313154
+ let canonical;
313155
+ if (typeof value === "number") {
313156
+ if (!Number.isFinite(value) || !Number.isInteger(value)) return false;
313157
+ num = value;
313158
+ canonical = grpcDecStr(value);
313159
+ } else if (typeof value === "string") {
313160
+ if (!/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$/.test(value)) return false;
313161
+ canonical = grpcNormIntStr(value);
313162
+ if (canonical === null) return false;
313163
+ num = Number(value);
313164
+ } else {
313165
+ return false;
313166
+ }
313167
+ if (canonical === "-0") canonical = "0";
313168
+ if (!spec.signed && (canonical !== null && canonical.charAt(0) === "-" || num < 0)) return false;
313169
+ if (spec.bits === 32) return num >= Number(spec.min) && num <= Number(spec.max);
313170
+ if (canonical !== null) return grpcCmpIntStr(canonical, spec.min) >= 0 && grpcCmpIntStr(canonical, spec.max) <= 0;
313171
+ return false;
313172
+ }
312981
313173
  function matchesScalarValue(expected, value) {
312982
313174
  const isJsonNumberString = (text) => /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$/.test(text) && Number.isFinite(Number(text));
312983
313175
  switch (expected) {
@@ -313066,6 +313258,12 @@ function validProtoBytes(value) {
313066
313258
  if (raw % 4 === 1) return false;
313067
313259
  return pad === 0 || (raw + pad) % 4 === 0 && pad === (4 - raw % 4) % 4;
313068
313260
  }
313261
+ function validProtoFloat32(value) {
313262
+ if (value === "NaN" || value === "Infinity" || value === "-Infinity") return true;
313263
+ const n = typeof value === "number" ? value : Number(value);
313264
+ if (!Number.isFinite(n)) return false;
313265
+ return Number.isFinite(Math.fround(n));
313266
+ }
313069
313267
  function matchesFormatValue(format3, value) {
313070
313268
  switch (format3) {
313071
313269
  case void 0:
@@ -313078,6 +313276,8 @@ function matchesFormatValue(format3, value) {
313078
313276
  return validProtoFieldMask(value);
313079
313277
  case "proto-bytes":
313080
313278
  return validProtoBytes(value);
313279
+ case "proto-float32":
313280
+ return validProtoFloat32(value);
313081
313281
  default:
313082
313282
  return true;
313083
313283
  }
@@ -313112,6 +313312,12 @@ function staticRequestCheck(item, shape, methodPath2, warnings) {
313112
313312
  continue;
313113
313313
  }
313114
313314
  if (field.jsonType === "any" || field.enumValues || field.map || field.shape) continue;
313315
+ if (field.intType) {
313316
+ if (!matchesIntValue(field.intType, value)) {
313317
+ warnings.push(`PROTO_REQUEST_FIELD_TYPE_MISMATCH: ${methodPath2} request field ${field.name} must be a valid ${field.intType} (in range)`);
313318
+ }
313319
+ continue;
313320
+ }
313115
313321
  if (!matchesScalarValue(field.jsonType, value)) {
313116
313322
  warnings.push(`PROTO_REQUEST_FIELD_TYPE_MISMATCH: ${methodPath2} request field ${field.name} must be ${field.jsonType}`);
313117
313323
  } else if (!matchesFormatValue(field.jsonFormat, value)) {
@@ -313121,6 +313327,7 @@ function staticRequestCheck(item, shape, methodPath2, warnings) {
313121
313327
  }
313122
313328
  function instrumentGrpcCollection(collection, index) {
313123
313329
  const warnings = [...index.warnings, ...index.operations.flatMap((operation) => operation.warnings)];
313330
+ warnings.push("GRPC_UNKNOWN_FIELDS_NOT_REJECTED: extra response JSON keys are not rejected (proto3 forward-compat + open well-known types; unknown wire fields are not surfaced by the binary->JSON decode)");
313124
313331
  const specs = /* @__PURE__ */ new Map();
313125
313332
  const requestShapes = /* @__PURE__ */ new Map();
313126
313333
  for (const operation of index.operations) {
@@ -313627,6 +313834,7 @@ function createSoapScript(operation, warnings = []) {
313627
313834
  ` pm.expect(bodyText, "expected SOAP response element <" + soap.expectedResponseElement + "> not found").to.match(new RegExp(${JSON.stringify(responseRegex)}));`,
313628
313835
  "});"
313629
313836
  );
313837
+ warnings.push(`SOAP_RESPONSE_BODY_WRAPPER_ONLY: operation ${operation.name} asserts the SOAP envelope/body/fault and the top-level response element <${operation.expectedResponseElement}> but NOT its child element/scalar shapes (WSDL/XSD payload validation is out of scope)`);
313630
313838
  } else if (operation.output) {
313631
313839
  warnings.push(`SOAP_RESPONSE_ELEMENT_UNKNOWN: operation ${operation.name} has an output message but no resolvable response element; only Envelope/Body/Fault are asserted`);
313632
313840
  }