transform.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const codegen_1 = require("ajv/dist/compile/codegen");
  4. const transform = {
  5. trimStart: (s) => s.trimStart(),
  6. trimEnd: (s) => s.trimEnd(),
  7. trimLeft: (s) => s.trimStart(),
  8. trimRight: (s) => s.trimEnd(),
  9. trim: (s) => s.trim(),
  10. toLowerCase: (s) => s.toLowerCase(),
  11. toUpperCase: (s) => s.toUpperCase(),
  12. toEnumCase: (s, cfg) => (cfg === null || cfg === void 0 ? void 0 : cfg.hash[configKey(s)]) || s,
  13. };
  14. const getDef = Object.assign(_getDef, { transform });
  15. function _getDef() {
  16. return {
  17. keyword: "transform",
  18. schemaType: "array",
  19. before: "enum",
  20. code(cxt) {
  21. const { gen, data, schema, parentSchema, it } = cxt;
  22. const { parentData, parentDataProperty } = it;
  23. const tNames = schema;
  24. if (!tNames.length)
  25. return;
  26. let cfg;
  27. if (tNames.includes("toEnumCase")) {
  28. const config = getEnumCaseCfg(parentSchema);
  29. cfg = gen.scopeValue("obj", { ref: config, code: (0, codegen_1.stringify)(config) });
  30. }
  31. gen.if((0, codegen_1._) `typeof ${data} == "string" && ${parentData} !== undefined`, () => {
  32. gen.assign(data, transformExpr(tNames.slice()));
  33. gen.assign((0, codegen_1._) `${parentData}[${parentDataProperty}]`, data);
  34. });
  35. function transformExpr(ts) {
  36. if (!ts.length)
  37. return data;
  38. const t = ts.pop();
  39. if (!(t in transform))
  40. throw new Error(`transform: unknown transformation ${t}`);
  41. const func = gen.scopeValue("func", {
  42. ref: transform[t],
  43. code: (0, codegen_1._) `require("ajv-keywords/dist/definitions/transform").transform${(0, codegen_1.getProperty)(t)}`,
  44. });
  45. const arg = transformExpr(ts);
  46. return cfg && t === "toEnumCase" ? (0, codegen_1._) `${func}(${arg}, ${cfg})` : (0, codegen_1._) `${func}(${arg})`;
  47. }
  48. },
  49. metaSchema: {
  50. type: "array",
  51. items: { type: "string", enum: Object.keys(transform) },
  52. },
  53. };
  54. }
  55. function getEnumCaseCfg(parentSchema) {
  56. // build hash table to enum values
  57. const cfg = { hash: {} };
  58. // requires `enum` in the same schema as transform
  59. if (!parentSchema.enum)
  60. throw new Error('transform: "toEnumCase" requires "enum"');
  61. for (const v of parentSchema.enum) {
  62. if (typeof v !== "string")
  63. continue;
  64. const k = configKey(v);
  65. // requires all `enum` values have unique keys
  66. if (cfg.hash[k]) {
  67. throw new Error('transform: "toEnumCase" requires all lowercased "enum" values to be unique');
  68. }
  69. cfg.hash[k] = v;
  70. }
  71. return cfg;
  72. }
  73. function configKey(s) {
  74. return s.toLowerCase();
  75. }
  76. exports.default = getDef;
  77. module.exports = getDef;
  78. //# sourceMappingURL=transform.js.map