All files / src/lib file-naming.ts

0% Statements 0/55
100% Branches 0/0
0% Functions 0/1
0% Lines 0/55

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56                                                                                                               
/**
 * Generate standardized filename for product image
 * Pattern: product-{id}-{type}-{index}.webp
 * Example: product-5-bg-1.webp, product-5-sm-2.webp
 */
export function generateProductImageFilename(
  productId: number,
  imageIndex: number,
  type: "THUMBNAIL" | "PREVIEW"
): string {
  const typePrefix = type === "THUMBNAIL" ? "sm" : "bg";
  return `product-${productId}-${typePrefix}-${imageIndex}.webp`;
}

/**
 * Parse filename to extract product ID and type
 */
export function parseProductImageFilename(filename: string): {
  productId: number;
  index: number;
  type: "THUMBNAIL" | "PREVIEW";
} | null {
  const pattern = /^product-(\d+)-(bg|sm)-(\d+)\.webp$/;
  const match = filename.match(pattern);

  if (!match) return null;

  return {
    productId: parseInt(match[1]),
    type: match[2] === "bg" ? "PREVIEW" : "THUMBNAIL",
    index: parseInt(match[3])};
}

/**
 * Get next image index for product
 */
export function getNextImageIndexFromFiles(
  productId: number,
  existingFiles: string[],
  type: "THUMBNAIL" | "PREVIEW"
): number {
  const typePrefix = type === "THUMBNAIL" ? "-sm-" : "-bg-";
  const productPattern = new RegExp(`^product-${productId}${typePrefix}`);

  const matchingFiles = existingFiles.filter((f) => productPattern.test(f));

  if (matchingFiles.length === 0) return 1;

  const indices = matchingFiles.map((f) => {
    const match = f.match(/(\d+)\.webp$/);
    return match ? parseInt(match[1]) : 0;
  });

  return Math.max(...indices) + 1;
}