recorded-utils.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. export const kebab = (value: string) =>
  2. value
  3. .trim()
  4. .replace(/['"]/g, "")
  5. .replace(/[^a-zA-Z0-9]+/g, "-")
  6. .replace(/^-|-$/g, "")
  7. .toLowerCase()
  8. export const missingEnv = (names: ReadonlyArray<string>) => names.filter((name) => !process.env[name])
  9. export const envList = (name: string) =>
  10. (process.env[name] ?? "")
  11. .split(",")
  12. .map((item) => item.trim().toLowerCase())
  13. .filter((item) => item !== "")
  14. export const unique = (items: ReadonlyArray<string>) => Array.from(new Set(items))
  15. export const classifiedTags = (input: {
  16. readonly prefix?: string
  17. readonly provider?: string
  18. readonly protocol?: string
  19. readonly tags?: ReadonlyArray<string>
  20. }) =>
  21. unique([
  22. ...(input.prefix ? [`prefix:${input.prefix}`] : []),
  23. ...(input.provider ? [`provider:${input.provider}`] : []),
  24. ...(input.protocol ? [`protocol:${input.protocol}`] : []),
  25. ...(input.tags ?? []),
  26. ])
  27. export const matchesSelected = (input: {
  28. readonly prefix: string
  29. readonly name: string
  30. readonly cassette: string
  31. readonly tags: ReadonlyArray<string>
  32. }) => {
  33. const prefixes = envList("RECORDED_PREFIX")
  34. const providers = envList("RECORDED_PROVIDER")
  35. const requiredTags = envList("RECORDED_TAGS")
  36. const tests = envList("RECORDED_TEST")
  37. const tags = input.tags.map((tag) => tag.toLowerCase())
  38. const names = [input.name, kebab(input.name), input.cassette].map((item) => item.toLowerCase())
  39. if (prefixes.length > 0 && !prefixes.includes(input.prefix.toLowerCase())) return false
  40. if (providers.length > 0 && !providers.some((provider) => tags.includes(`provider:${provider}`))) return false
  41. if (requiredTags.length > 0 && !requiredTags.every((tag) => tags.includes(tag))) return false
  42. if (tests.length > 0 && !tests.some((test) => names.some((name) => name.includes(test)))) return false
  43. return true
  44. }
  45. export const cassetteName = (
  46. prefix: string,
  47. name: string,
  48. options: { readonly cassette?: string; readonly id?: string },
  49. ) => options.cassette ?? `${prefix}/${options.id ?? kebab(name)}`