@apify/input_schema 3.6.3 → 3.7.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/cjs/index.cjs CHANGED
@@ -53,8 +53,7 @@ var intlStrings = {
53
53
  };
54
54
  function m(stringId, variables) {
55
55
  let text = intlStrings[stringId];
56
- if (!text)
57
- return stringId;
56
+ if (!text) return stringId;
58
57
  if (variables) {
59
58
  Object.keys(variables).forEach((variableName) => {
60
59
  text = text.split(`{${variableName}}`).join(variables[variableName]);
@@ -378,17 +377,19 @@ function parseAjvError(error, rootName, properties = {}, input = {}) {
378
377
  }
379
378
  __name(parseAjvError, "parseAjvError");
380
379
  var validateAgainstSchemaOrThrow = /* @__PURE__ */ __name((validator, obj, inputSchema, rootName) => {
381
- if (validator.validate(inputSchema, obj))
382
- return;
380
+ if (validator.validate(inputSchema, obj)) return;
383
381
  const errorMessage = parseAjvError(validator.errors[0], rootName)?.message;
384
382
  throw new Error(`Input schema is not valid (${errorMessage})`);
385
383
  }, "validateAgainstSchemaOrThrow");
386
- var validateBasicStructure = /* @__PURE__ */ __name((validator, obj) => {
387
- const schemaWithoutProperties = { ...schema_default };
388
- schemaWithoutProperties.properties = { ...schema_default.properties, properties: { type: "object" } };
384
+ function validateBasicStructure(validator, obj) {
385
+ const schemaWithoutProperties = {
386
+ ...schema_default,
387
+ properties: { ...schema_default.properties, properties: { type: "object" } }
388
+ };
389
389
  validateAgainstSchemaOrThrow(validator, obj, schemaWithoutProperties, "schema");
390
- }, "validateBasicStructure");
391
- var validateField = /* @__PURE__ */ __name((validator, fieldSchema, fieldKey) => {
390
+ }
391
+ __name(validateBasicStructure, "validateBasicStructure");
392
+ function validateField(validator, fieldSchema, fieldKey) {
392
393
  const matchingDefinitions = Object.values(definitions).filter((definition2) => {
393
394
  return definition2.properties.type.enum ? definition2.properties.type.enum[0] === fieldSchema.type : Array.isArray(fieldSchema.type);
394
395
  });
@@ -402,29 +403,32 @@ var validateField = /* @__PURE__ */ __name((validator, fieldSchema, fieldKey) =>
402
403
  }
403
404
  if (fieldSchema.enum) {
404
405
  const definition2 = matchingDefinitions.filter((item) => !!item.properties.enum).pop();
405
- if (!definition2)
406
- throw new Error('Input schema validation failed to find "enum property" definition');
406
+ if (!definition2) throw new Error('Input schema validation failed to find "enum property" definition');
407
407
  validateAgainstSchemaOrThrow(validator, fieldSchema, definition2, `schema.properties.${fieldKey}.enum`);
408
408
  return;
409
409
  }
410
410
  const definition = matchingDefinitions.filter((item) => !item.properties.enum).pop();
411
- if (!definition)
412
- throw new Error('Input schema validation failed to find other than "enum property" definition');
411
+ if (!definition) throw new Error('Input schema validation failed to find other than "enum property" definition');
413
412
  validateAgainstSchemaOrThrow(validator, fieldSchema, definition, `schema.properties.${fieldKey}`);
414
- }, "validateField");
413
+ }
414
+ __name(validateField, "validateField");
415
+ function validateProperties(inputSchema, validator) {
416
+ Object.entries(inputSchema.properties).forEach(
417
+ ([fieldKey, fieldSchema]) => validateField(validator, fieldSchema, fieldKey)
418
+ );
419
+ }
420
+ __name(validateProperties, "validateProperties");
415
421
  function validateExistenceOfRequiredFields(inputSchema) {
416
- if (!inputSchema?.required?.length)
417
- return;
422
+ if (!inputSchema?.required?.length) return;
418
423
  Object.values(inputSchema?.required).forEach((fieldKey) => {
419
- if (inputSchema?.properties[fieldKey])
420
- return;
424
+ if (inputSchema?.properties[fieldKey]) return;
421
425
  throw new Error(m("inputSchema.validation.missingRequiredField", { fieldKey }));
422
426
  });
423
427
  }
424
428
  __name(validateExistenceOfRequiredFields, "validateExistenceOfRequiredFields");
425
429
  function validateInputSchema(validator, inputSchema) {
426
430
  validateBasicStructure(validator, inputSchema);
427
- Object.entries(inputSchema.properties).forEach(([fieldKey, fieldSchema]) => validateField(validator, fieldSchema, fieldKey));
431
+ validateProperties(inputSchema, validator);
428
432
  validateExistenceOfRequiredFields(inputSchema);
429
433
  validateAgainstSchemaOrThrow(validator, inputSchema, schema_default, "schema");
430
434
  }
@@ -432,13 +436,12 @@ __name(validateInputSchema, "validateInputSchema");
432
436
 
433
437
  // src/utilities.ts
434
438
  var import_consts = require("@apify/consts");
435
- var import_countries_list = require("countries-list");
436
439
  var import_acorn_loose = require("acorn-loose");
440
+ var import_countries_list = require("countries-list");
437
441
  function validateProxyField(fieldKey, value, isRequired = false, options = null) {
438
442
  const fieldErrors = [];
439
443
  if (isRequired) {
440
- if (value === null)
441
- return fieldErrors;
444
+ if (value === null) return fieldErrors;
442
445
  if (!value) {
443
446
  const message = m("inputSchema.validation.required", { rootName: "input", fieldKey });
444
447
  fieldErrors.push(message);
@@ -450,14 +453,12 @@ function validateProxyField(fieldKey, value, isRequired = false, options = null)
450
453
  return fieldErrors;
451
454
  }
452
455
  }
453
- if (!value)
454
- return fieldErrors;
456
+ if (!value) return fieldErrors;
455
457
  const { useApifyProxy, proxyUrls, apifyProxyGroups, apifyProxyCountry } = value;
456
458
  if (!useApifyProxy && Array.isArray(proxyUrls)) {
457
459
  let invalidUrl = false;
458
460
  proxyUrls.forEach((url) => {
459
- if (!import_consts.PROXY_URL_REGEX.test(url.trim()))
460
- invalidUrl = url.trim();
461
+ if (!import_consts.PROXY_URL_REGEX.test(url.trim())) invalidUrl = url.trim();
461
462
  });
462
463
  if (invalidUrl) {
463
464
  fieldErrors.push(m("inputSchema.validation.customProxyInvalid", { invalidUrl }));
@@ -466,13 +467,11 @@ function validateProxyField(fieldKey, value, isRequired = false, options = null)
466
467
  if (!useApifyProxy && apifyProxyCountry) {
467
468
  fieldErrors.push(m("inputSchema.validation.apifyProxyCountryWithoutApifyProxyForbidden"));
468
469
  }
469
- if (!useApifyProxy)
470
- return fieldErrors;
470
+ if (!useApifyProxy) return fieldErrors;
471
471
  if (apifyProxyCountry && !import_countries_list.countries[apifyProxyCountry]) {
472
472
  fieldErrors.push(m("inputSchema.validation.apifyProxyCountryInvalid", { invalidCountry: apifyProxyCountry }));
473
473
  }
474
- if (!options)
475
- return fieldErrors;
474
+ if (!options) return fieldErrors;
476
475
  const isStringsArray = /* @__PURE__ */ __name((array) => array.every((item) => typeof item === "string"), "isStringsArray");
477
476
  if (apifyProxyGroups && !(Array.isArray(apifyProxyGroups) && isStringsArray(apifyProxyGroups))) {
478
477
  fieldErrors.push(m("inputSchema.validation.proxyGroupMustBeArrayOfStrings", { rootName: "input", fieldKey }));
@@ -524,14 +523,10 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
524
523
  if (editor === "requestListSources") {
525
524
  const invalidIndexes = [];
526
525
  value.forEach((item, index) => {
527
- if (!item)
528
- invalidIndexes.push(index);
529
- else if (!item.url && !item.requestsFromUrl)
530
- invalidIndexes.push(index);
531
- else if (item.url && !import_consts.URL_REGEX.test(item.url))
532
- invalidIndexes.push(index);
533
- else if (item.requestsFromUrl && !import_consts.URL_REGEX.test(item.requestsFromUrl))
534
- invalidIndexes.push(index);
526
+ if (!item) invalidIndexes.push(index);
527
+ else if (!item.url && !item.requestsFromUrl) invalidIndexes.push(index);
528
+ else if (item.url && !import_consts.URL_REGEX.test(item.url)) invalidIndexes.push(index);
529
+ else if (item.requestsFromUrl && !import_consts.URL_REGEX.test(item.requestsFromUrl)) invalidIndexes.push(index);
535
530
  });
536
531
  if (invalidIndexes.length) {
537
532
  fieldErrors.push(m("inputSchema.validation.requestListSourcesInvalid", {
@@ -545,8 +540,7 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
545
540
  const check = new RegExp(patternKey);
546
541
  const invalidIndexes = [];
547
542
  value.forEach((item, index) => {
548
- if (!check.test(item.key))
549
- invalidIndexes.push(index);
543
+ if (!check.test(item.key)) invalidIndexes.push(index);
550
544
  });
551
545
  if (invalidIndexes.length) {
552
546
  fieldErrors.push(m("inputSchema.validation.arrayKeysInvalid", {
@@ -561,8 +555,7 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
561
555
  const check = new RegExp(patternValue);
562
556
  const invalidIndexes = [];
563
557
  value.forEach((item, index) => {
564
- if (!check.test(item.value))
565
- invalidIndexes.push(index);
558
+ if (!check.test(item.value)) invalidIndexes.push(index);
566
559
  });
567
560
  if (invalidIndexes.length) {
568
561
  fieldErrors.push(m("inputSchema.validation.arrayValuesInvalid", {
@@ -576,8 +569,7 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
576
569
  const check = new RegExp(patternValue);
577
570
  const invalidIndexes = [];
578
571
  value.forEach((item, index) => {
579
- if (!check.test(item))
580
- invalidIndexes.push(index);
572
+ if (!check.test(item)) invalidIndexes.push(index);
581
573
  });
582
574
  if (invalidIndexes.length) {
583
575
  fieldErrors.push(m("inputSchema.validation.arrayValuesInvalid", {
@@ -594,8 +586,7 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
594
586
  const check = new RegExp(patternKey);
595
587
  const invalidKeys = [];
596
588
  Object.keys(value).forEach((key) => {
597
- if (!check.test(key))
598
- invalidKeys.push(key);
589
+ if (!check.test(key)) invalidKeys.push(key);
599
590
  });
600
591
  if (invalidKeys.length) {
601
592
  fieldErrors.push(m("inputSchema.validation.objectKeysInvalid", {
@@ -611,8 +602,7 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
611
602
  const invalidKeys = [];
612
603
  Object.keys(value).forEach((key) => {
613
604
  const propertyValue = value[key];
614
- if (typeof propertyValue !== "string" || !check.test(propertyValue))
615
- invalidKeys.push(key);
605
+ if (typeof propertyValue !== "string" || !check.test(propertyValue)) invalidKeys.push(key);
616
606
  });
617
607
  if (invalidKeys.length) {
618
608
  fieldErrors.push(m("inputSchema.validation.objectValuesInvalid", {
@@ -637,8 +627,7 @@ function makeInputJsFieldsReadable(json, jsFields, jsonSpacing = 4, globalSpacin
637
627
  const replacements = {};
638
628
  jsFields.forEach((field) => {
639
629
  let maybeFunction = parsedJson[field];
640
- if (!maybeFunction || typeof maybeFunction !== "string")
641
- return;
630
+ if (!maybeFunction || typeof maybeFunction !== "string") return;
642
631
  let ast;
643
632
  try {
644
633
  ast = (0, import_acorn_loose.parse)(maybeFunction, { ecmaVersion: "latest" });
@@ -647,8 +636,7 @@ function makeInputJsFieldsReadable(json, jsFields, jsonSpacing = 4, globalSpacin
647
636
  }
648
637
  const isMultiline = maybeFunction.includes("\n");
649
638
  const isSingleFunction = ast && ast.body.length === 1 && (ast.body[0].type === "FunctionDeclaration" || ast.body[0].type === "ExpressionStatement" && ast.body[0].expression.type === "ArrowFunctionExpression");
650
- if (!isSingleFunction && !isMultiline)
651
- return;
639
+ if (!isSingleFunction && !isMultiline) return;
652
640
  const spaces = new Array(isSingleFunction ? jsonSpacing : jsonSpacing * 2).fill(" ").join("");
653
641
  maybeFunction = maybeFunction.split("\n").join(`
654
642
  ${spaces}`).trim();
package/cjs/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/intl.ts","../../src/schema.json","../../src/input_schema.ts","../../src/utilities.ts"],"sourcesContent":["export * from './intl';\nexport * from './input_schema';\nexport * from './utilities';\n","const intlStrings = {\n 'inputSchema.validation.generic':\n 'Field {rootName}.{fieldKey} {message}',\n 'inputSchema.validation.required':\n 'Field {rootName}.{fieldKey} is required',\n 'inputSchema.validation.proxyRequired':\n 'Field {rootName}.{fieldKey} is required. Please provide custom proxy URLs or use Apify Proxy.',\n 'inputSchema.validation.requestListSourcesInvalid':\n 'Items in {rootName}.{fieldKey} at positions [{invalidIndexes}] do not contain valid URLs',\n 'inputSchema.validation.arrayKeysInvalid':\n 'Keys in {rootName}.{fieldKey} at positions [{invalidIndexes}] must match regular expression \"{pattern}\"',\n 'inputSchema.validation.arrayValuesInvalid':\n 'Values in {rootName}.{fieldKey} at positions [{invalidIndexes}] must match regular expression \"{pattern}\"',\n 'inputSchema.validation.objectKeysInvalid':\n 'Keys [{invalidKeys}] in {rootName}.{fieldKey} must match regular expression \"{pattern}',\n 'inputSchema.validation.objectValuesInvalid':\n 'Keys [{invalidKeys}] in {rootName}.{fieldKey} must have string value which matches regular expression \"{pattern}\"',\n 'inputSchema.validation.additionalProperty':\n 'Property {rootName}.{fieldKey} is not allowed.',\n 'inputSchema.validation.proxyGroupsNotAvailable':\n 'You currently do not have access to proxy groups: {groups}',\n 'inputSchema.validation.customProxyInvalid':\n 'Proxy URL \"{invalidUrl}\" has invalid format, it must be http[s]://[username[:password]]@hostname:port.',\n 'inputSchema.validation.apifyProxyCountryInvalid':\n 'Country code \"{invalidCountry}\" is invalid. Only ISO 3166-1 alpha-2 country codes are supported.',\n 'inputSchema.validation.apifyProxyCountryWithoutApifyProxyForbidden':\n 'The country for Apify Proxy can be specified only when using Apify Proxy.',\n 'inputSchema.validation.noAvailableAutoProxy':\n 'Currently you do not have access to any proxy group usable in automatic mode.',\n 'inputSchema.validation.noMatchingDefinition':\n 'Field schema.properties.{fieldKey} is not matching any input schema type definition. Please make sure that it\\'s type is valid.',\n 'inputSchema.validation.missingRequiredField':\n 'Field schema.properties.{fieldKey} does not exist, but it is specified in schema.required. Either define the field or remove it from schema.required.',\n 'inputSchema.validation.proxyGroupMustBeArrayOfStrings':\n 'Field {rootName}.{fieldKey}.apifyProxyGroups must be an array of strings.',\n};\n\n/**\n * Helper function to simulate intl formatMessage function\n */\nexport function m(stringId: string, variables?: Record<string, any>) {\n let text = intlStrings[stringId];\n if (!text) return stringId;\n\n if (variables) {\n Object.keys(variables).forEach((variableName) => {\n text = text.split(`{${variableName}}`).join(variables[variableName]);\n });\n }\n\n return text;\n}\n","{\n \"title\": \"JSON schema of Apify Actor INPUT_SCHEMA.json\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"schemaVersion\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 1\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\"object\"]\n },\n \"required\": {\n \"type\": \"array\",\n \"minItems\": 0,\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"additionalProperties\": {\n \"type\": \"boolean\"\n },\n \"properties\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \"^\": {\n \"oneOf\": [\n { \"$ref\": \"#/definitions/stringProperty\" },\n { \"$ref\": \"#/definitions/stringEnumProperty\" },\n { \"$ref\": \"#/definitions/arrayProperty\" },\n { \"$ref\": \"#/definitions/objectProperty\" },\n { \"$ref\": \"#/definitions/integerProperty\" },\n { \"$ref\": \"#/definitions/booleanProperty\" },\n { \"$ref\": \"#/definitions/anyProperty\" }\n ]\n }\n }\n }\n },\n \"additionalProperties\": false,\n \"required\": [\"title\", \"type\", \"properties\", \"schemaVersion\"],\n \"definitions\": {\n \"stringEnumProperty\": {\n \"title\": \"Enum property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"editor\": { \"enum\": [\"select\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"string\" },\n \"prefill\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" },\n \"enum\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"minItems\": 1,\n \"uniqueItems\": true\n },\n \"enumTitles\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"minItems\": 1\n }\n },\n \"required\": [\"type\", \"title\", \"description\", \"enum\"]\n },\n \"stringProperty\": {\n \"title\": \"String property\",\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"javascript\", \"python\", \"textfield\", \"textarea\", \"datepicker\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"],\n \"if\": {\n \"properties\": {\n \"isSecret\": {\n \"not\": {\n \"const\": true\n }\n }\n }\n },\n \"then\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"string\" },\n \"prefill\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"pattern\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minLength\": { \"type\": \"integer\" },\n \"maxLength\": { \"type\": \"integer\" },\n \"editor\": { \"enum\": [\"javascript\", \"python\", \"textfield\", \"textarea\", \"datepicker\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n }\n },\n \"else\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"textfield\", \"textarea\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n }\n }\n },\n \"arrayProperty\": {\n \"title\": \"Array property\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"enum\": [\"array\"] },\n \"editor\": { \"enum\": [\"json\", \"requestListSources\", \"pseudoUrls\", \"globs\", \"keyValue\", \"stringList\", \"select\", \"hidden\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"array\" },\n \"prefill\": { \"type\": \"array\" },\n \"example\": { \"type\": \"array\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minItems\": { \"type\": \"integer\" },\n \"maxItems\": { \"type\": \"integer\" },\n \"uniqueItems\": { \"type\": \"boolean\" },\n\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"additionalProperties\": true,\n \"required\": [\"type\", \"title\", \"description\", \"editor\"],\n \"if\": {\n \"properties\": {\n \"editor\": { \"const\": \"select\" }\n }\n },\n \"then\": {\n \"required\": [\"items\"],\n \"properties\": {\n \"items\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"enum\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"enumTitles\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n }\n },\n \"required\": [\"type\", \"enum\"]\n }\n }\n },\n \"else\": {\n \"properties\": {\n \"placeholderKey\": { \"type\": \"string\" },\n \"placeholderValue\": { \"type\": \"string\" },\n \"patternKey\": { \"type\": \"string\" },\n \"patternValue\": { \"type\": \"string\" }\n }\n }\n },\n \"objectProperty\": {\n \"title\": \"Object property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"object\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"object\" },\n \"prefill\": { \"type\": \"object\" },\n \"example\": { \"type\": \"object\" },\n \"patternKey\": { \"type\": \"string\" },\n \"patternValue\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minProperties\": { \"type\": \"integer\" },\n \"maxProperties\": { \"type\": \"integer\" },\n\n \"editor\": { \"enum\": [\"json\", \"proxy\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"]\n },\n \"integerProperty\": {\n \"title\": \"Integer property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"integer\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"integer\" },\n \"prefill\": { \"type\": \"integer\" },\n \"example\": { \"type\": \"integer\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minimum\": { \"type\": \"integer\" },\n \"maximum\": { \"type\": \"integer\" },\n \"unit\": { \"type\": \"string\" },\n \"editor\": { \"enum\": [\"number\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\"]\n },\n \"booleanProperty\": {\n \"title\": \"Boolean property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"boolean\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"boolean\" },\n \"prefill\": { \"type\": \"boolean\" },\n \"example\": { \"type\": \"boolean\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"groupCaption\": { \"type\": \"string\" },\n \"groupDescription\": { \"type\": \"string\" },\n \"editor\": { \"enum\": [\"checkbox\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\"]\n },\n \"anyProperty\": {\n \"title\": \"Any property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": {\n \"type\": [\"array\"],\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"]\n },\n \"uniqueItems\": true,\n \"additionalItems\": false,\n \"minItems\": 1\n },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"prefill\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"example\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"json\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"]\n }\n }\n}\n","import Ajv, { ErrorObject } from 'ajv';\nimport schema from './schema.json';\nimport { m } from './intl';\n\nexport { schema as inputSchema };\nconst { definitions } = schema;\n\n/**\n * This function parses AJV error and transforms it into a readable string.\n *\n * @param error An error as returned from AJV.\n * @param rootName Usually 'input' or 'schema' based on if we are passing the input or schema.\n * @param properties (Used only when parsing input errors) List of input schema properties.\n * @param input (Used only when parsing input errors) Actual input that is being parsed.\n * @returns {null|{fieldKey: *, message: *}}\n */\nexport function parseAjvError(\n error: ErrorObject,\n rootName: string,\n properties: Record<string, { nullable?: boolean }> = {},\n input: Record<string, unknown> = {},\n): { fieldKey: string; message: string } | null {\n // There are 3 possible errors comming from validation:\n // - either { keword: 'anything', instancePath: '/someField', message: 'error message that we can use' }\n // - or { keyword: 'additionalProperties', params: { additionalProperty: 'field' }, message: 'must NOT have additional properties' }\n // - or { keyword: 'required', instancePath: '', params.missingProperty: 'someField' }\n\n let fieldKey: string;\n let message: string;\n\n // If error is with keyword type, it means that type of input is incorrect\n // this can mean that provided value is null\n if (error.keyword === 'type') {\n fieldKey = error.instancePath.split('/').pop()!;\n // Check if value is null and field is nullable, if yes, then skip this error\n if (properties[fieldKey] && properties[fieldKey].nullable && input[fieldKey] === null) {\n return null;\n }\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: error.message });\n } else if (error.keyword === 'required') {\n fieldKey = error.params.missingProperty;\n message = m('inputSchema.validation.required', { rootName, fieldKey });\n } else if (error.keyword === 'additionalProperties') {\n fieldKey = error.params.additionalProperty;\n message = m('inputSchema.validation.additionalProperty', { rootName, fieldKey });\n } else if (error.keyword === 'enum') {\n fieldKey = error.instancePath.split('/').pop()!;\n const errorMessage = `${error.message}: \"${error.params.allowedValues.join('\", \"')}\"`;\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: errorMessage });\n } else {\n fieldKey = error.instancePath.split('/').pop()!;\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: error.message });\n }\n\n return { fieldKey, message };\n}\n\n/**\n * Validates given object against schema and throws a human readable error.\n */\nconst validateAgainstSchemaOrThrow = <T> (validator: Ajv, obj: T, inputSchema: any, rootName: string) => {\n if (validator.validate(inputSchema, obj)) return;\n\n const errorMessage = parseAjvError(validator.errors![0], rootName)?.message;\n throw new Error(`Input schema is not valid (${errorMessage})`);\n};\n\n/**\n * This validates given object only against the basic input schema without checking the particular fields.\n * We override schema.properties.properties not to validate field defitions.\n */\nconst validateBasicStructure = <T> (validator: Ajv, obj: T) => {\n const schemaWithoutProperties = { ...schema };\n schemaWithoutProperties.properties = { ...schema.properties, properties: { type: 'object' } as any };\n validateAgainstSchemaOrThrow(validator, obj, schemaWithoutProperties, 'schema');\n};\n\n/**\n * Validates particular field against it's schema.\n */\nconst validateField = <T extends Record<string, any>> (validator: Ajv, fieldSchema: T, fieldKey: string) => {\n const matchingDefinitions = Object\n .values<any>(definitions) // cast as any, as the code in first branch seems to be invalid\n .filter((definition) => {\n return definition.properties.type.enum\n // This is a normal case where fieldSchema.type can be only one possible value matching definition.properties.type.enum.0\n ? definition.properties.type.enum[0] === fieldSchema.type\n // This is a type \"Any\" where fieldSchema.type is an array of possible values\n : Array.isArray(fieldSchema.type);\n });\n\n // There is not matching definition.\n if (matchingDefinitions.length === 0) {\n const errorMessage = m('inputSchema.validation.noMatchingDefinition', { fieldKey });\n throw new Error(`Input schema is not valid (${errorMessage})`);\n }\n\n // If there is only one matching then we are done and simply compare it.\n if (matchingDefinitions.length === 1) {\n validateAgainstSchemaOrThrow(validator, fieldSchema, matchingDefinitions[0], `schema.properties.${fieldKey}`);\n return;\n }\n\n // If there are more matching definitions then the type is string and we need to get the right one.\n // If the definition contains \"enum\" property then it's enum type.\n if (fieldSchema.enum) {\n const definition = matchingDefinitions.filter((item) => !!item.properties.enum).pop();\n if (!definition) throw new Error('Input schema validation failed to find \"enum property\" definition');\n validateAgainstSchemaOrThrow(validator, fieldSchema, definition, `schema.properties.${fieldKey}.enum`);\n return;\n }\n // Otherwise we use the other definition.\n const definition = matchingDefinitions.filter((item) => !item.properties.enum).pop();\n if (!definition) throw new Error('Input schema validation failed to find other than \"enum property\" definition');\n\n validateAgainstSchemaOrThrow(validator, fieldSchema, definition, `schema.properties.${fieldKey}`);\n};\n\n/**\n * Validates that all required fields are present in properties list\n */\nexport function validateExistenceOfRequiredFields<T extends Record<string, any>>(inputSchema: T) {\n // If the input schema does not have any required fields, we do not need to validate them\n if (!inputSchema?.required?.length) return;\n\n Object.values(inputSchema?.required).forEach((fieldKey) => {\n // If the required field is present in the list of properties, we can check the next one\n if (inputSchema?.properties[fieldKey as string]) return;\n\n // The required field is not defined in list of properties. Which means the schema is not valid.\n throw new Error(m('inputSchema.validation.missingRequiredField', { fieldKey }));\n });\n}\n\n/**\n * This function validates given input schema first just for basic structure then each field one by one,\n * then checks that all required fields are present and finally checks fully against the whole schema.\n *\n * This way we get the most accurate error message for user.\n */\nexport function validateInputSchema<T extends Record<string, any>>(validator: Ajv, inputSchema: T) {\n // First validate just basic structure without fields.\n validateBasicStructure(validator, inputSchema);\n\n // Then validate each field separately.\n Object.entries<any>(inputSchema.properties).forEach(([fieldKey, fieldSchema]) => validateField(validator, fieldSchema, fieldKey));\n\n // Next validate if required fields are actually present in the schema\n validateExistenceOfRequiredFields(inputSchema);\n\n // Finally just to be sure run validation against the whole shema.\n validateAgainstSchemaOrThrow(validator, inputSchema, schema, 'schema');\n}\n","import { PROXY_URL_REGEX, URL_REGEX } from '@apify/consts';\nimport { countries } from 'countries-list';\nimport { ValidateFunction } from 'ajv';\nimport { parse } from 'acorn-loose';\nimport { m } from './intl';\nimport { parseAjvError } from './input_schema';\n\n/**\n * Validates input field configured with proxy editor\n * @param fieldKey Proxy field value\n * @param value Proxy field value\n * @param [isRequired] Whether the field is required or not\n * @param [options] Information about proxy groups availability\n * @param [options.hasAutoProxyGroups] Informs validation whether user has atleast one proxy group available in auto mode\n * @param [options.availableProxyGroups] List of available proxy groups\n * @param [options.disabledProxyGroups] Object with groupId as key and error message as value (mostly for residential/SERP)\n */\nfunction validateProxyField(\n fieldKey: Record<string, unknown>,\n value: Record<string, any>,\n isRequired = false,\n options: { hasAutoProxyGroups?: boolean; availableProxyGroups?: string[]; disabledProxyGroups?: Record<string, unknown> } | null = null,\n) {\n const fieldErrors: any[] = [];\n if (isRequired) {\n // Nullable error is already handled by AJV\n if (value === null) return fieldErrors;\n if (!value) {\n const message = m('inputSchema.validation.required', { rootName: 'input', fieldKey });\n fieldErrors.push(message);\n return fieldErrors;\n }\n\n const { useApifyProxy, proxyUrls } = value;\n if (!useApifyProxy && (!Array.isArray(proxyUrls) || proxyUrls.length === 0)) {\n fieldErrors.push(m('inputSchema.validation.proxyRequired', { rootName: 'input', fieldKey }));\n return fieldErrors;\n }\n }\n\n // Input is not required, so missing value is valid\n if (!value) return fieldErrors;\n\n const { useApifyProxy, proxyUrls, apifyProxyGroups, apifyProxyCountry } = value;\n\n if (!useApifyProxy && Array.isArray(proxyUrls)) {\n let invalidUrl = false;\n proxyUrls.forEach((url) => {\n if (!PROXY_URL_REGEX.test(url.trim())) invalidUrl = url.trim();\n });\n if (invalidUrl) {\n fieldErrors.push(m('inputSchema.validation.customProxyInvalid', { invalidUrl }));\n }\n }\n\n // Apify proxy country can be set only when using Apify proxy\n if (!useApifyProxy && apifyProxyCountry) {\n fieldErrors.push(m('inputSchema.validation.apifyProxyCountryWithoutApifyProxyForbidden'));\n }\n\n // If Apify proxy is not used skip additional checks\n if (!useApifyProxy) return fieldErrors;\n\n // If Apify proxy is used, check if there is a selected country and if so, check that it's valid (empty or a valid country code)\n if (apifyProxyCountry && !countries[apifyProxyCountry]) {\n fieldErrors.push(m('inputSchema.validation.apifyProxyCountryInvalid', { invalidCountry: apifyProxyCountry }));\n }\n\n // If options are not provided skip additional checks\n if (!options) return fieldErrors;\n\n // if apifyProxyGroups exists it must be an array of strings\n const isStringsArray = (array: Array<string>) => array.every((item) => typeof item === 'string');\n if (apifyProxyGroups && !(Array.isArray(apifyProxyGroups) && isStringsArray(apifyProxyGroups))) {\n fieldErrors.push(m('inputSchema.validation.proxyGroupMustBeArrayOfStrings', { rootName: 'input', fieldKey }));\n return fieldErrors;\n }\n\n const selectedProxyGroups = (apifyProxyGroups || []);\n\n // Auto mode, check that user has access to alteast one proxy group usable in this mode\n if (!selectedProxyGroups.length && !options.hasAutoProxyGroups) {\n fieldErrors.push(m('inputSchema.validation.noAvailableAutoProxy'));\n return fieldErrors;\n }\n\n // Check if proxy groups selected by user are available to him\n const availableProxyGroupsById = {};\n (options.availableProxyGroups || []).forEach((group) => { availableProxyGroupsById[group] = true; });\n const unavailableProxyGroups = selectedProxyGroups.filter((group: string) => !availableProxyGroupsById[group]);\n\n if (unavailableProxyGroups.length) {\n fieldErrors.push(m('inputSchema.validation.proxyGroupsNotAvailable', {\n rootName: 'input',\n fieldKey,\n groups: unavailableProxyGroups.join(', '),\n }));\n }\n\n // Check if any of the proxy groups are blocked and if yes then output the associated message\n const blockedProxyGroupsById = options.disabledProxyGroups || {};\n selectedProxyGroups\n .filter((group: string) => blockedProxyGroupsById[group])\n .forEach((blockedGroup: string) => {\n fieldErrors.push(blockedProxyGroupsById[blockedGroup]);\n });\n\n return fieldErrors;\n}\n\n/**\n * Uses AJV validator to validate input with input schema and then\n * does custom validation for our own properties (nullable, patternKey, patternValue)\n * @param validator Initialized AJV validator\n * @param inputSchema Valid input schema in object\n * @param input Input object to be validated\n * @param options (Optional) Additional validation configuration for certain fields\n */\nexport function validateInputUsingValidator(\n validator: ValidateFunction,\n inputSchema: Record<string, any>,\n input: Record<string, unknown>,\n options: Record<string, any> = {},\n) {\n const isValid = validator(input); // Check if input is valid based on schema values\n\n const { properties } = inputSchema;\n const required = inputSchema.required || [];\n\n let errors: { fieldKey: string, message: string }[] = [];\n // Process AJV validation errors\n if (!isValid) {\n errors = validator.errors!\n .map((error) => parseAjvError(error, 'input', properties, input))\n .filter((error) => !!error) as any[];\n }\n\n Object.keys(properties).forEach((property) => {\n const value = input[property] as Record<string, any>;\n const { type, editor, patternKey, patternValue } = properties[property];\n const fieldErrors = [];\n // Check that proxy is required, if yes, valides that it's correctly setup\n if (type === 'object' && editor === 'proxy') {\n const proxyValidationErrors = validateProxyField(property as any, value, required.includes(property), options.proxy);\n proxyValidationErrors.forEach((error) => {\n fieldErrors.push(error);\n });\n }\n // Check that array items fit patternKey and patternValue\n if (type === 'array' && value && Array.isArray(value)) {\n if (editor === 'requestListSources') {\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!item) invalidIndexes.push(index);\n else if (!item.url && !item.requestsFromUrl) invalidIndexes.push(index);\n else if (item.url && !URL_REGEX.test(item.url)) invalidIndexes.push(index);\n else if (item.requestsFromUrl && !URL_REGEX.test(item.requestsFromUrl)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.requestListSourcesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n }));\n }\n }\n // If patternKey is provided, then validate keys of objects in array\n if (patternKey && editor === 'keyValue') {\n const check = new RegExp(patternKey);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item.key)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayKeysInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternKey,\n }));\n }\n }\n // If patternValue is provided and editor is keyValue, then validate values of objecs in array\n if (patternValue && editor === 'keyValue') {\n const check = new RegExp(patternValue);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item.value)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternValue,\n }));\n }\n // If patternValue is provided and editor is stringList, then validate each item in array\n } else if (patternValue && editor === 'stringList') {\n const check = new RegExp(patternValue);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternValue,\n }));\n }\n }\n }\n // Check that object items fit patternKey and patternValue\n if (type === 'object' && value) {\n if (patternKey) {\n const check = new RegExp(patternKey);\n const invalidKeys: any[] = [];\n Object.keys(value).forEach((key) => {\n if (!check.test(key)) invalidKeys.push(key);\n });\n if (invalidKeys.length) {\n fieldErrors.push(m('inputSchema.validation.objectKeysInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidKeys: invalidKeys.join(','),\n pattern: patternKey,\n }));\n }\n }\n if (patternValue) {\n const check = new RegExp(patternValue);\n const invalidKeys: any[] = [];\n Object.keys(value).forEach((key) => {\n const propertyValue = value[key];\n if (typeof propertyValue !== 'string' || !check.test(propertyValue)) invalidKeys.push(key);\n });\n if (invalidKeys.length) {\n fieldErrors.push(m('inputSchema.validation.objectValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidKeys: invalidKeys.join(','),\n pattern: patternValue,\n }));\n }\n }\n }\n if (fieldErrors.length > 0) {\n const message = fieldErrors.join(', ');\n errors.push({ fieldKey: property, message });\n }\n });\n\n return errors;\n}\n\n/**\n * This functions parses all given JSON and then takes each of the jsFields.\n * Then if the field:\n * - is valid JS single function it replaces its single line string with a function delacation.\n * - is valid multiline JS code then replaces its single line string with `multiline` string\n * Then stringifies the code with given number of jsonSpacing spaces and finally prefixes whole\n * stringified JSON except the first line with globalSpacing spaces.\n */\nexport function makeInputJsFieldsReadable(json: string, jsFields: string[], jsonSpacing = 4, globalSpacing = 0): string {\n const parsedJson = JSON.parse(json);\n const replacements: Record<string, any> = {};\n\n jsFields.forEach((field) => {\n let maybeFunction = parsedJson[field];\n if (!maybeFunction || typeof maybeFunction !== 'string') return;\n\n let ast;\n try {\n ast = parse(maybeFunction, { ecmaVersion: 'latest' });\n } catch (err) {\n // Don't do anything in a case of invalid JS code.\n return;\n }\n\n const isMultiline = maybeFunction.includes('\\n');\n const isSingleFunction = ast\n && ast.body.length === 1\n && (\n ast.body[0].type === 'FunctionDeclaration'\n || (ast.body[0].type === 'ExpressionStatement' && ast.body[0].expression.type === 'ArrowFunctionExpression')\n );\n\n // If it's not a function declaration or multiline JS code then we do nothing.\n if (!isSingleFunction && !isMultiline) return;\n\n const spaces = (new Array(isSingleFunction ? jsonSpacing : jsonSpacing * 2)).fill(' ').join('');\n maybeFunction = maybeFunction\n .split('\\n').join(`\\n${spaces}`) // This prefixes each line with spaces.\n .trim(); // Trim whitespace on both sides\n\n const replacementValue = isSingleFunction\n ? maybeFunction.replace(/[;]+$/g, '') // Remove trailing semicolons\n : `\\`${maybeFunction}\\``;\n const replacementToken = `<<<REPLACEMENT_TOKEN:${Math.random()}>>>`;\n replacements[replacementToken] = replacementValue;\n parsedJson[field] = replacementToken;\n });\n\n let niceJson = JSON.stringify(parsedJson, null, jsonSpacing);\n\n Object.entries(replacements).forEach(([replacementToken, replacementValue]) => {\n niceJson = niceJson.replace(`\"${replacementToken}\"`, replacementValue);\n });\n\n const globalSpaces = (new Array(globalSpacing)).fill(' ').join('');\n niceJson = niceJson.split('\\n').join(`\\n${globalSpaces}`);\n\n return niceJson;\n}\n"],"mappings":"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","names":["definition","useApifyProxy","proxyUrls"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/intl.ts","../../src/schema.json","../../src/input_schema.ts","../../src/utilities.ts"],"sourcesContent":["export * from './intl';\nexport * from './input_schema';\nexport {\n StringFieldDefinition,\n BooleanFieldDefinition,\n IntegerFieldDefinition,\n ObjectFieldDefinition,\n ArrayFieldDefinition,\n MixedFieldDefinition,\n FieldDefinition,\n InputSchema,\n} from './types';\nexport * from './utilities';\n","const intlStrings = {\n 'inputSchema.validation.generic':\n 'Field {rootName}.{fieldKey} {message}',\n 'inputSchema.validation.required':\n 'Field {rootName}.{fieldKey} is required',\n 'inputSchema.validation.proxyRequired':\n 'Field {rootName}.{fieldKey} is required. Please provide custom proxy URLs or use Apify Proxy.',\n 'inputSchema.validation.requestListSourcesInvalid':\n 'Items in {rootName}.{fieldKey} at positions [{invalidIndexes}] do not contain valid URLs',\n 'inputSchema.validation.arrayKeysInvalid':\n 'Keys in {rootName}.{fieldKey} at positions [{invalidIndexes}] must match regular expression \"{pattern}\"',\n 'inputSchema.validation.arrayValuesInvalid':\n 'Values in {rootName}.{fieldKey} at positions [{invalidIndexes}] must match regular expression \"{pattern}\"',\n 'inputSchema.validation.objectKeysInvalid':\n 'Keys [{invalidKeys}] in {rootName}.{fieldKey} must match regular expression \"{pattern}',\n 'inputSchema.validation.objectValuesInvalid':\n 'Keys [{invalidKeys}] in {rootName}.{fieldKey} must have string value which matches regular expression \"{pattern}\"',\n 'inputSchema.validation.additionalProperty':\n 'Property {rootName}.{fieldKey} is not allowed.',\n 'inputSchema.validation.proxyGroupsNotAvailable':\n 'You currently do not have access to proxy groups: {groups}',\n 'inputSchema.validation.customProxyInvalid':\n 'Proxy URL \"{invalidUrl}\" has invalid format, it must be http[s]://[username[:password]]@hostname:port.',\n 'inputSchema.validation.apifyProxyCountryInvalid':\n 'Country code \"{invalidCountry}\" is invalid. Only ISO 3166-1 alpha-2 country codes are supported.',\n 'inputSchema.validation.apifyProxyCountryWithoutApifyProxyForbidden':\n 'The country for Apify Proxy can be specified only when using Apify Proxy.',\n 'inputSchema.validation.noAvailableAutoProxy':\n 'Currently you do not have access to any proxy group usable in automatic mode.',\n 'inputSchema.validation.noMatchingDefinition':\n 'Field schema.properties.{fieldKey} is not matching any input schema type definition. Please make sure that it\\'s type is valid.',\n 'inputSchema.validation.missingRequiredField':\n 'Field schema.properties.{fieldKey} does not exist, but it is specified in schema.required. Either define the field or remove it from schema.required.',\n 'inputSchema.validation.proxyGroupMustBeArrayOfStrings':\n 'Field {rootName}.{fieldKey}.apifyProxyGroups must be an array of strings.',\n};\n\n/**\n * Helper function to simulate intl formatMessage function\n */\nexport function m(stringId: string, variables?: Record<string, any>) {\n let text = intlStrings[stringId as keyof typeof intlStrings];\n if (!text) return stringId;\n\n if (variables) {\n Object.keys(variables).forEach((variableName) => {\n text = text.split(`{${variableName}}`).join(variables[variableName]);\n });\n }\n\n return text;\n}\n","{\n \"title\": \"JSON schema of Apify Actor INPUT_SCHEMA.json\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"schemaVersion\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 1\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\"object\"]\n },\n \"required\": {\n \"type\": \"array\",\n \"minItems\": 0,\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"additionalProperties\": {\n \"type\": \"boolean\"\n },\n \"properties\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \"^\": {\n \"oneOf\": [\n { \"$ref\": \"#/definitions/stringProperty\" },\n { \"$ref\": \"#/definitions/stringEnumProperty\" },\n { \"$ref\": \"#/definitions/arrayProperty\" },\n { \"$ref\": \"#/definitions/objectProperty\" },\n { \"$ref\": \"#/definitions/integerProperty\" },\n { \"$ref\": \"#/definitions/booleanProperty\" },\n { \"$ref\": \"#/definitions/anyProperty\" }\n ]\n }\n }\n }\n },\n \"additionalProperties\": false,\n \"required\": [\"title\", \"type\", \"properties\", \"schemaVersion\"],\n \"definitions\": {\n \"stringEnumProperty\": {\n \"title\": \"Enum property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"editor\": { \"enum\": [\"select\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"string\" },\n \"prefill\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" },\n \"enum\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"minItems\": 1,\n \"uniqueItems\": true\n },\n \"enumTitles\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"minItems\": 1\n }\n },\n \"required\": [\"type\", \"title\", \"description\", \"enum\"]\n },\n \"stringProperty\": {\n \"title\": \"String property\",\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"javascript\", \"python\", \"textfield\", \"textarea\", \"datepicker\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"],\n \"if\": {\n \"properties\": {\n \"isSecret\": {\n \"not\": {\n \"const\": true\n }\n }\n }\n },\n \"then\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"string\" },\n \"prefill\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"pattern\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minLength\": { \"type\": \"integer\" },\n \"maxLength\": { \"type\": \"integer\" },\n \"editor\": { \"enum\": [\"javascript\", \"python\", \"textfield\", \"textarea\", \"datepicker\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n }\n },\n \"else\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"textfield\", \"textarea\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n }\n }\n },\n \"arrayProperty\": {\n \"title\": \"Array property\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"enum\": [\"array\"] },\n \"editor\": { \"enum\": [\"json\", \"requestListSources\", \"pseudoUrls\", \"globs\", \"keyValue\", \"stringList\", \"select\", \"hidden\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"array\" },\n \"prefill\": { \"type\": \"array\" },\n \"example\": { \"type\": \"array\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minItems\": { \"type\": \"integer\" },\n \"maxItems\": { \"type\": \"integer\" },\n \"uniqueItems\": { \"type\": \"boolean\" },\n\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"additionalProperties\": true,\n \"required\": [\"type\", \"title\", \"description\", \"editor\"],\n \"if\": {\n \"properties\": {\n \"editor\": { \"const\": \"select\" }\n }\n },\n \"then\": {\n \"required\": [\"items\"],\n \"properties\": {\n \"items\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"enum\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"enumTitles\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n }\n },\n \"required\": [\"type\", \"enum\"]\n }\n }\n },\n \"else\": {\n \"properties\": {\n \"placeholderKey\": { \"type\": \"string\" },\n \"placeholderValue\": { \"type\": \"string\" },\n \"patternKey\": { \"type\": \"string\" },\n \"patternValue\": { \"type\": \"string\" }\n }\n }\n },\n \"objectProperty\": {\n \"title\": \"Object property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"object\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"object\" },\n \"prefill\": { \"type\": \"object\" },\n \"example\": { \"type\": \"object\" },\n \"patternKey\": { \"type\": \"string\" },\n \"patternValue\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minProperties\": { \"type\": \"integer\" },\n \"maxProperties\": { \"type\": \"integer\" },\n\n \"editor\": { \"enum\": [\"json\", \"proxy\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"]\n },\n \"integerProperty\": {\n \"title\": \"Integer property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"integer\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"integer\" },\n \"prefill\": { \"type\": \"integer\" },\n \"example\": { \"type\": \"integer\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minimum\": { \"type\": \"integer\" },\n \"maximum\": { \"type\": \"integer\" },\n \"unit\": { \"type\": \"string\" },\n \"editor\": { \"enum\": [\"number\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\"]\n },\n \"booleanProperty\": {\n \"title\": \"Boolean property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"boolean\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"boolean\" },\n \"prefill\": { \"type\": \"boolean\" },\n \"example\": { \"type\": \"boolean\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"groupCaption\": { \"type\": \"string\" },\n \"groupDescription\": { \"type\": \"string\" },\n \"editor\": { \"enum\": [\"checkbox\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\"]\n },\n \"anyProperty\": {\n \"title\": \"Any property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": {\n \"type\": [\"array\"],\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"]\n },\n \"uniqueItems\": true,\n \"additionalItems\": false,\n \"minItems\": 1\n },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"prefill\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"example\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"json\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"]\n }\n }\n}\n","import Ajv, { ErrorObject, Schema } from 'ajv';\n\nimport { m } from './intl';\nimport schema from './schema.json';\nimport {\n FieldDefinition,\n InputSchema,\n InputSchemaBaseChecked,\n StringFieldDefinition,\n} from './types';\n\nexport { schema as inputSchema };\n\nconst { definitions } = schema;\n\n/**\n * This function parses AJV error and transforms it into a readable string.\n *\n * @param error An error as returned from AJV.\n * @param rootName Usually 'input' or 'schema' based on if we are passing the input or schema.\n * @param properties (Used only when parsing input errors) List of input schema properties.\n * @param input (Used only when parsing input errors) Actual input that is being parsed.\n * @returns {null|{fieldKey: *, message: *}}\n */\nexport function parseAjvError(\n error: ErrorObject,\n rootName: string,\n properties: Record<string, { nullable?: boolean }> = {},\n input: Record<string, unknown> = {},\n): { fieldKey: string; message: string } | null {\n // There are 3 possible errors comming from validation:\n // - either { keword: 'anything', instancePath: '/someField', message: 'error message that we can use' }\n // - or { keyword: 'additionalProperties', params: { additionalProperty: 'field' }, message: 'must NOT have additional properties' }\n // - or { keyword: 'required', instancePath: '', params.missingProperty: 'someField' }\n\n let fieldKey: string;\n let message: string;\n\n // If error is with keyword type, it means that type of input is incorrect\n // this can mean that provided value is null\n if (error.keyword === 'type') {\n fieldKey = error.instancePath.split('/').pop()!;\n // Check if value is null and field is nullable, if yes, then skip this error\n if (properties[fieldKey] && properties[fieldKey].nullable && input[fieldKey] === null) {\n return null;\n }\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: error.message });\n } else if (error.keyword === 'required') {\n fieldKey = error.params.missingProperty;\n message = m('inputSchema.validation.required', { rootName, fieldKey });\n } else if (error.keyword === 'additionalProperties') {\n fieldKey = error.params.additionalProperty;\n message = m('inputSchema.validation.additionalProperty', { rootName, fieldKey });\n } else if (error.keyword === 'enum') {\n fieldKey = error.instancePath.split('/').pop()!;\n const errorMessage = `${error.message}: \"${error.params.allowedValues.join('\", \"')}\"`;\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: errorMessage });\n } else {\n fieldKey = error.instancePath.split('/').pop()!;\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: error.message });\n }\n\n return { fieldKey, message };\n}\n\n/**\n * Validates given object against schema and throws a human-readable error.\n */\nconst validateAgainstSchemaOrThrow = (validator: Ajv, obj: Record<string, unknown>, inputSchema: Schema, rootName: string) => {\n if (validator.validate(inputSchema, obj)) return;\n\n const errorMessage = parseAjvError(validator.errors![0], rootName)?.message;\n throw new Error(`Input schema is not valid (${errorMessage})`);\n};\n\n/**\n * This validates given object only against the basic input schema without checking the particular fields.\n * We override schema.properties.properties not to validate field definitions.\n */\nfunction validateBasicStructure(validator: Ajv, obj: Record<string, unknown>): asserts obj is InputSchemaBaseChecked {\n const schemaWithoutProperties = {\n ...schema,\n properties: { ...schema.properties, properties: { type: 'object' } as any },\n };\n validateAgainstSchemaOrThrow(validator, obj, schemaWithoutProperties, 'schema');\n}\n\n/**\n * Validates particular field against it's schema.\n */\nfunction validateField(validator: Ajv, fieldSchema: Record<string, unknown>, fieldKey: string): asserts fieldSchema is FieldDefinition {\n const matchingDefinitions = Object\n .values<any>(definitions) // cast as any, as the code in first branch seems to be invalid\n .filter((definition) => {\n return definition.properties.type.enum\n // This is a normal case where fieldSchema.type can be only one possible value matching definition.properties.type.enum.0\n ? definition.properties.type.enum[0] === fieldSchema.type\n // This is a type \"Any\" where fieldSchema.type is an array of possible values\n : Array.isArray(fieldSchema.type);\n });\n\n // There is not matching definition.\n if (matchingDefinitions.length === 0) {\n const errorMessage = m('inputSchema.validation.noMatchingDefinition', { fieldKey });\n throw new Error(`Input schema is not valid (${errorMessage})`);\n }\n\n // If there is only one matching then we are done and simply compare it.\n if (matchingDefinitions.length === 1) {\n validateAgainstSchemaOrThrow(validator, fieldSchema, matchingDefinitions[0], `schema.properties.${fieldKey}`);\n return;\n }\n\n // If there are more matching definitions then the type is string, and we need to get the right one.\n // If the definition contains \"enum\" property then it's enum type.\n if ((fieldSchema as StringFieldDefinition).enum) {\n const definition = matchingDefinitions.filter((item) => !!item.properties.enum).pop();\n if (!definition) throw new Error('Input schema validation failed to find \"enum property\" definition');\n validateAgainstSchemaOrThrow(validator, fieldSchema, definition, `schema.properties.${fieldKey}.enum`);\n return;\n }\n // Otherwise we use the other definition.\n const definition = matchingDefinitions.filter((item) => !item.properties.enum).pop();\n if (!definition) throw new Error('Input schema validation failed to find other than \"enum property\" definition');\n\n validateAgainstSchemaOrThrow(validator, fieldSchema, definition, `schema.properties.${fieldKey}`);\n}\n\n/**\n * Validates all properties in the input schema\n */\nfunction validateProperties(inputSchema: InputSchemaBaseChecked, validator: Ajv): asserts inputSchema is InputSchema {\n Object.entries(inputSchema.properties).forEach(([fieldKey, fieldSchema]) => (\n validateField(validator, fieldSchema, fieldKey)),\n );\n}\n\n/**\n * Validates that all required fields are present in properties list\n */\nexport function validateExistenceOfRequiredFields(inputSchema: InputSchema) {\n // If the input schema does not have any required fields, we do not need to validate them\n if (!inputSchema?.required?.length) return;\n\n Object.values(inputSchema?.required).forEach((fieldKey) => {\n // If the required field is present in the list of properties, we can check the next one\n if (inputSchema?.properties[fieldKey as string]) return;\n\n // The required field is not defined in list of properties. Which means the schema is not valid.\n throw new Error(m('inputSchema.validation.missingRequiredField', { fieldKey }));\n });\n}\n\n/**\n * This function validates given input schema first just for basic structure then each field one by one,\n * then checks that all required fields are present and finally checks fully against the whole schema.\n *\n * This way we get the most accurate error message for user.\n */\nexport function validateInputSchema(validator: Ajv, inputSchema: Record<string, unknown>): asserts inputSchema is InputSchema {\n // First validate just basic structure without fields.\n validateBasicStructure(validator, inputSchema);\n\n // Then validate each field separately.\n validateProperties(inputSchema, validator);\n\n // Next validate if required fields are actually present in the schema\n validateExistenceOfRequiredFields(inputSchema);\n\n // Finally just to be sure run validation against the whole schema.\n validateAgainstSchemaOrThrow(validator, inputSchema, schema, 'schema');\n}\n","import { PROXY_URL_REGEX, URL_REGEX } from '@apify/consts';\nimport { parse } from 'acorn-loose';\nimport { ValidateFunction } from 'ajv';\nimport { countries } from 'countries-list';\n\nimport { parseAjvError } from './input_schema';\nimport { m } from './intl';\n\n/**\n * Validates input field configured with proxy editor\n * @param fieldKey Proxy field value\n * @param value Proxy field value\n * @param [isRequired] Whether the field is required or not\n * @param [options] Information about proxy groups availability\n * @param [options.hasAutoProxyGroups] Informs validation whether user has atleast one proxy group available in auto mode\n * @param [options.availableProxyGroups] List of available proxy groups\n * @param [options.disabledProxyGroups] Object with groupId as key and error message as value (mostly for residential/SERP)\n */\nfunction validateProxyField(\n fieldKey: Record<string, unknown>,\n value: Record<string, any>,\n isRequired = false,\n options: { hasAutoProxyGroups?: boolean; availableProxyGroups?: string[]; disabledProxyGroups?: Record<string, unknown> } | null = null,\n) {\n const fieldErrors: any[] = [];\n if (isRequired) {\n // Nullable error is already handled by AJV\n if (value === null) return fieldErrors;\n if (!value) {\n const message = m('inputSchema.validation.required', { rootName: 'input', fieldKey });\n fieldErrors.push(message);\n return fieldErrors;\n }\n\n const { useApifyProxy, proxyUrls } = value;\n if (!useApifyProxy && (!Array.isArray(proxyUrls) || proxyUrls.length === 0)) {\n fieldErrors.push(m('inputSchema.validation.proxyRequired', { rootName: 'input', fieldKey }));\n return fieldErrors;\n }\n }\n\n // Input is not required, so missing value is valid\n if (!value) return fieldErrors;\n\n const { useApifyProxy, proxyUrls, apifyProxyGroups, apifyProxyCountry } = value;\n\n if (!useApifyProxy && Array.isArray(proxyUrls)) {\n let invalidUrl = false;\n proxyUrls.forEach((url) => {\n if (!PROXY_URL_REGEX.test(url.trim())) invalidUrl = url.trim();\n });\n if (invalidUrl) {\n fieldErrors.push(m('inputSchema.validation.customProxyInvalid', { invalidUrl }));\n }\n }\n\n // Apify proxy country can be set only when using Apify proxy\n if (!useApifyProxy && apifyProxyCountry) {\n fieldErrors.push(m('inputSchema.validation.apifyProxyCountryWithoutApifyProxyForbidden'));\n }\n\n // If Apify proxy is not used skip additional checks\n if (!useApifyProxy) return fieldErrors;\n\n // If Apify proxy is used, check if there is a selected country and if so, check that it's valid (empty or a valid country code)\n if (apifyProxyCountry && !countries[apifyProxyCountry as keyof typeof countries]) {\n fieldErrors.push(m('inputSchema.validation.apifyProxyCountryInvalid', { invalidCountry: apifyProxyCountry }));\n }\n\n // If options are not provided skip additional checks\n if (!options) return fieldErrors;\n\n // if apifyProxyGroups exists it must be an array of strings\n const isStringsArray = (array: Array<string>) => array.every((item) => typeof item === 'string');\n if (apifyProxyGroups && !(Array.isArray(apifyProxyGroups) && isStringsArray(apifyProxyGroups))) {\n fieldErrors.push(m('inputSchema.validation.proxyGroupMustBeArrayOfStrings', { rootName: 'input', fieldKey }));\n return fieldErrors;\n }\n\n const selectedProxyGroups = (apifyProxyGroups || []);\n\n // Auto mode, check that user has access to alteast one proxy group usable in this mode\n if (!selectedProxyGroups.length && !options.hasAutoProxyGroups) {\n fieldErrors.push(m('inputSchema.validation.noAvailableAutoProxy'));\n return fieldErrors;\n }\n\n // Check if proxy groups selected by user are available to him\n const availableProxyGroupsById = {} as Record<string, boolean>;\n (options.availableProxyGroups || []).forEach((group) => { availableProxyGroupsById[group] = true; });\n const unavailableProxyGroups = selectedProxyGroups.filter((group: string) => !availableProxyGroupsById[group]);\n\n if (unavailableProxyGroups.length) {\n fieldErrors.push(m('inputSchema.validation.proxyGroupsNotAvailable', {\n rootName: 'input',\n fieldKey,\n groups: unavailableProxyGroups.join(', '),\n }));\n }\n\n // Check if any of the proxy groups are blocked and if yes then output the associated message\n const blockedProxyGroupsById = options.disabledProxyGroups || {};\n selectedProxyGroups\n .filter((group: string) => blockedProxyGroupsById[group])\n .forEach((blockedGroup: string) => {\n fieldErrors.push(blockedProxyGroupsById[blockedGroup]);\n });\n\n return fieldErrors;\n}\n\n/**\n * Uses AJV validator to validate input with input schema and then\n * does custom validation for our own properties (nullable, patternKey, patternValue)\n * @param validator Initialized AJV validator\n * @param inputSchema Valid input schema in object\n * @param input Input object to be validated\n * @param options (Optional) Additional validation configuration for certain fields\n */\nexport function validateInputUsingValidator(\n validator: ValidateFunction,\n inputSchema: Record<string, any>,\n input: Record<string, unknown>,\n options: Record<string, any> = {},\n) {\n const isValid = validator(input); // Check if input is valid based on schema values\n\n const { properties } = inputSchema;\n const required = inputSchema.required || [];\n\n let errors: { fieldKey: string, message: string }[] = [];\n // Process AJV validation errors\n if (!isValid) {\n errors = validator.errors!\n .map((error) => parseAjvError(error, 'input', properties, input))\n .filter((error) => !!error) as any[];\n }\n\n Object.keys(properties).forEach((property) => {\n const value = input[property] as Record<string, any>;\n const { type, editor, patternKey, patternValue } = properties[property];\n const fieldErrors = [];\n // Check that proxy is required, if yes, valides that it's correctly setup\n if (type === 'object' && editor === 'proxy') {\n const proxyValidationErrors = validateProxyField(property as any, value, required.includes(property), options.proxy);\n proxyValidationErrors.forEach((error) => {\n fieldErrors.push(error);\n });\n }\n // Check that array items fit patternKey and patternValue\n if (type === 'array' && value && Array.isArray(value)) {\n if (editor === 'requestListSources') {\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!item) invalidIndexes.push(index);\n else if (!item.url && !item.requestsFromUrl) invalidIndexes.push(index);\n else if (item.url && !URL_REGEX.test(item.url)) invalidIndexes.push(index);\n else if (item.requestsFromUrl && !URL_REGEX.test(item.requestsFromUrl)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.requestListSourcesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n }));\n }\n }\n // If patternKey is provided, then validate keys of objects in array\n if (patternKey && editor === 'keyValue') {\n const check = new RegExp(patternKey);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item.key)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayKeysInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternKey,\n }));\n }\n }\n // If patternValue is provided and editor is keyValue, then validate values of objecs in array\n if (patternValue && editor === 'keyValue') {\n const check = new RegExp(patternValue);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item.value)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternValue,\n }));\n }\n // If patternValue is provided and editor is stringList, then validate each item in array\n } else if (patternValue && editor === 'stringList') {\n const check = new RegExp(patternValue);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternValue,\n }));\n }\n }\n }\n // Check that object items fit patternKey and patternValue\n if (type === 'object' && value) {\n if (patternKey) {\n const check = new RegExp(patternKey);\n const invalidKeys: any[] = [];\n Object.keys(value).forEach((key) => {\n if (!check.test(key)) invalidKeys.push(key);\n });\n if (invalidKeys.length) {\n fieldErrors.push(m('inputSchema.validation.objectKeysInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidKeys: invalidKeys.join(','),\n pattern: patternKey,\n }));\n }\n }\n if (patternValue) {\n const check = new RegExp(patternValue);\n const invalidKeys: any[] = [];\n Object.keys(value).forEach((key) => {\n const propertyValue = value[key];\n if (typeof propertyValue !== 'string' || !check.test(propertyValue)) invalidKeys.push(key);\n });\n if (invalidKeys.length) {\n fieldErrors.push(m('inputSchema.validation.objectValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidKeys: invalidKeys.join(','),\n pattern: patternValue,\n }));\n }\n }\n }\n if (fieldErrors.length > 0) {\n const message = fieldErrors.join(', ');\n errors.push({ fieldKey: property, message });\n }\n });\n\n return errors;\n}\n\n/**\n * This functions parses all given JSON and then takes each of the jsFields.\n * Then if the field:\n * - is valid JS single function it replaces its single line string with a function delacation.\n * - is valid multiline JS code then replaces its single line string with `multiline` string\n * Then stringifies the code with given number of jsonSpacing spaces and finally prefixes whole\n * stringified JSON except the first line with globalSpacing spaces.\n */\nexport function makeInputJsFieldsReadable(json: string, jsFields: string[], jsonSpacing = 4, globalSpacing = 0): string {\n const parsedJson = JSON.parse(json);\n const replacements: Record<string, any> = {};\n\n jsFields.forEach((field) => {\n let maybeFunction = parsedJson[field];\n if (!maybeFunction || typeof maybeFunction !== 'string') return;\n\n let ast;\n try {\n ast = parse(maybeFunction, { ecmaVersion: 'latest' });\n } catch (err) {\n // Don't do anything in a case of invalid JS code.\n return;\n }\n\n const isMultiline = maybeFunction.includes('\\n');\n const isSingleFunction = ast\n && ast.body.length === 1\n && (\n ast.body[0].type === 'FunctionDeclaration'\n || (ast.body[0].type === 'ExpressionStatement' && ast.body[0].expression.type === 'ArrowFunctionExpression')\n );\n\n // If it's not a function declaration or multiline JS code then we do nothing.\n if (!isSingleFunction && !isMultiline) return;\n\n const spaces = (new Array(isSingleFunction ? jsonSpacing : jsonSpacing * 2)).fill(' ').join('');\n maybeFunction = maybeFunction\n .split('\\n').join(`\\n${spaces}`) // This prefixes each line with spaces.\n .trim(); // Trim whitespace on both sides\n\n const replacementValue = isSingleFunction\n ? maybeFunction.replace(/[;]+$/g, '') // Remove trailing semicolons\n : `\\`${maybeFunction}\\``;\n const replacementToken = `<<<REPLACEMENT_TOKEN:${Math.random()}>>>`;\n replacements[replacementToken] = replacementValue;\n parsedJson[field] = replacementToken;\n });\n\n let niceJson = JSON.stringify(parsedJson, null, jsonSpacing);\n\n Object.entries(replacements).forEach(([replacementToken, replacementValue]) => {\n niceJson = niceJson.replace(`\"${replacementToken}\"`, replacementValue);\n });\n\n const globalSpaces = (new Array(globalSpacing)).fill(' ').join('');\n niceJson = niceJson.split('\\n').join(`\\n${globalSpaces}`);\n\n return niceJson;\n}\n"],"mappings":"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","names":["definition","useApifyProxy","proxyUrls"]}
package/cjs/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import Ajv, { ErrorObject, ValidateFunction } from 'ajv';
3
3
  /**
4
4
  * Helper function to simulate intl formatMessage function
5
5
  */
6
- declare function m(stringId: string, variables?: Record<string, any>): any;
6
+ declare function m(stringId: string, variables?: Record<string, any>): string;
7
7
 
8
8
  var title = "JSON schema of Apify Actor INPUT_SCHEMA.json";
9
9
  var type = "object";
@@ -662,6 +662,78 @@ var schema = {
662
662
  definitions: definitions
663
663
  };
664
664
 
665
+ type CommonFieldDefinition<T> = {
666
+ title: string;
667
+ description: string;
668
+ default?: T;
669
+ prefill?: T;
670
+ example?: T;
671
+ nullable?: boolean;
672
+ sectionCaption?: string;
673
+ sectionDescription?: string;
674
+ };
675
+ type StringFieldDefinition = CommonFieldDefinition<string> & {
676
+ type: 'string';
677
+ editor: 'textfield' | 'textarea' | 'javascript' | 'python' | 'select' | 'datepicker' | 'hidden' | 'json';
678
+ pattern?: string;
679
+ minLength?: number;
680
+ maxLength?: number;
681
+ enum?: readonly string[];
682
+ enumTitles?: readonly string[];
683
+ isSecret?: boolean;
684
+ };
685
+ type BooleanFieldDefinition = CommonFieldDefinition<boolean> & {
686
+ type: 'boolean';
687
+ editor?: 'checkbox' | 'hidden';
688
+ groupCaption?: string;
689
+ groupDescription?: string;
690
+ };
691
+ type IntegerFieldDefinition = CommonFieldDefinition<number> & {
692
+ type: 'integer';
693
+ editor?: 'number' | 'hidden';
694
+ maximum?: number;
695
+ minimum?: number;
696
+ unit?: string;
697
+ };
698
+ type ObjectFieldDefinition = CommonFieldDefinition<object> & {
699
+ type: 'object';
700
+ editor: 'json' | 'proxy' | 'hidden';
701
+ patternKey?: string;
702
+ patternValue?: string;
703
+ maxProperties?: number;
704
+ minProperties?: number;
705
+ };
706
+ type ArrayFieldDefinition = CommonFieldDefinition<Array<unknown>> & {
707
+ type: 'array';
708
+ editor: 'json' | 'requestListSources' | 'pseudoUrls' | 'globs' | 'keyValue' | 'stringList' | 'select' | 'hidden';
709
+ placeholderKey?: string;
710
+ placeholderValue?: string;
711
+ patternKey?: string;
712
+ patternValue?: string;
713
+ maxItems?: number;
714
+ minItems?: number;
715
+ uniqueItems?: boolean;
716
+ items?: unknown;
717
+ };
718
+ type AllTypes = StringFieldDefinition['type'] | BooleanFieldDefinition['type'] | IntegerFieldDefinition['type'] | ObjectFieldDefinition['type'] | ArrayFieldDefinition['type'];
719
+ type MixedFieldDefinition = CommonFieldDefinition<never> & {
720
+ type: readonly AllTypes[];
721
+ editor: 'json';
722
+ };
723
+ type FieldDefinition = StringFieldDefinition | BooleanFieldDefinition | IntegerFieldDefinition | ObjectFieldDefinition | ArrayFieldDefinition | MixedFieldDefinition;
724
+ /**
725
+ * Type with checked base & properties
726
+ */
727
+ type InputSchema = {
728
+ type: 'object';
729
+ title: string;
730
+ description?: string;
731
+ schemaVersion: number;
732
+ properties: Record<string, FieldDefinition>;
733
+ required?: readonly string[];
734
+ $schema?: unknown;
735
+ };
736
+
665
737
  /**
666
738
  * This function parses AJV error and transforms it into a readable string.
667
739
  *
@@ -680,14 +752,14 @@ declare function parseAjvError(error: ErrorObject, rootName: string, properties?
680
752
  /**
681
753
  * Validates that all required fields are present in properties list
682
754
  */
683
- declare function validateExistenceOfRequiredFields<T extends Record<string, any>>(inputSchema: T): void;
755
+ declare function validateExistenceOfRequiredFields(inputSchema: InputSchema): void;
684
756
  /**
685
757
  * This function validates given input schema first just for basic structure then each field one by one,
686
758
  * then checks that all required fields are present and finally checks fully against the whole schema.
687
759
  *
688
760
  * This way we get the most accurate error message for user.
689
761
  */
690
- declare function validateInputSchema<T extends Record<string, any>>(validator: Ajv, inputSchema: T): void;
762
+ declare function validateInputSchema(validator: Ajv, inputSchema: Record<string, unknown>): asserts inputSchema is InputSchema;
691
763
 
692
764
  /**
693
765
  * Uses AJV validator to validate input with input schema and then
@@ -711,4 +783,4 @@ declare function validateInputUsingValidator(validator: ValidateFunction, inputS
711
783
  */
712
784
  declare function makeInputJsFieldsReadable(json: string, jsFields: string[], jsonSpacing?: number, globalSpacing?: number): string;
713
785
 
714
- export { schema as inputSchema, m, makeInputJsFieldsReadable, parseAjvError, validateExistenceOfRequiredFields, validateInputSchema, validateInputUsingValidator };
786
+ export { type ArrayFieldDefinition, type BooleanFieldDefinition, type FieldDefinition, type InputSchema, type IntegerFieldDefinition, type MixedFieldDefinition, type ObjectFieldDefinition, type StringFieldDefinition, schema as inputSchema, m, makeInputJsFieldsReadable, parseAjvError, validateExistenceOfRequiredFields, validateInputSchema, validateInputUsingValidator };
package/esm/index.d.mts CHANGED
@@ -3,7 +3,7 @@ import Ajv, { ErrorObject, ValidateFunction } from 'ajv';
3
3
  /**
4
4
  * Helper function to simulate intl formatMessage function
5
5
  */
6
- declare function m(stringId: string, variables?: Record<string, any>): any;
6
+ declare function m(stringId: string, variables?: Record<string, any>): string;
7
7
 
8
8
  var title = "JSON schema of Apify Actor INPUT_SCHEMA.json";
9
9
  var type = "object";
@@ -662,6 +662,78 @@ var schema = {
662
662
  definitions: definitions
663
663
  };
664
664
 
665
+ type CommonFieldDefinition<T> = {
666
+ title: string;
667
+ description: string;
668
+ default?: T;
669
+ prefill?: T;
670
+ example?: T;
671
+ nullable?: boolean;
672
+ sectionCaption?: string;
673
+ sectionDescription?: string;
674
+ };
675
+ type StringFieldDefinition = CommonFieldDefinition<string> & {
676
+ type: 'string';
677
+ editor: 'textfield' | 'textarea' | 'javascript' | 'python' | 'select' | 'datepicker' | 'hidden' | 'json';
678
+ pattern?: string;
679
+ minLength?: number;
680
+ maxLength?: number;
681
+ enum?: readonly string[];
682
+ enumTitles?: readonly string[];
683
+ isSecret?: boolean;
684
+ };
685
+ type BooleanFieldDefinition = CommonFieldDefinition<boolean> & {
686
+ type: 'boolean';
687
+ editor?: 'checkbox' | 'hidden';
688
+ groupCaption?: string;
689
+ groupDescription?: string;
690
+ };
691
+ type IntegerFieldDefinition = CommonFieldDefinition<number> & {
692
+ type: 'integer';
693
+ editor?: 'number' | 'hidden';
694
+ maximum?: number;
695
+ minimum?: number;
696
+ unit?: string;
697
+ };
698
+ type ObjectFieldDefinition = CommonFieldDefinition<object> & {
699
+ type: 'object';
700
+ editor: 'json' | 'proxy' | 'hidden';
701
+ patternKey?: string;
702
+ patternValue?: string;
703
+ maxProperties?: number;
704
+ minProperties?: number;
705
+ };
706
+ type ArrayFieldDefinition = CommonFieldDefinition<Array<unknown>> & {
707
+ type: 'array';
708
+ editor: 'json' | 'requestListSources' | 'pseudoUrls' | 'globs' | 'keyValue' | 'stringList' | 'select' | 'hidden';
709
+ placeholderKey?: string;
710
+ placeholderValue?: string;
711
+ patternKey?: string;
712
+ patternValue?: string;
713
+ maxItems?: number;
714
+ minItems?: number;
715
+ uniqueItems?: boolean;
716
+ items?: unknown;
717
+ };
718
+ type AllTypes = StringFieldDefinition['type'] | BooleanFieldDefinition['type'] | IntegerFieldDefinition['type'] | ObjectFieldDefinition['type'] | ArrayFieldDefinition['type'];
719
+ type MixedFieldDefinition = CommonFieldDefinition<never> & {
720
+ type: readonly AllTypes[];
721
+ editor: 'json';
722
+ };
723
+ type FieldDefinition = StringFieldDefinition | BooleanFieldDefinition | IntegerFieldDefinition | ObjectFieldDefinition | ArrayFieldDefinition | MixedFieldDefinition;
724
+ /**
725
+ * Type with checked base & properties
726
+ */
727
+ type InputSchema = {
728
+ type: 'object';
729
+ title: string;
730
+ description?: string;
731
+ schemaVersion: number;
732
+ properties: Record<string, FieldDefinition>;
733
+ required?: readonly string[];
734
+ $schema?: unknown;
735
+ };
736
+
665
737
  /**
666
738
  * This function parses AJV error and transforms it into a readable string.
667
739
  *
@@ -680,14 +752,14 @@ declare function parseAjvError(error: ErrorObject, rootName: string, properties?
680
752
  /**
681
753
  * Validates that all required fields are present in properties list
682
754
  */
683
- declare function validateExistenceOfRequiredFields<T extends Record<string, any>>(inputSchema: T): void;
755
+ declare function validateExistenceOfRequiredFields(inputSchema: InputSchema): void;
684
756
  /**
685
757
  * This function validates given input schema first just for basic structure then each field one by one,
686
758
  * then checks that all required fields are present and finally checks fully against the whole schema.
687
759
  *
688
760
  * This way we get the most accurate error message for user.
689
761
  */
690
- declare function validateInputSchema<T extends Record<string, any>>(validator: Ajv, inputSchema: T): void;
762
+ declare function validateInputSchema(validator: Ajv, inputSchema: Record<string, unknown>): asserts inputSchema is InputSchema;
691
763
 
692
764
  /**
693
765
  * Uses AJV validator to validate input with input schema and then
@@ -711,4 +783,4 @@ declare function validateInputUsingValidator(validator: ValidateFunction, inputS
711
783
  */
712
784
  declare function makeInputJsFieldsReadable(json: string, jsFields: string[], jsonSpacing?: number, globalSpacing?: number): string;
713
785
 
714
- export { schema as inputSchema, m, makeInputJsFieldsReadable, parseAjvError, validateExistenceOfRequiredFields, validateInputSchema, validateInputUsingValidator };
786
+ export { type ArrayFieldDefinition, type BooleanFieldDefinition, type FieldDefinition, type InputSchema, type IntegerFieldDefinition, type MixedFieldDefinition, type ObjectFieldDefinition, type StringFieldDefinition, schema as inputSchema, m, makeInputJsFieldsReadable, parseAjvError, validateExistenceOfRequiredFields, validateInputSchema, validateInputUsingValidator };
package/esm/index.mjs CHANGED
@@ -23,8 +23,7 @@ var intlStrings = {
23
23
  };
24
24
  function m(stringId, variables) {
25
25
  let text = intlStrings[stringId];
26
- if (!text)
27
- return stringId;
26
+ if (!text) return stringId;
28
27
  if (variables) {
29
28
  Object.keys(variables).forEach((variableName) => {
30
29
  text = text.split(`{${variableName}}`).join(variables[variableName]);
@@ -348,17 +347,19 @@ function parseAjvError(error, rootName, properties = {}, input = {}) {
348
347
  }
349
348
  __name(parseAjvError, "parseAjvError");
350
349
  var validateAgainstSchemaOrThrow = /* @__PURE__ */ __name((validator, obj, inputSchema, rootName) => {
351
- if (validator.validate(inputSchema, obj))
352
- return;
350
+ if (validator.validate(inputSchema, obj)) return;
353
351
  const errorMessage = parseAjvError(validator.errors[0], rootName)?.message;
354
352
  throw new Error(`Input schema is not valid (${errorMessage})`);
355
353
  }, "validateAgainstSchemaOrThrow");
356
- var validateBasicStructure = /* @__PURE__ */ __name((validator, obj) => {
357
- const schemaWithoutProperties = { ...schema_default };
358
- schemaWithoutProperties.properties = { ...schema_default.properties, properties: { type: "object" } };
354
+ function validateBasicStructure(validator, obj) {
355
+ const schemaWithoutProperties = {
356
+ ...schema_default,
357
+ properties: { ...schema_default.properties, properties: { type: "object" } }
358
+ };
359
359
  validateAgainstSchemaOrThrow(validator, obj, schemaWithoutProperties, "schema");
360
- }, "validateBasicStructure");
361
- var validateField = /* @__PURE__ */ __name((validator, fieldSchema, fieldKey) => {
360
+ }
361
+ __name(validateBasicStructure, "validateBasicStructure");
362
+ function validateField(validator, fieldSchema, fieldKey) {
362
363
  const matchingDefinitions = Object.values(definitions).filter((definition2) => {
363
364
  return definition2.properties.type.enum ? definition2.properties.type.enum[0] === fieldSchema.type : Array.isArray(fieldSchema.type);
364
365
  });
@@ -372,29 +373,32 @@ var validateField = /* @__PURE__ */ __name((validator, fieldSchema, fieldKey) =>
372
373
  }
373
374
  if (fieldSchema.enum) {
374
375
  const definition2 = matchingDefinitions.filter((item) => !!item.properties.enum).pop();
375
- if (!definition2)
376
- throw new Error('Input schema validation failed to find "enum property" definition');
376
+ if (!definition2) throw new Error('Input schema validation failed to find "enum property" definition');
377
377
  validateAgainstSchemaOrThrow(validator, fieldSchema, definition2, `schema.properties.${fieldKey}.enum`);
378
378
  return;
379
379
  }
380
380
  const definition = matchingDefinitions.filter((item) => !item.properties.enum).pop();
381
- if (!definition)
382
- throw new Error('Input schema validation failed to find other than "enum property" definition');
381
+ if (!definition) throw new Error('Input schema validation failed to find other than "enum property" definition');
383
382
  validateAgainstSchemaOrThrow(validator, fieldSchema, definition, `schema.properties.${fieldKey}`);
384
- }, "validateField");
383
+ }
384
+ __name(validateField, "validateField");
385
+ function validateProperties(inputSchema, validator) {
386
+ Object.entries(inputSchema.properties).forEach(
387
+ ([fieldKey, fieldSchema]) => validateField(validator, fieldSchema, fieldKey)
388
+ );
389
+ }
390
+ __name(validateProperties, "validateProperties");
385
391
  function validateExistenceOfRequiredFields(inputSchema) {
386
- if (!inputSchema?.required?.length)
387
- return;
392
+ if (!inputSchema?.required?.length) return;
388
393
  Object.values(inputSchema?.required).forEach((fieldKey) => {
389
- if (inputSchema?.properties[fieldKey])
390
- return;
394
+ if (inputSchema?.properties[fieldKey]) return;
391
395
  throw new Error(m("inputSchema.validation.missingRequiredField", { fieldKey }));
392
396
  });
393
397
  }
394
398
  __name(validateExistenceOfRequiredFields, "validateExistenceOfRequiredFields");
395
399
  function validateInputSchema(validator, inputSchema) {
396
400
  validateBasicStructure(validator, inputSchema);
397
- Object.entries(inputSchema.properties).forEach(([fieldKey, fieldSchema]) => validateField(validator, fieldSchema, fieldKey));
401
+ validateProperties(inputSchema, validator);
398
402
  validateExistenceOfRequiredFields(inputSchema);
399
403
  validateAgainstSchemaOrThrow(validator, inputSchema, schema_default, "schema");
400
404
  }
@@ -402,13 +406,12 @@ __name(validateInputSchema, "validateInputSchema");
402
406
 
403
407
  // src/utilities.ts
404
408
  import { PROXY_URL_REGEX, URL_REGEX } from "@apify/consts";
405
- import { countries } from "countries-list";
406
409
  import { parse } from "acorn-loose";
410
+ import { countries } from "countries-list";
407
411
  function validateProxyField(fieldKey, value, isRequired = false, options = null) {
408
412
  const fieldErrors = [];
409
413
  if (isRequired) {
410
- if (value === null)
411
- return fieldErrors;
414
+ if (value === null) return fieldErrors;
412
415
  if (!value) {
413
416
  const message = m("inputSchema.validation.required", { rootName: "input", fieldKey });
414
417
  fieldErrors.push(message);
@@ -420,14 +423,12 @@ function validateProxyField(fieldKey, value, isRequired = false, options = null)
420
423
  return fieldErrors;
421
424
  }
422
425
  }
423
- if (!value)
424
- return fieldErrors;
426
+ if (!value) return fieldErrors;
425
427
  const { useApifyProxy, proxyUrls, apifyProxyGroups, apifyProxyCountry } = value;
426
428
  if (!useApifyProxy && Array.isArray(proxyUrls)) {
427
429
  let invalidUrl = false;
428
430
  proxyUrls.forEach((url) => {
429
- if (!PROXY_URL_REGEX.test(url.trim()))
430
- invalidUrl = url.trim();
431
+ if (!PROXY_URL_REGEX.test(url.trim())) invalidUrl = url.trim();
431
432
  });
432
433
  if (invalidUrl) {
433
434
  fieldErrors.push(m("inputSchema.validation.customProxyInvalid", { invalidUrl }));
@@ -436,13 +437,11 @@ function validateProxyField(fieldKey, value, isRequired = false, options = null)
436
437
  if (!useApifyProxy && apifyProxyCountry) {
437
438
  fieldErrors.push(m("inputSchema.validation.apifyProxyCountryWithoutApifyProxyForbidden"));
438
439
  }
439
- if (!useApifyProxy)
440
- return fieldErrors;
440
+ if (!useApifyProxy) return fieldErrors;
441
441
  if (apifyProxyCountry && !countries[apifyProxyCountry]) {
442
442
  fieldErrors.push(m("inputSchema.validation.apifyProxyCountryInvalid", { invalidCountry: apifyProxyCountry }));
443
443
  }
444
- if (!options)
445
- return fieldErrors;
444
+ if (!options) return fieldErrors;
446
445
  const isStringsArray = /* @__PURE__ */ __name((array) => array.every((item) => typeof item === "string"), "isStringsArray");
447
446
  if (apifyProxyGroups && !(Array.isArray(apifyProxyGroups) && isStringsArray(apifyProxyGroups))) {
448
447
  fieldErrors.push(m("inputSchema.validation.proxyGroupMustBeArrayOfStrings", { rootName: "input", fieldKey }));
@@ -494,14 +493,10 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
494
493
  if (editor === "requestListSources") {
495
494
  const invalidIndexes = [];
496
495
  value.forEach((item, index) => {
497
- if (!item)
498
- invalidIndexes.push(index);
499
- else if (!item.url && !item.requestsFromUrl)
500
- invalidIndexes.push(index);
501
- else if (item.url && !URL_REGEX.test(item.url))
502
- invalidIndexes.push(index);
503
- else if (item.requestsFromUrl && !URL_REGEX.test(item.requestsFromUrl))
504
- invalidIndexes.push(index);
496
+ if (!item) invalidIndexes.push(index);
497
+ else if (!item.url && !item.requestsFromUrl) invalidIndexes.push(index);
498
+ else if (item.url && !URL_REGEX.test(item.url)) invalidIndexes.push(index);
499
+ else if (item.requestsFromUrl && !URL_REGEX.test(item.requestsFromUrl)) invalidIndexes.push(index);
505
500
  });
506
501
  if (invalidIndexes.length) {
507
502
  fieldErrors.push(m("inputSchema.validation.requestListSourcesInvalid", {
@@ -515,8 +510,7 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
515
510
  const check = new RegExp(patternKey);
516
511
  const invalidIndexes = [];
517
512
  value.forEach((item, index) => {
518
- if (!check.test(item.key))
519
- invalidIndexes.push(index);
513
+ if (!check.test(item.key)) invalidIndexes.push(index);
520
514
  });
521
515
  if (invalidIndexes.length) {
522
516
  fieldErrors.push(m("inputSchema.validation.arrayKeysInvalid", {
@@ -531,8 +525,7 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
531
525
  const check = new RegExp(patternValue);
532
526
  const invalidIndexes = [];
533
527
  value.forEach((item, index) => {
534
- if (!check.test(item.value))
535
- invalidIndexes.push(index);
528
+ if (!check.test(item.value)) invalidIndexes.push(index);
536
529
  });
537
530
  if (invalidIndexes.length) {
538
531
  fieldErrors.push(m("inputSchema.validation.arrayValuesInvalid", {
@@ -546,8 +539,7 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
546
539
  const check = new RegExp(patternValue);
547
540
  const invalidIndexes = [];
548
541
  value.forEach((item, index) => {
549
- if (!check.test(item))
550
- invalidIndexes.push(index);
542
+ if (!check.test(item)) invalidIndexes.push(index);
551
543
  });
552
544
  if (invalidIndexes.length) {
553
545
  fieldErrors.push(m("inputSchema.validation.arrayValuesInvalid", {
@@ -564,8 +556,7 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
564
556
  const check = new RegExp(patternKey);
565
557
  const invalidKeys = [];
566
558
  Object.keys(value).forEach((key) => {
567
- if (!check.test(key))
568
- invalidKeys.push(key);
559
+ if (!check.test(key)) invalidKeys.push(key);
569
560
  });
570
561
  if (invalidKeys.length) {
571
562
  fieldErrors.push(m("inputSchema.validation.objectKeysInvalid", {
@@ -581,8 +572,7 @@ function validateInputUsingValidator(validator, inputSchema, input, options = {}
581
572
  const invalidKeys = [];
582
573
  Object.keys(value).forEach((key) => {
583
574
  const propertyValue = value[key];
584
- if (typeof propertyValue !== "string" || !check.test(propertyValue))
585
- invalidKeys.push(key);
575
+ if (typeof propertyValue !== "string" || !check.test(propertyValue)) invalidKeys.push(key);
586
576
  });
587
577
  if (invalidKeys.length) {
588
578
  fieldErrors.push(m("inputSchema.validation.objectValuesInvalid", {
@@ -607,8 +597,7 @@ function makeInputJsFieldsReadable(json, jsFields, jsonSpacing = 4, globalSpacin
607
597
  const replacements = {};
608
598
  jsFields.forEach((field) => {
609
599
  let maybeFunction = parsedJson[field];
610
- if (!maybeFunction || typeof maybeFunction !== "string")
611
- return;
600
+ if (!maybeFunction || typeof maybeFunction !== "string") return;
612
601
  let ast;
613
602
  try {
614
603
  ast = parse(maybeFunction, { ecmaVersion: "latest" });
@@ -617,8 +606,7 @@ function makeInputJsFieldsReadable(json, jsFields, jsonSpacing = 4, globalSpacin
617
606
  }
618
607
  const isMultiline = maybeFunction.includes("\n");
619
608
  const isSingleFunction = ast && ast.body.length === 1 && (ast.body[0].type === "FunctionDeclaration" || ast.body[0].type === "ExpressionStatement" && ast.body[0].expression.type === "ArrowFunctionExpression");
620
- if (!isSingleFunction && !isMultiline)
621
- return;
609
+ if (!isSingleFunction && !isMultiline) return;
622
610
  const spaces = new Array(isSingleFunction ? jsonSpacing : jsonSpacing * 2).fill(" ").join("");
623
611
  maybeFunction = maybeFunction.split("\n").join(`
624
612
  ${spaces}`).trim();
package/esm/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/intl.ts","../../src/schema.json","../../src/input_schema.ts","../../src/utilities.ts"],"sourcesContent":["const intlStrings = {\n 'inputSchema.validation.generic':\n 'Field {rootName}.{fieldKey} {message}',\n 'inputSchema.validation.required':\n 'Field {rootName}.{fieldKey} is required',\n 'inputSchema.validation.proxyRequired':\n 'Field {rootName}.{fieldKey} is required. Please provide custom proxy URLs or use Apify Proxy.',\n 'inputSchema.validation.requestListSourcesInvalid':\n 'Items in {rootName}.{fieldKey} at positions [{invalidIndexes}] do not contain valid URLs',\n 'inputSchema.validation.arrayKeysInvalid':\n 'Keys in {rootName}.{fieldKey} at positions [{invalidIndexes}] must match regular expression \"{pattern}\"',\n 'inputSchema.validation.arrayValuesInvalid':\n 'Values in {rootName}.{fieldKey} at positions [{invalidIndexes}] must match regular expression \"{pattern}\"',\n 'inputSchema.validation.objectKeysInvalid':\n 'Keys [{invalidKeys}] in {rootName}.{fieldKey} must match regular expression \"{pattern}',\n 'inputSchema.validation.objectValuesInvalid':\n 'Keys [{invalidKeys}] in {rootName}.{fieldKey} must have string value which matches regular expression \"{pattern}\"',\n 'inputSchema.validation.additionalProperty':\n 'Property {rootName}.{fieldKey} is not allowed.',\n 'inputSchema.validation.proxyGroupsNotAvailable':\n 'You currently do not have access to proxy groups: {groups}',\n 'inputSchema.validation.customProxyInvalid':\n 'Proxy URL \"{invalidUrl}\" has invalid format, it must be http[s]://[username[:password]]@hostname:port.',\n 'inputSchema.validation.apifyProxyCountryInvalid':\n 'Country code \"{invalidCountry}\" is invalid. Only ISO 3166-1 alpha-2 country codes are supported.',\n 'inputSchema.validation.apifyProxyCountryWithoutApifyProxyForbidden':\n 'The country for Apify Proxy can be specified only when using Apify Proxy.',\n 'inputSchema.validation.noAvailableAutoProxy':\n 'Currently you do not have access to any proxy group usable in automatic mode.',\n 'inputSchema.validation.noMatchingDefinition':\n 'Field schema.properties.{fieldKey} is not matching any input schema type definition. Please make sure that it\\'s type is valid.',\n 'inputSchema.validation.missingRequiredField':\n 'Field schema.properties.{fieldKey} does not exist, but it is specified in schema.required. Either define the field or remove it from schema.required.',\n 'inputSchema.validation.proxyGroupMustBeArrayOfStrings':\n 'Field {rootName}.{fieldKey}.apifyProxyGroups must be an array of strings.',\n};\n\n/**\n * Helper function to simulate intl formatMessage function\n */\nexport function m(stringId: string, variables?: Record<string, any>) {\n let text = intlStrings[stringId];\n if (!text) return stringId;\n\n if (variables) {\n Object.keys(variables).forEach((variableName) => {\n text = text.split(`{${variableName}}`).join(variables[variableName]);\n });\n }\n\n return text;\n}\n","{\n \"title\": \"JSON schema of Apify Actor INPUT_SCHEMA.json\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"schemaVersion\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 1\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\"object\"]\n },\n \"required\": {\n \"type\": \"array\",\n \"minItems\": 0,\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"additionalProperties\": {\n \"type\": \"boolean\"\n },\n \"properties\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \"^\": {\n \"oneOf\": [\n { \"$ref\": \"#/definitions/stringProperty\" },\n { \"$ref\": \"#/definitions/stringEnumProperty\" },\n { \"$ref\": \"#/definitions/arrayProperty\" },\n { \"$ref\": \"#/definitions/objectProperty\" },\n { \"$ref\": \"#/definitions/integerProperty\" },\n { \"$ref\": \"#/definitions/booleanProperty\" },\n { \"$ref\": \"#/definitions/anyProperty\" }\n ]\n }\n }\n }\n },\n \"additionalProperties\": false,\n \"required\": [\"title\", \"type\", \"properties\", \"schemaVersion\"],\n \"definitions\": {\n \"stringEnumProperty\": {\n \"title\": \"Enum property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"editor\": { \"enum\": [\"select\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"string\" },\n \"prefill\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" },\n \"enum\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"minItems\": 1,\n \"uniqueItems\": true\n },\n \"enumTitles\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"minItems\": 1\n }\n },\n \"required\": [\"type\", \"title\", \"description\", \"enum\"]\n },\n \"stringProperty\": {\n \"title\": \"String property\",\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"javascript\", \"python\", \"textfield\", \"textarea\", \"datepicker\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"],\n \"if\": {\n \"properties\": {\n \"isSecret\": {\n \"not\": {\n \"const\": true\n }\n }\n }\n },\n \"then\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"string\" },\n \"prefill\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"pattern\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minLength\": { \"type\": \"integer\" },\n \"maxLength\": { \"type\": \"integer\" },\n \"editor\": { \"enum\": [\"javascript\", \"python\", \"textfield\", \"textarea\", \"datepicker\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n }\n },\n \"else\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"textfield\", \"textarea\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n }\n }\n },\n \"arrayProperty\": {\n \"title\": \"Array property\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"enum\": [\"array\"] },\n \"editor\": { \"enum\": [\"json\", \"requestListSources\", \"pseudoUrls\", \"globs\", \"keyValue\", \"stringList\", \"select\", \"hidden\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"array\" },\n \"prefill\": { \"type\": \"array\" },\n \"example\": { \"type\": \"array\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minItems\": { \"type\": \"integer\" },\n \"maxItems\": { \"type\": \"integer\" },\n \"uniqueItems\": { \"type\": \"boolean\" },\n\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"additionalProperties\": true,\n \"required\": [\"type\", \"title\", \"description\", \"editor\"],\n \"if\": {\n \"properties\": {\n \"editor\": { \"const\": \"select\" }\n }\n },\n \"then\": {\n \"required\": [\"items\"],\n \"properties\": {\n \"items\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"enum\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"enumTitles\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n }\n },\n \"required\": [\"type\", \"enum\"]\n }\n }\n },\n \"else\": {\n \"properties\": {\n \"placeholderKey\": { \"type\": \"string\" },\n \"placeholderValue\": { \"type\": \"string\" },\n \"patternKey\": { \"type\": \"string\" },\n \"patternValue\": { \"type\": \"string\" }\n }\n }\n },\n \"objectProperty\": {\n \"title\": \"Object property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"object\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"object\" },\n \"prefill\": { \"type\": \"object\" },\n \"example\": { \"type\": \"object\" },\n \"patternKey\": { \"type\": \"string\" },\n \"patternValue\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minProperties\": { \"type\": \"integer\" },\n \"maxProperties\": { \"type\": \"integer\" },\n\n \"editor\": { \"enum\": [\"json\", \"proxy\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"]\n },\n \"integerProperty\": {\n \"title\": \"Integer property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"integer\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"integer\" },\n \"prefill\": { \"type\": \"integer\" },\n \"example\": { \"type\": \"integer\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minimum\": { \"type\": \"integer\" },\n \"maximum\": { \"type\": \"integer\" },\n \"unit\": { \"type\": \"string\" },\n \"editor\": { \"enum\": [\"number\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\"]\n },\n \"booleanProperty\": {\n \"title\": \"Boolean property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"boolean\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"boolean\" },\n \"prefill\": { \"type\": \"boolean\" },\n \"example\": { \"type\": \"boolean\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"groupCaption\": { \"type\": \"string\" },\n \"groupDescription\": { \"type\": \"string\" },\n \"editor\": { \"enum\": [\"checkbox\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\"]\n },\n \"anyProperty\": {\n \"title\": \"Any property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": {\n \"type\": [\"array\"],\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"]\n },\n \"uniqueItems\": true,\n \"additionalItems\": false,\n \"minItems\": 1\n },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"prefill\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"example\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"json\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"]\n }\n }\n}\n","import Ajv, { ErrorObject } from 'ajv';\nimport schema from './schema.json';\nimport { m } from './intl';\n\nexport { schema as inputSchema };\nconst { definitions } = schema;\n\n/**\n * This function parses AJV error and transforms it into a readable string.\n *\n * @param error An error as returned from AJV.\n * @param rootName Usually 'input' or 'schema' based on if we are passing the input or schema.\n * @param properties (Used only when parsing input errors) List of input schema properties.\n * @param input (Used only when parsing input errors) Actual input that is being parsed.\n * @returns {null|{fieldKey: *, message: *}}\n */\nexport function parseAjvError(\n error: ErrorObject,\n rootName: string,\n properties: Record<string, { nullable?: boolean }> = {},\n input: Record<string, unknown> = {},\n): { fieldKey: string; message: string } | null {\n // There are 3 possible errors comming from validation:\n // - either { keword: 'anything', instancePath: '/someField', message: 'error message that we can use' }\n // - or { keyword: 'additionalProperties', params: { additionalProperty: 'field' }, message: 'must NOT have additional properties' }\n // - or { keyword: 'required', instancePath: '', params.missingProperty: 'someField' }\n\n let fieldKey: string;\n let message: string;\n\n // If error is with keyword type, it means that type of input is incorrect\n // this can mean that provided value is null\n if (error.keyword === 'type') {\n fieldKey = error.instancePath.split('/').pop()!;\n // Check if value is null and field is nullable, if yes, then skip this error\n if (properties[fieldKey] && properties[fieldKey].nullable && input[fieldKey] === null) {\n return null;\n }\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: error.message });\n } else if (error.keyword === 'required') {\n fieldKey = error.params.missingProperty;\n message = m('inputSchema.validation.required', { rootName, fieldKey });\n } else if (error.keyword === 'additionalProperties') {\n fieldKey = error.params.additionalProperty;\n message = m('inputSchema.validation.additionalProperty', { rootName, fieldKey });\n } else if (error.keyword === 'enum') {\n fieldKey = error.instancePath.split('/').pop()!;\n const errorMessage = `${error.message}: \"${error.params.allowedValues.join('\", \"')}\"`;\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: errorMessage });\n } else {\n fieldKey = error.instancePath.split('/').pop()!;\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: error.message });\n }\n\n return { fieldKey, message };\n}\n\n/**\n * Validates given object against schema and throws a human readable error.\n */\nconst validateAgainstSchemaOrThrow = <T> (validator: Ajv, obj: T, inputSchema: any, rootName: string) => {\n if (validator.validate(inputSchema, obj)) return;\n\n const errorMessage = parseAjvError(validator.errors![0], rootName)?.message;\n throw new Error(`Input schema is not valid (${errorMessage})`);\n};\n\n/**\n * This validates given object only against the basic input schema without checking the particular fields.\n * We override schema.properties.properties not to validate field defitions.\n */\nconst validateBasicStructure = <T> (validator: Ajv, obj: T) => {\n const schemaWithoutProperties = { ...schema };\n schemaWithoutProperties.properties = { ...schema.properties, properties: { type: 'object' } as any };\n validateAgainstSchemaOrThrow(validator, obj, schemaWithoutProperties, 'schema');\n};\n\n/**\n * Validates particular field against it's schema.\n */\nconst validateField = <T extends Record<string, any>> (validator: Ajv, fieldSchema: T, fieldKey: string) => {\n const matchingDefinitions = Object\n .values<any>(definitions) // cast as any, as the code in first branch seems to be invalid\n .filter((definition) => {\n return definition.properties.type.enum\n // This is a normal case where fieldSchema.type can be only one possible value matching definition.properties.type.enum.0\n ? definition.properties.type.enum[0] === fieldSchema.type\n // This is a type \"Any\" where fieldSchema.type is an array of possible values\n : Array.isArray(fieldSchema.type);\n });\n\n // There is not matching definition.\n if (matchingDefinitions.length === 0) {\n const errorMessage = m('inputSchema.validation.noMatchingDefinition', { fieldKey });\n throw new Error(`Input schema is not valid (${errorMessage})`);\n }\n\n // If there is only one matching then we are done and simply compare it.\n if (matchingDefinitions.length === 1) {\n validateAgainstSchemaOrThrow(validator, fieldSchema, matchingDefinitions[0], `schema.properties.${fieldKey}`);\n return;\n }\n\n // If there are more matching definitions then the type is string and we need to get the right one.\n // If the definition contains \"enum\" property then it's enum type.\n if (fieldSchema.enum) {\n const definition = matchingDefinitions.filter((item) => !!item.properties.enum).pop();\n if (!definition) throw new Error('Input schema validation failed to find \"enum property\" definition');\n validateAgainstSchemaOrThrow(validator, fieldSchema, definition, `schema.properties.${fieldKey}.enum`);\n return;\n }\n // Otherwise we use the other definition.\n const definition = matchingDefinitions.filter((item) => !item.properties.enum).pop();\n if (!definition) throw new Error('Input schema validation failed to find other than \"enum property\" definition');\n\n validateAgainstSchemaOrThrow(validator, fieldSchema, definition, `schema.properties.${fieldKey}`);\n};\n\n/**\n * Validates that all required fields are present in properties list\n */\nexport function validateExistenceOfRequiredFields<T extends Record<string, any>>(inputSchema: T) {\n // If the input schema does not have any required fields, we do not need to validate them\n if (!inputSchema?.required?.length) return;\n\n Object.values(inputSchema?.required).forEach((fieldKey) => {\n // If the required field is present in the list of properties, we can check the next one\n if (inputSchema?.properties[fieldKey as string]) return;\n\n // The required field is not defined in list of properties. Which means the schema is not valid.\n throw new Error(m('inputSchema.validation.missingRequiredField', { fieldKey }));\n });\n}\n\n/**\n * This function validates given input schema first just for basic structure then each field one by one,\n * then checks that all required fields are present and finally checks fully against the whole schema.\n *\n * This way we get the most accurate error message for user.\n */\nexport function validateInputSchema<T extends Record<string, any>>(validator: Ajv, inputSchema: T) {\n // First validate just basic structure without fields.\n validateBasicStructure(validator, inputSchema);\n\n // Then validate each field separately.\n Object.entries<any>(inputSchema.properties).forEach(([fieldKey, fieldSchema]) => validateField(validator, fieldSchema, fieldKey));\n\n // Next validate if required fields are actually present in the schema\n validateExistenceOfRequiredFields(inputSchema);\n\n // Finally just to be sure run validation against the whole shema.\n validateAgainstSchemaOrThrow(validator, inputSchema, schema, 'schema');\n}\n","import { PROXY_URL_REGEX, URL_REGEX } from '@apify/consts';\nimport { countries } from 'countries-list';\nimport { ValidateFunction } from 'ajv';\nimport { parse } from 'acorn-loose';\nimport { m } from './intl';\nimport { parseAjvError } from './input_schema';\n\n/**\n * Validates input field configured with proxy editor\n * @param fieldKey Proxy field value\n * @param value Proxy field value\n * @param [isRequired] Whether the field is required or not\n * @param [options] Information about proxy groups availability\n * @param [options.hasAutoProxyGroups] Informs validation whether user has atleast one proxy group available in auto mode\n * @param [options.availableProxyGroups] List of available proxy groups\n * @param [options.disabledProxyGroups] Object with groupId as key and error message as value (mostly for residential/SERP)\n */\nfunction validateProxyField(\n fieldKey: Record<string, unknown>,\n value: Record<string, any>,\n isRequired = false,\n options: { hasAutoProxyGroups?: boolean; availableProxyGroups?: string[]; disabledProxyGroups?: Record<string, unknown> } | null = null,\n) {\n const fieldErrors: any[] = [];\n if (isRequired) {\n // Nullable error is already handled by AJV\n if (value === null) return fieldErrors;\n if (!value) {\n const message = m('inputSchema.validation.required', { rootName: 'input', fieldKey });\n fieldErrors.push(message);\n return fieldErrors;\n }\n\n const { useApifyProxy, proxyUrls } = value;\n if (!useApifyProxy && (!Array.isArray(proxyUrls) || proxyUrls.length === 0)) {\n fieldErrors.push(m('inputSchema.validation.proxyRequired', { rootName: 'input', fieldKey }));\n return fieldErrors;\n }\n }\n\n // Input is not required, so missing value is valid\n if (!value) return fieldErrors;\n\n const { useApifyProxy, proxyUrls, apifyProxyGroups, apifyProxyCountry } = value;\n\n if (!useApifyProxy && Array.isArray(proxyUrls)) {\n let invalidUrl = false;\n proxyUrls.forEach((url) => {\n if (!PROXY_URL_REGEX.test(url.trim())) invalidUrl = url.trim();\n });\n if (invalidUrl) {\n fieldErrors.push(m('inputSchema.validation.customProxyInvalid', { invalidUrl }));\n }\n }\n\n // Apify proxy country can be set only when using Apify proxy\n if (!useApifyProxy && apifyProxyCountry) {\n fieldErrors.push(m('inputSchema.validation.apifyProxyCountryWithoutApifyProxyForbidden'));\n }\n\n // If Apify proxy is not used skip additional checks\n if (!useApifyProxy) return fieldErrors;\n\n // If Apify proxy is used, check if there is a selected country and if so, check that it's valid (empty or a valid country code)\n if (apifyProxyCountry && !countries[apifyProxyCountry]) {\n fieldErrors.push(m('inputSchema.validation.apifyProxyCountryInvalid', { invalidCountry: apifyProxyCountry }));\n }\n\n // If options are not provided skip additional checks\n if (!options) return fieldErrors;\n\n // if apifyProxyGroups exists it must be an array of strings\n const isStringsArray = (array: Array<string>) => array.every((item) => typeof item === 'string');\n if (apifyProxyGroups && !(Array.isArray(apifyProxyGroups) && isStringsArray(apifyProxyGroups))) {\n fieldErrors.push(m('inputSchema.validation.proxyGroupMustBeArrayOfStrings', { rootName: 'input', fieldKey }));\n return fieldErrors;\n }\n\n const selectedProxyGroups = (apifyProxyGroups || []);\n\n // Auto mode, check that user has access to alteast one proxy group usable in this mode\n if (!selectedProxyGroups.length && !options.hasAutoProxyGroups) {\n fieldErrors.push(m('inputSchema.validation.noAvailableAutoProxy'));\n return fieldErrors;\n }\n\n // Check if proxy groups selected by user are available to him\n const availableProxyGroupsById = {};\n (options.availableProxyGroups || []).forEach((group) => { availableProxyGroupsById[group] = true; });\n const unavailableProxyGroups = selectedProxyGroups.filter((group: string) => !availableProxyGroupsById[group]);\n\n if (unavailableProxyGroups.length) {\n fieldErrors.push(m('inputSchema.validation.proxyGroupsNotAvailable', {\n rootName: 'input',\n fieldKey,\n groups: unavailableProxyGroups.join(', '),\n }));\n }\n\n // Check if any of the proxy groups are blocked and if yes then output the associated message\n const blockedProxyGroupsById = options.disabledProxyGroups || {};\n selectedProxyGroups\n .filter((group: string) => blockedProxyGroupsById[group])\n .forEach((blockedGroup: string) => {\n fieldErrors.push(blockedProxyGroupsById[blockedGroup]);\n });\n\n return fieldErrors;\n}\n\n/**\n * Uses AJV validator to validate input with input schema and then\n * does custom validation for our own properties (nullable, patternKey, patternValue)\n * @param validator Initialized AJV validator\n * @param inputSchema Valid input schema in object\n * @param input Input object to be validated\n * @param options (Optional) Additional validation configuration for certain fields\n */\nexport function validateInputUsingValidator(\n validator: ValidateFunction,\n inputSchema: Record<string, any>,\n input: Record<string, unknown>,\n options: Record<string, any> = {},\n) {\n const isValid = validator(input); // Check if input is valid based on schema values\n\n const { properties } = inputSchema;\n const required = inputSchema.required || [];\n\n let errors: { fieldKey: string, message: string }[] = [];\n // Process AJV validation errors\n if (!isValid) {\n errors = validator.errors!\n .map((error) => parseAjvError(error, 'input', properties, input))\n .filter((error) => !!error) as any[];\n }\n\n Object.keys(properties).forEach((property) => {\n const value = input[property] as Record<string, any>;\n const { type, editor, patternKey, patternValue } = properties[property];\n const fieldErrors = [];\n // Check that proxy is required, if yes, valides that it's correctly setup\n if (type === 'object' && editor === 'proxy') {\n const proxyValidationErrors = validateProxyField(property as any, value, required.includes(property), options.proxy);\n proxyValidationErrors.forEach((error) => {\n fieldErrors.push(error);\n });\n }\n // Check that array items fit patternKey and patternValue\n if (type === 'array' && value && Array.isArray(value)) {\n if (editor === 'requestListSources') {\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!item) invalidIndexes.push(index);\n else if (!item.url && !item.requestsFromUrl) invalidIndexes.push(index);\n else if (item.url && !URL_REGEX.test(item.url)) invalidIndexes.push(index);\n else if (item.requestsFromUrl && !URL_REGEX.test(item.requestsFromUrl)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.requestListSourcesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n }));\n }\n }\n // If patternKey is provided, then validate keys of objects in array\n if (patternKey && editor === 'keyValue') {\n const check = new RegExp(patternKey);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item.key)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayKeysInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternKey,\n }));\n }\n }\n // If patternValue is provided and editor is keyValue, then validate values of objecs in array\n if (patternValue && editor === 'keyValue') {\n const check = new RegExp(patternValue);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item.value)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternValue,\n }));\n }\n // If patternValue is provided and editor is stringList, then validate each item in array\n } else if (patternValue && editor === 'stringList') {\n const check = new RegExp(patternValue);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternValue,\n }));\n }\n }\n }\n // Check that object items fit patternKey and patternValue\n if (type === 'object' && value) {\n if (patternKey) {\n const check = new RegExp(patternKey);\n const invalidKeys: any[] = [];\n Object.keys(value).forEach((key) => {\n if (!check.test(key)) invalidKeys.push(key);\n });\n if (invalidKeys.length) {\n fieldErrors.push(m('inputSchema.validation.objectKeysInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidKeys: invalidKeys.join(','),\n pattern: patternKey,\n }));\n }\n }\n if (patternValue) {\n const check = new RegExp(patternValue);\n const invalidKeys: any[] = [];\n Object.keys(value).forEach((key) => {\n const propertyValue = value[key];\n if (typeof propertyValue !== 'string' || !check.test(propertyValue)) invalidKeys.push(key);\n });\n if (invalidKeys.length) {\n fieldErrors.push(m('inputSchema.validation.objectValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidKeys: invalidKeys.join(','),\n pattern: patternValue,\n }));\n }\n }\n }\n if (fieldErrors.length > 0) {\n const message = fieldErrors.join(', ');\n errors.push({ fieldKey: property, message });\n }\n });\n\n return errors;\n}\n\n/**\n * This functions parses all given JSON and then takes each of the jsFields.\n * Then if the field:\n * - is valid JS single function it replaces its single line string with a function delacation.\n * - is valid multiline JS code then replaces its single line string with `multiline` string\n * Then stringifies the code with given number of jsonSpacing spaces and finally prefixes whole\n * stringified JSON except the first line with globalSpacing spaces.\n */\nexport function makeInputJsFieldsReadable(json: string, jsFields: string[], jsonSpacing = 4, globalSpacing = 0): string {\n const parsedJson = JSON.parse(json);\n const replacements: Record<string, any> = {};\n\n jsFields.forEach((field) => {\n let maybeFunction = parsedJson[field];\n if (!maybeFunction || typeof maybeFunction !== 'string') return;\n\n let ast;\n try {\n ast = parse(maybeFunction, { ecmaVersion: 'latest' });\n } catch (err) {\n // Don't do anything in a case of invalid JS code.\n return;\n }\n\n const isMultiline = maybeFunction.includes('\\n');\n const isSingleFunction = ast\n && ast.body.length === 1\n && (\n ast.body[0].type === 'FunctionDeclaration'\n || (ast.body[0].type === 'ExpressionStatement' && ast.body[0].expression.type === 'ArrowFunctionExpression')\n );\n\n // If it's not a function declaration or multiline JS code then we do nothing.\n if (!isSingleFunction && !isMultiline) return;\n\n const spaces = (new Array(isSingleFunction ? jsonSpacing : jsonSpacing * 2)).fill(' ').join('');\n maybeFunction = maybeFunction\n .split('\\n').join(`\\n${spaces}`) // This prefixes each line with spaces.\n .trim(); // Trim whitespace on both sides\n\n const replacementValue = isSingleFunction\n ? maybeFunction.replace(/[;]+$/g, '') // Remove trailing semicolons\n : `\\`${maybeFunction}\\``;\n const replacementToken = `<<<REPLACEMENT_TOKEN:${Math.random()}>>>`;\n replacements[replacementToken] = replacementValue;\n parsedJson[field] = replacementToken;\n });\n\n let niceJson = JSON.stringify(parsedJson, null, jsonSpacing);\n\n Object.entries(replacements).forEach(([replacementToken, replacementValue]) => {\n niceJson = niceJson.replace(`\"${replacementToken}\"`, replacementValue);\n });\n\n const globalSpaces = (new Array(globalSpacing)).fill(' ').join('');\n niceJson = niceJson.split('\\n').join(`\\n${globalSpaces}`);\n\n return niceJson;\n}\n"],"mappings":"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","names":["definition","useApifyProxy","proxyUrls"]}
1
+ {"version":3,"sources":["../../src/intl.ts","../../src/schema.json","../../src/input_schema.ts","../../src/utilities.ts"],"sourcesContent":["const intlStrings = {\n 'inputSchema.validation.generic':\n 'Field {rootName}.{fieldKey} {message}',\n 'inputSchema.validation.required':\n 'Field {rootName}.{fieldKey} is required',\n 'inputSchema.validation.proxyRequired':\n 'Field {rootName}.{fieldKey} is required. Please provide custom proxy URLs or use Apify Proxy.',\n 'inputSchema.validation.requestListSourcesInvalid':\n 'Items in {rootName}.{fieldKey} at positions [{invalidIndexes}] do not contain valid URLs',\n 'inputSchema.validation.arrayKeysInvalid':\n 'Keys in {rootName}.{fieldKey} at positions [{invalidIndexes}] must match regular expression \"{pattern}\"',\n 'inputSchema.validation.arrayValuesInvalid':\n 'Values in {rootName}.{fieldKey} at positions [{invalidIndexes}] must match regular expression \"{pattern}\"',\n 'inputSchema.validation.objectKeysInvalid':\n 'Keys [{invalidKeys}] in {rootName}.{fieldKey} must match regular expression \"{pattern}',\n 'inputSchema.validation.objectValuesInvalid':\n 'Keys [{invalidKeys}] in {rootName}.{fieldKey} must have string value which matches regular expression \"{pattern}\"',\n 'inputSchema.validation.additionalProperty':\n 'Property {rootName}.{fieldKey} is not allowed.',\n 'inputSchema.validation.proxyGroupsNotAvailable':\n 'You currently do not have access to proxy groups: {groups}',\n 'inputSchema.validation.customProxyInvalid':\n 'Proxy URL \"{invalidUrl}\" has invalid format, it must be http[s]://[username[:password]]@hostname:port.',\n 'inputSchema.validation.apifyProxyCountryInvalid':\n 'Country code \"{invalidCountry}\" is invalid. Only ISO 3166-1 alpha-2 country codes are supported.',\n 'inputSchema.validation.apifyProxyCountryWithoutApifyProxyForbidden':\n 'The country for Apify Proxy can be specified only when using Apify Proxy.',\n 'inputSchema.validation.noAvailableAutoProxy':\n 'Currently you do not have access to any proxy group usable in automatic mode.',\n 'inputSchema.validation.noMatchingDefinition':\n 'Field schema.properties.{fieldKey} is not matching any input schema type definition. Please make sure that it\\'s type is valid.',\n 'inputSchema.validation.missingRequiredField':\n 'Field schema.properties.{fieldKey} does not exist, but it is specified in schema.required. Either define the field or remove it from schema.required.',\n 'inputSchema.validation.proxyGroupMustBeArrayOfStrings':\n 'Field {rootName}.{fieldKey}.apifyProxyGroups must be an array of strings.',\n};\n\n/**\n * Helper function to simulate intl formatMessage function\n */\nexport function m(stringId: string, variables?: Record<string, any>) {\n let text = intlStrings[stringId as keyof typeof intlStrings];\n if (!text) return stringId;\n\n if (variables) {\n Object.keys(variables).forEach((variableName) => {\n text = text.split(`{${variableName}}`).join(variables[variableName]);\n });\n }\n\n return text;\n}\n","{\n \"title\": \"JSON schema of Apify Actor INPUT_SCHEMA.json\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"schemaVersion\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 1\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\"object\"]\n },\n \"required\": {\n \"type\": \"array\",\n \"minItems\": 0,\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"additionalProperties\": {\n \"type\": \"boolean\"\n },\n \"properties\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \"^\": {\n \"oneOf\": [\n { \"$ref\": \"#/definitions/stringProperty\" },\n { \"$ref\": \"#/definitions/stringEnumProperty\" },\n { \"$ref\": \"#/definitions/arrayProperty\" },\n { \"$ref\": \"#/definitions/objectProperty\" },\n { \"$ref\": \"#/definitions/integerProperty\" },\n { \"$ref\": \"#/definitions/booleanProperty\" },\n { \"$ref\": \"#/definitions/anyProperty\" }\n ]\n }\n }\n }\n },\n \"additionalProperties\": false,\n \"required\": [\"title\", \"type\", \"properties\", \"schemaVersion\"],\n \"definitions\": {\n \"stringEnumProperty\": {\n \"title\": \"Enum property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"editor\": { \"enum\": [\"select\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"string\" },\n \"prefill\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" },\n \"enum\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"minItems\": 1,\n \"uniqueItems\": true\n },\n \"enumTitles\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"minItems\": 1\n }\n },\n \"required\": [\"type\", \"title\", \"description\", \"enum\"]\n },\n \"stringProperty\": {\n \"title\": \"String property\",\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"javascript\", \"python\", \"textfield\", \"textarea\", \"datepicker\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"],\n \"if\": {\n \"properties\": {\n \"isSecret\": {\n \"not\": {\n \"const\": true\n }\n }\n }\n },\n \"then\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"string\" },\n \"prefill\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"pattern\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minLength\": { \"type\": \"integer\" },\n \"maxLength\": { \"type\": \"integer\" },\n \"editor\": { \"enum\": [\"javascript\", \"python\", \"textfield\", \"textarea\", \"datepicker\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n }\n },\n \"else\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"example\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"textfield\", \"textarea\", \"hidden\"] },\n \"isSecret\": { \"type\": \"boolean\" },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n }\n }\n },\n \"arrayProperty\": {\n \"title\": \"Array property\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"enum\": [\"array\"] },\n \"editor\": { \"enum\": [\"json\", \"requestListSources\", \"pseudoUrls\", \"globs\", \"keyValue\", \"stringList\", \"select\", \"hidden\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"array\" },\n \"prefill\": { \"type\": \"array\" },\n \"example\": { \"type\": \"array\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minItems\": { \"type\": \"integer\" },\n \"maxItems\": { \"type\": \"integer\" },\n \"uniqueItems\": { \"type\": \"boolean\" },\n\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"additionalProperties\": true,\n \"required\": [\"type\", \"title\", \"description\", \"editor\"],\n \"if\": {\n \"properties\": {\n \"editor\": { \"const\": \"select\" }\n }\n },\n \"then\": {\n \"required\": [\"items\"],\n \"properties\": {\n \"items\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"string\"] },\n \"enum\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"enumTitles\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n }\n },\n \"required\": [\"type\", \"enum\"]\n }\n }\n },\n \"else\": {\n \"properties\": {\n \"placeholderKey\": { \"type\": \"string\" },\n \"placeholderValue\": { \"type\": \"string\" },\n \"patternKey\": { \"type\": \"string\" },\n \"patternValue\": { \"type\": \"string\" }\n }\n }\n },\n \"objectProperty\": {\n \"title\": \"Object property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"object\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"object\" },\n \"prefill\": { \"type\": \"object\" },\n \"example\": { \"type\": \"object\" },\n \"patternKey\": { \"type\": \"string\" },\n \"patternValue\": { \"type\": \"string\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minProperties\": { \"type\": \"integer\" },\n \"maxProperties\": { \"type\": \"integer\" },\n\n \"editor\": { \"enum\": [\"json\", \"proxy\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"]\n },\n \"integerProperty\": {\n \"title\": \"Integer property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"integer\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"integer\" },\n \"prefill\": { \"type\": \"integer\" },\n \"example\": { \"type\": \"integer\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"minimum\": { \"type\": \"integer\" },\n \"maximum\": { \"type\": \"integer\" },\n \"unit\": { \"type\": \"string\" },\n \"editor\": { \"enum\": [\"number\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\"]\n },\n \"booleanProperty\": {\n \"title\": \"Boolean property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"enum\": [\"boolean\"] },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": \"boolean\" },\n \"prefill\": { \"type\": \"boolean\" },\n \"example\": { \"type\": \"boolean\" },\n \"nullable\": { \"type\": \"boolean\" },\n \"groupCaption\": { \"type\": \"string\" },\n \"groupDescription\": { \"type\": \"string\" },\n \"editor\": { \"enum\": [\"checkbox\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\"]\n },\n \"anyProperty\": {\n \"title\": \"Any property\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": {\n \"type\": [\"array\"],\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"]\n },\n \"uniqueItems\": true,\n \"additionalItems\": false,\n \"minItems\": 1\n },\n \"title\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"default\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"prefill\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"example\": { \"type\": [\"object\", \"array\", \"string\", \"integer\", \"boolean\"] },\n \"nullable\": { \"type\": \"boolean\" },\n \"editor\": { \"enum\": [\"json\", \"hidden\"] },\n \"sectionCaption\": { \"type\": \"string\" },\n \"sectionDescription\": { \"type\": \"string\" }\n },\n \"required\": [\"type\", \"title\", \"description\", \"editor\"]\n }\n }\n}\n","import Ajv, { ErrorObject, Schema } from 'ajv';\n\nimport { m } from './intl';\nimport schema from './schema.json';\nimport {\n FieldDefinition,\n InputSchema,\n InputSchemaBaseChecked,\n StringFieldDefinition,\n} from './types';\n\nexport { schema as inputSchema };\n\nconst { definitions } = schema;\n\n/**\n * This function parses AJV error and transforms it into a readable string.\n *\n * @param error An error as returned from AJV.\n * @param rootName Usually 'input' or 'schema' based on if we are passing the input or schema.\n * @param properties (Used only when parsing input errors) List of input schema properties.\n * @param input (Used only when parsing input errors) Actual input that is being parsed.\n * @returns {null|{fieldKey: *, message: *}}\n */\nexport function parseAjvError(\n error: ErrorObject,\n rootName: string,\n properties: Record<string, { nullable?: boolean }> = {},\n input: Record<string, unknown> = {},\n): { fieldKey: string; message: string } | null {\n // There are 3 possible errors comming from validation:\n // - either { keword: 'anything', instancePath: '/someField', message: 'error message that we can use' }\n // - or { keyword: 'additionalProperties', params: { additionalProperty: 'field' }, message: 'must NOT have additional properties' }\n // - or { keyword: 'required', instancePath: '', params.missingProperty: 'someField' }\n\n let fieldKey: string;\n let message: string;\n\n // If error is with keyword type, it means that type of input is incorrect\n // this can mean that provided value is null\n if (error.keyword === 'type') {\n fieldKey = error.instancePath.split('/').pop()!;\n // Check if value is null and field is nullable, if yes, then skip this error\n if (properties[fieldKey] && properties[fieldKey].nullable && input[fieldKey] === null) {\n return null;\n }\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: error.message });\n } else if (error.keyword === 'required') {\n fieldKey = error.params.missingProperty;\n message = m('inputSchema.validation.required', { rootName, fieldKey });\n } else if (error.keyword === 'additionalProperties') {\n fieldKey = error.params.additionalProperty;\n message = m('inputSchema.validation.additionalProperty', { rootName, fieldKey });\n } else if (error.keyword === 'enum') {\n fieldKey = error.instancePath.split('/').pop()!;\n const errorMessage = `${error.message}: \"${error.params.allowedValues.join('\", \"')}\"`;\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: errorMessage });\n } else {\n fieldKey = error.instancePath.split('/').pop()!;\n message = m('inputSchema.validation.generic', { rootName, fieldKey, message: error.message });\n }\n\n return { fieldKey, message };\n}\n\n/**\n * Validates given object against schema and throws a human-readable error.\n */\nconst validateAgainstSchemaOrThrow = (validator: Ajv, obj: Record<string, unknown>, inputSchema: Schema, rootName: string) => {\n if (validator.validate(inputSchema, obj)) return;\n\n const errorMessage = parseAjvError(validator.errors![0], rootName)?.message;\n throw new Error(`Input schema is not valid (${errorMessage})`);\n};\n\n/**\n * This validates given object only against the basic input schema without checking the particular fields.\n * We override schema.properties.properties not to validate field definitions.\n */\nfunction validateBasicStructure(validator: Ajv, obj: Record<string, unknown>): asserts obj is InputSchemaBaseChecked {\n const schemaWithoutProperties = {\n ...schema,\n properties: { ...schema.properties, properties: { type: 'object' } as any },\n };\n validateAgainstSchemaOrThrow(validator, obj, schemaWithoutProperties, 'schema');\n}\n\n/**\n * Validates particular field against it's schema.\n */\nfunction validateField(validator: Ajv, fieldSchema: Record<string, unknown>, fieldKey: string): asserts fieldSchema is FieldDefinition {\n const matchingDefinitions = Object\n .values<any>(definitions) // cast as any, as the code in first branch seems to be invalid\n .filter((definition) => {\n return definition.properties.type.enum\n // This is a normal case where fieldSchema.type can be only one possible value matching definition.properties.type.enum.0\n ? definition.properties.type.enum[0] === fieldSchema.type\n // This is a type \"Any\" where fieldSchema.type is an array of possible values\n : Array.isArray(fieldSchema.type);\n });\n\n // There is not matching definition.\n if (matchingDefinitions.length === 0) {\n const errorMessage = m('inputSchema.validation.noMatchingDefinition', { fieldKey });\n throw new Error(`Input schema is not valid (${errorMessage})`);\n }\n\n // If there is only one matching then we are done and simply compare it.\n if (matchingDefinitions.length === 1) {\n validateAgainstSchemaOrThrow(validator, fieldSchema, matchingDefinitions[0], `schema.properties.${fieldKey}`);\n return;\n }\n\n // If there are more matching definitions then the type is string, and we need to get the right one.\n // If the definition contains \"enum\" property then it's enum type.\n if ((fieldSchema as StringFieldDefinition).enum) {\n const definition = matchingDefinitions.filter((item) => !!item.properties.enum).pop();\n if (!definition) throw new Error('Input schema validation failed to find \"enum property\" definition');\n validateAgainstSchemaOrThrow(validator, fieldSchema, definition, `schema.properties.${fieldKey}.enum`);\n return;\n }\n // Otherwise we use the other definition.\n const definition = matchingDefinitions.filter((item) => !item.properties.enum).pop();\n if (!definition) throw new Error('Input schema validation failed to find other than \"enum property\" definition');\n\n validateAgainstSchemaOrThrow(validator, fieldSchema, definition, `schema.properties.${fieldKey}`);\n}\n\n/**\n * Validates all properties in the input schema\n */\nfunction validateProperties(inputSchema: InputSchemaBaseChecked, validator: Ajv): asserts inputSchema is InputSchema {\n Object.entries(inputSchema.properties).forEach(([fieldKey, fieldSchema]) => (\n validateField(validator, fieldSchema, fieldKey)),\n );\n}\n\n/**\n * Validates that all required fields are present in properties list\n */\nexport function validateExistenceOfRequiredFields(inputSchema: InputSchema) {\n // If the input schema does not have any required fields, we do not need to validate them\n if (!inputSchema?.required?.length) return;\n\n Object.values(inputSchema?.required).forEach((fieldKey) => {\n // If the required field is present in the list of properties, we can check the next one\n if (inputSchema?.properties[fieldKey as string]) return;\n\n // The required field is not defined in list of properties. Which means the schema is not valid.\n throw new Error(m('inputSchema.validation.missingRequiredField', { fieldKey }));\n });\n}\n\n/**\n * This function validates given input schema first just for basic structure then each field one by one,\n * then checks that all required fields are present and finally checks fully against the whole schema.\n *\n * This way we get the most accurate error message for user.\n */\nexport function validateInputSchema(validator: Ajv, inputSchema: Record<string, unknown>): asserts inputSchema is InputSchema {\n // First validate just basic structure without fields.\n validateBasicStructure(validator, inputSchema);\n\n // Then validate each field separately.\n validateProperties(inputSchema, validator);\n\n // Next validate if required fields are actually present in the schema\n validateExistenceOfRequiredFields(inputSchema);\n\n // Finally just to be sure run validation against the whole schema.\n validateAgainstSchemaOrThrow(validator, inputSchema, schema, 'schema');\n}\n","import { PROXY_URL_REGEX, URL_REGEX } from '@apify/consts';\nimport { parse } from 'acorn-loose';\nimport { ValidateFunction } from 'ajv';\nimport { countries } from 'countries-list';\n\nimport { parseAjvError } from './input_schema';\nimport { m } from './intl';\n\n/**\n * Validates input field configured with proxy editor\n * @param fieldKey Proxy field value\n * @param value Proxy field value\n * @param [isRequired] Whether the field is required or not\n * @param [options] Information about proxy groups availability\n * @param [options.hasAutoProxyGroups] Informs validation whether user has atleast one proxy group available in auto mode\n * @param [options.availableProxyGroups] List of available proxy groups\n * @param [options.disabledProxyGroups] Object with groupId as key and error message as value (mostly for residential/SERP)\n */\nfunction validateProxyField(\n fieldKey: Record<string, unknown>,\n value: Record<string, any>,\n isRequired = false,\n options: { hasAutoProxyGroups?: boolean; availableProxyGroups?: string[]; disabledProxyGroups?: Record<string, unknown> } | null = null,\n) {\n const fieldErrors: any[] = [];\n if (isRequired) {\n // Nullable error is already handled by AJV\n if (value === null) return fieldErrors;\n if (!value) {\n const message = m('inputSchema.validation.required', { rootName: 'input', fieldKey });\n fieldErrors.push(message);\n return fieldErrors;\n }\n\n const { useApifyProxy, proxyUrls } = value;\n if (!useApifyProxy && (!Array.isArray(proxyUrls) || proxyUrls.length === 0)) {\n fieldErrors.push(m('inputSchema.validation.proxyRequired', { rootName: 'input', fieldKey }));\n return fieldErrors;\n }\n }\n\n // Input is not required, so missing value is valid\n if (!value) return fieldErrors;\n\n const { useApifyProxy, proxyUrls, apifyProxyGroups, apifyProxyCountry } = value;\n\n if (!useApifyProxy && Array.isArray(proxyUrls)) {\n let invalidUrl = false;\n proxyUrls.forEach((url) => {\n if (!PROXY_URL_REGEX.test(url.trim())) invalidUrl = url.trim();\n });\n if (invalidUrl) {\n fieldErrors.push(m('inputSchema.validation.customProxyInvalid', { invalidUrl }));\n }\n }\n\n // Apify proxy country can be set only when using Apify proxy\n if (!useApifyProxy && apifyProxyCountry) {\n fieldErrors.push(m('inputSchema.validation.apifyProxyCountryWithoutApifyProxyForbidden'));\n }\n\n // If Apify proxy is not used skip additional checks\n if (!useApifyProxy) return fieldErrors;\n\n // If Apify proxy is used, check if there is a selected country and if so, check that it's valid (empty or a valid country code)\n if (apifyProxyCountry && !countries[apifyProxyCountry as keyof typeof countries]) {\n fieldErrors.push(m('inputSchema.validation.apifyProxyCountryInvalid', { invalidCountry: apifyProxyCountry }));\n }\n\n // If options are not provided skip additional checks\n if (!options) return fieldErrors;\n\n // if apifyProxyGroups exists it must be an array of strings\n const isStringsArray = (array: Array<string>) => array.every((item) => typeof item === 'string');\n if (apifyProxyGroups && !(Array.isArray(apifyProxyGroups) && isStringsArray(apifyProxyGroups))) {\n fieldErrors.push(m('inputSchema.validation.proxyGroupMustBeArrayOfStrings', { rootName: 'input', fieldKey }));\n return fieldErrors;\n }\n\n const selectedProxyGroups = (apifyProxyGroups || []);\n\n // Auto mode, check that user has access to alteast one proxy group usable in this mode\n if (!selectedProxyGroups.length && !options.hasAutoProxyGroups) {\n fieldErrors.push(m('inputSchema.validation.noAvailableAutoProxy'));\n return fieldErrors;\n }\n\n // Check if proxy groups selected by user are available to him\n const availableProxyGroupsById = {} as Record<string, boolean>;\n (options.availableProxyGroups || []).forEach((group) => { availableProxyGroupsById[group] = true; });\n const unavailableProxyGroups = selectedProxyGroups.filter((group: string) => !availableProxyGroupsById[group]);\n\n if (unavailableProxyGroups.length) {\n fieldErrors.push(m('inputSchema.validation.proxyGroupsNotAvailable', {\n rootName: 'input',\n fieldKey,\n groups: unavailableProxyGroups.join(', '),\n }));\n }\n\n // Check if any of the proxy groups are blocked and if yes then output the associated message\n const blockedProxyGroupsById = options.disabledProxyGroups || {};\n selectedProxyGroups\n .filter((group: string) => blockedProxyGroupsById[group])\n .forEach((blockedGroup: string) => {\n fieldErrors.push(blockedProxyGroupsById[blockedGroup]);\n });\n\n return fieldErrors;\n}\n\n/**\n * Uses AJV validator to validate input with input schema and then\n * does custom validation for our own properties (nullable, patternKey, patternValue)\n * @param validator Initialized AJV validator\n * @param inputSchema Valid input schema in object\n * @param input Input object to be validated\n * @param options (Optional) Additional validation configuration for certain fields\n */\nexport function validateInputUsingValidator(\n validator: ValidateFunction,\n inputSchema: Record<string, any>,\n input: Record<string, unknown>,\n options: Record<string, any> = {},\n) {\n const isValid = validator(input); // Check if input is valid based on schema values\n\n const { properties } = inputSchema;\n const required = inputSchema.required || [];\n\n let errors: { fieldKey: string, message: string }[] = [];\n // Process AJV validation errors\n if (!isValid) {\n errors = validator.errors!\n .map((error) => parseAjvError(error, 'input', properties, input))\n .filter((error) => !!error) as any[];\n }\n\n Object.keys(properties).forEach((property) => {\n const value = input[property] as Record<string, any>;\n const { type, editor, patternKey, patternValue } = properties[property];\n const fieldErrors = [];\n // Check that proxy is required, if yes, valides that it's correctly setup\n if (type === 'object' && editor === 'proxy') {\n const proxyValidationErrors = validateProxyField(property as any, value, required.includes(property), options.proxy);\n proxyValidationErrors.forEach((error) => {\n fieldErrors.push(error);\n });\n }\n // Check that array items fit patternKey and patternValue\n if (type === 'array' && value && Array.isArray(value)) {\n if (editor === 'requestListSources') {\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!item) invalidIndexes.push(index);\n else if (!item.url && !item.requestsFromUrl) invalidIndexes.push(index);\n else if (item.url && !URL_REGEX.test(item.url)) invalidIndexes.push(index);\n else if (item.requestsFromUrl && !URL_REGEX.test(item.requestsFromUrl)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.requestListSourcesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n }));\n }\n }\n // If patternKey is provided, then validate keys of objects in array\n if (patternKey && editor === 'keyValue') {\n const check = new RegExp(patternKey);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item.key)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayKeysInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternKey,\n }));\n }\n }\n // If patternValue is provided and editor is keyValue, then validate values of objecs in array\n if (patternValue && editor === 'keyValue') {\n const check = new RegExp(patternValue);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item.value)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternValue,\n }));\n }\n // If patternValue is provided and editor is stringList, then validate each item in array\n } else if (patternValue && editor === 'stringList') {\n const check = new RegExp(patternValue);\n const invalidIndexes: any[] = [];\n value.forEach((item, index) => {\n if (!check.test(item)) invalidIndexes.push(index);\n });\n if (invalidIndexes.length) {\n fieldErrors.push(m('inputSchema.validation.arrayValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidIndexes: invalidIndexes.join(','),\n pattern: patternValue,\n }));\n }\n }\n }\n // Check that object items fit patternKey and patternValue\n if (type === 'object' && value) {\n if (patternKey) {\n const check = new RegExp(patternKey);\n const invalidKeys: any[] = [];\n Object.keys(value).forEach((key) => {\n if (!check.test(key)) invalidKeys.push(key);\n });\n if (invalidKeys.length) {\n fieldErrors.push(m('inputSchema.validation.objectKeysInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidKeys: invalidKeys.join(','),\n pattern: patternKey,\n }));\n }\n }\n if (patternValue) {\n const check = new RegExp(patternValue);\n const invalidKeys: any[] = [];\n Object.keys(value).forEach((key) => {\n const propertyValue = value[key];\n if (typeof propertyValue !== 'string' || !check.test(propertyValue)) invalidKeys.push(key);\n });\n if (invalidKeys.length) {\n fieldErrors.push(m('inputSchema.validation.objectValuesInvalid', {\n rootName: 'input',\n fieldKey: property,\n invalidKeys: invalidKeys.join(','),\n pattern: patternValue,\n }));\n }\n }\n }\n if (fieldErrors.length > 0) {\n const message = fieldErrors.join(', ');\n errors.push({ fieldKey: property, message });\n }\n });\n\n return errors;\n}\n\n/**\n * This functions parses all given JSON and then takes each of the jsFields.\n * Then if the field:\n * - is valid JS single function it replaces its single line string with a function delacation.\n * - is valid multiline JS code then replaces its single line string with `multiline` string\n * Then stringifies the code with given number of jsonSpacing spaces and finally prefixes whole\n * stringified JSON except the first line with globalSpacing spaces.\n */\nexport function makeInputJsFieldsReadable(json: string, jsFields: string[], jsonSpacing = 4, globalSpacing = 0): string {\n const parsedJson = JSON.parse(json);\n const replacements: Record<string, any> = {};\n\n jsFields.forEach((field) => {\n let maybeFunction = parsedJson[field];\n if (!maybeFunction || typeof maybeFunction !== 'string') return;\n\n let ast;\n try {\n ast = parse(maybeFunction, { ecmaVersion: 'latest' });\n } catch (err) {\n // Don't do anything in a case of invalid JS code.\n return;\n }\n\n const isMultiline = maybeFunction.includes('\\n');\n const isSingleFunction = ast\n && ast.body.length === 1\n && (\n ast.body[0].type === 'FunctionDeclaration'\n || (ast.body[0].type === 'ExpressionStatement' && ast.body[0].expression.type === 'ArrowFunctionExpression')\n );\n\n // If it's not a function declaration or multiline JS code then we do nothing.\n if (!isSingleFunction && !isMultiline) return;\n\n const spaces = (new Array(isSingleFunction ? jsonSpacing : jsonSpacing * 2)).fill(' ').join('');\n maybeFunction = maybeFunction\n .split('\\n').join(`\\n${spaces}`) // This prefixes each line with spaces.\n .trim(); // Trim whitespace on both sides\n\n const replacementValue = isSingleFunction\n ? maybeFunction.replace(/[;]+$/g, '') // Remove trailing semicolons\n : `\\`${maybeFunction}\\``;\n const replacementToken = `<<<REPLACEMENT_TOKEN:${Math.random()}>>>`;\n replacements[replacementToken] = replacementValue;\n parsedJson[field] = replacementToken;\n });\n\n let niceJson = JSON.stringify(parsedJson, null, jsonSpacing);\n\n Object.entries(replacements).forEach(([replacementToken, replacementValue]) => {\n niceJson = niceJson.replace(`\"${replacementToken}\"`, replacementValue);\n });\n\n const globalSpaces = (new Array(globalSpacing)).fill(' ').join('');\n niceJson = niceJson.split('\\n').join(`\\n${globalSpaces}`);\n\n return niceJson;\n}\n"],"mappings":"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","names":["definition","useApifyProxy","proxyUrls"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apify/input_schema",
3
- "version": "3.6.3",
3
+ "version": "3.7.1",
4
4
  "description": "Tools and constants shared across Apify projects.",
5
5
  "main": "./cjs/index.cjs",
6
6
  "module": "./esm/index.mjs",
@@ -55,5 +55,5 @@
55
55
  "peerDependencies": {
56
56
  "ajv": "^8.0.0"
57
57
  },
58
- "gitHead": "a8e54286093c840cb2b3c398d4fa97db23ca5770"
58
+ "gitHead": "33a42ef830b2d1d2bd6858b591f46b8fefd197cb"
59
59
  }