@murumets-ee/media 0.27.0 → 0.29.0

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.
Files changed (61) hide show
  1. package/dist/admin.d.mts.map +1 -1
  2. package/dist/admin.mjs +1 -1
  3. package/dist/{client-BZY26jaX.mjs → client-BL8RADZv.mjs} +2 -2
  4. package/dist/{client-BZY26jaX.mjs.map → client-BL8RADZv.mjs.map} +1 -1
  5. package/dist/client.d.mts +1 -1
  6. package/dist/client.d.mts.map +1 -1
  7. package/dist/client.mjs +1 -1
  8. package/dist/client.mjs.map +1 -1
  9. package/dist/{entity-B75A4L3p.mjs → entity-Caba_NFw.mjs} +1 -1
  10. package/dist/{entity-B75A4L3p.mjs.map → entity-Caba_NFw.mjs.map} +1 -1
  11. package/dist/{entity-D1YaFEh8.mjs → entity-v0J9plyH.mjs} +1 -1
  12. package/dist/{entity-D1YaFEh8.mjs.map → entity-v0J9plyH.mjs.map} +1 -1
  13. package/dist/{image-styles-settings-B4QOt7Ve.mjs → image-styles-settings-ClIA2MJI.mjs} +1 -1
  14. package/dist/{image-styles-settings-B4QOt7Ve.mjs.map → image-styles-settings-ClIA2MJI.mjs.map} +1 -1
  15. package/dist/image-styles-settings.d.mts +1 -1
  16. package/dist/image-styles-settings.d.mts.map +1 -1
  17. package/dist/image-styles-settings.mjs.map +1 -1
  18. package/dist/image-styles.d.mts.map +1 -1
  19. package/dist/image-styles.mjs.map +1 -1
  20. package/dist/index.d.mts +1 -1
  21. package/dist/index.d.mts.map +1 -1
  22. package/dist/index.mjs +1 -1
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/picker.d.mts.map +1 -1
  25. package/dist/picker.mjs.map +1 -1
  26. package/dist/{plugin-DyYikOz_.mjs → plugin-_fxTC79v.mjs} +2 -2
  27. package/dist/{plugin-DyYikOz_.mjs.map → plugin-_fxTC79v.mjs.map} +1 -1
  28. package/dist/plugin.d.mts +1 -1
  29. package/dist/plugin.d.mts.map +1 -1
  30. package/dist/plugin.mjs +1 -1
  31. package/dist/plugin.mjs.map +1 -1
  32. package/dist/processing.d.mts +1 -1
  33. package/dist/processing.d.mts.map +1 -1
  34. package/dist/processing.mjs +1 -1
  35. package/dist/query-client.d.mts +1 -1
  36. package/dist/query-client.d.mts.map +1 -1
  37. package/dist/query-client.mjs +1 -1
  38. package/dist/query-client.mjs.map +1 -1
  39. package/dist/ref.d.mts.map +1 -1
  40. package/dist/ref.mjs.map +1 -1
  41. package/dist/{regenerate-variants-DtA5pKjj.mjs → regenerate-variants-BysyeIoA.mjs} +2 -2
  42. package/dist/{regenerate-variants-DtA5pKjj.mjs.map → regenerate-variants-BysyeIoA.mjs.map} +1 -1
  43. package/dist/{regenerate-variants-DJIFSrdC.mjs → regenerate-variants-CtzCRkKd.mjs} +2 -2
  44. package/dist/{regenerate-variants-DJIFSrdC.mjs.map → regenerate-variants-CtzCRkKd.mjs.map} +1 -1
  45. package/dist/{resolve-image-styles-BI3pvJBZ.mjs → resolve-image-styles-iN9JbZYf.mjs} +1 -1
  46. package/dist/{resolve-image-styles-BI3pvJBZ.mjs.map → resolve-image-styles-iN9JbZYf.mjs.map} +1 -1
  47. package/dist/{resolve-image-styles-B2pbn_AH.mjs → resolve-image-styles-qxVgkNT_.mjs} +2 -2
  48. package/dist/{resolve-image-styles-B2pbn_AH.mjs.map → resolve-image-styles-qxVgkNT_.mjs.map} +1 -1
  49. package/dist/{routes-BbNpbNjb.mjs → routes-CT4-zLOt.mjs} +2 -2
  50. package/dist/{routes-BbNpbNjb.mjs.map → routes-CT4-zLOt.mjs.map} +1 -1
  51. package/dist/{types-CqjShq2U.d.mts → types-Bv5ATAgT.d.mts} +1 -1
  52. package/dist/types-Bv5ATAgT.d.mts.map +1 -0
  53. package/dist/{usage-DmdsFJpK.mjs → usage-CVAqkS6h.mjs} +1 -1
  54. package/dist/{usage-DmdsFJpK.mjs.map → usage-CVAqkS6h.mjs.map} +1 -1
  55. package/dist/usage.mjs.map +1 -1
  56. package/dist/{variant-key-CFr3fR-n.mjs → variant-key-CLlac3_1.mjs} +1 -1
  57. package/dist/{variant-key-CFr3fR-n.mjs.map → variant-key-CLlac3_1.mjs.map} +1 -1
  58. package/dist/{variant-key-gVMhzKyv.mjs → variant-key-CyI9Qq-f.mjs} +1 -1
  59. package/dist/{variant-key-gVMhzKyv.mjs.map → variant-key-CyI9Qq-f.mjs.map} +1 -1
  60. package/package.json +14 -14
  61. package/dist/types-CqjShq2U.d.mts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"variant-key-gVMhzKyv.mjs","names":[],"sources":["../src/process-image.ts","../src/variant-key.ts"],"sourcesContent":["/**\n * Server-side image processing via Sharp.\n *\n * Pure processing module — no DB or storage dependencies.\n * Takes a buffer and image styles, returns metadata + variant buffers.\n */\n\nimport sharp from 'sharp'\nimport type { ImageStyle } from './types.js'\n\n/** Result of processing an image through Sharp */\nexport interface ProcessedImage {\n /** Original image width in pixels */\n width: number\n /** Original image height in pixels */\n height: number\n /** Generated variant buffers keyed by style name */\n variants: Map<string, ProcessedVariant>\n}\n\n/** A single processed variant */\nexport interface ProcessedVariant {\n buffer: Buffer\n format: string\n mimeType: string\n width: number\n height: number\n}\n\n/** MIME types that should NOT be processed (vectors, animations) */\nconst SKIP_MIME_TYPES = new Set(['image/svg+xml', 'image/gif'])\n\n/**\n * Check if a MIME type is eligible for Sharp processing.\n * Returns false for SVG, GIF, and non-image types.\n */\nexport function isProcessableImage(mimeType: string): boolean {\n return mimeType.startsWith('image/') && !SKIP_MIME_TYPES.has(mimeType)\n}\n\n/**\n * Extract image dimensions and generate resized variants.\n *\n * @param buffer - Original image file as a Buffer\n * @param styles - Named image style presets to generate\n * @returns Metadata (width/height) and variant buffers\n */\nexport async function processImage(\n buffer: Buffer,\n styles: Record<string, ImageStyle>,\n): Promise<ProcessedImage> {\n const meta = await sharp(buffer).metadata()\n const width = meta.width ?? 0\n const height = meta.height ?? 0\n\n const variants = new Map<string, ProcessedVariant>()\n\n const entries = Object.entries(styles)\n await Promise.all(\n entries.map(async ([name, style]) => {\n const fmt = style.format ?? 'webp'\n const quality = style.quality ?? 80\n const fit = style.fit ?? 'cover'\n\n const resized = sharp(buffer).resize({\n width: style.width,\n height: style.height,\n fit,\n withoutEnlargement: true,\n })\n\n const { data: variantBuffer, info } = await resized[fmt]({ quality }).toBuffer({\n resolveWithObject: true,\n })\n\n variants.set(name, {\n buffer: variantBuffer,\n format: fmt,\n mimeType: `image/${fmt}`,\n width: info.width,\n height: info.height,\n })\n }),\n )\n\n return { width, height, variants }\n}\n\n/**\n * Extract only image dimensions (no variant generation).\n * Useful for getting width/height when styles are empty.\n */\nexport async function getImageDimensions(\n buffer: Buffer,\n): Promise<{ width: number; height: number }> {\n const meta = await sharp(buffer).metadata()\n return { width: meta.width ?? 0, height: meta.height ?? 0 }\n}\n","/**\n * Variant key derivation convention.\n *\n * Given an original storage key and a style name, produces a deterministic\n * variant key in the same directory.\n *\n * Convention:\n * Original: uploads/2026/02/{uuid}/photo.jpg\n * Variant: uploads/2026/02/{uuid}/thumbnail_photo.webp\n */\n\n/**\n * Derive a variant storage key from the original key + style name.\n *\n * @param originalKey - The original file's storage key\n * @param styleName - The image style name (e.g., 'thumbnail', 'medium')\n * @param format - The variant output format (default: 'webp')\n * @returns The derived variant key\n */\nexport function deriveVariantKey(originalKey: string, styleName: string, format = 'webp'): string {\n const lastSlash = originalKey.lastIndexOf('/')\n const dir = originalKey.substring(0, lastSlash)\n const filename = originalKey.substring(lastSlash + 1)\n const baseName = filename.replace(/\\.[^.]+$/, '')\n return `${dir}/${styleName}_${baseName}.${format}`\n}\n"],"mappings":"qBA8BA,MAAM,EAAkB,IAAI,IAAI,CAAC,gBAAiB,YAAY,CAAC,CAM/D,SAAgB,EAAmB,EAA2B,CAC5D,OAAO,EAAS,WAAW,SAAS,EAAI,CAAC,EAAgB,IAAI,EAAS,CAUxE,eAAsB,EACpB,EACA,EACyB,CACzB,IAAM,EAAO,MAAM,EAAM,EAAO,CAAC,UAAU,CACrC,EAAQ,EAAK,OAAS,EACtB,EAAS,EAAK,QAAU,EAExB,EAAW,IAAI,IAEf,EAAU,OAAO,QAAQ,EAAO,CA4BtC,OA3BA,MAAM,QAAQ,IACZ,EAAQ,IAAI,MAAO,CAAC,EAAM,KAAW,CACnC,IAAM,EAAM,EAAM,QAAU,OACtB,EAAU,EAAM,SAAW,GAC3B,EAAM,EAAM,KAAO,QASnB,CAAE,KAAM,EAAe,QAAS,MAPtB,EAAM,EAAO,CAAC,OAAO,CACnC,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,MACA,mBAAoB,GACrB,CAEkD,CAAC,GAAK,CAAE,UAAS,CAAC,CAAC,SAAS,CAC7E,kBAAmB,GACpB,CAAC,CAEF,EAAS,IAAI,EAAM,CACjB,OAAQ,EACR,OAAQ,EACR,SAAU,SAAS,IACnB,MAAO,EAAK,MACZ,OAAQ,EAAK,OACd,CAAC,EACF,CACH,CAEM,CAAE,QAAO,SAAQ,WAAU,CAOpC,eAAsB,EACpB,EAC4C,CAC5C,IAAM,EAAO,MAAM,EAAM,EAAO,CAAC,UAAU,CAC3C,MAAO,CAAE,MAAO,EAAK,OAAS,EAAG,OAAQ,EAAK,QAAU,EAAG,CC7E7D,SAAgB,EAAiB,EAAqB,EAAmB,EAAS,OAAgB,CAChG,IAAM,EAAY,EAAY,YAAY,IAAI,CAI9C,MAAO,GAHK,EAAY,UAAU,EAAG,EAGxB,CAAC,GAAG,EAAU,GAFV,EAAY,UAAU,EAAY,EAC1B,CAAC,QAAQ,WAAY,GACR,CAAC,GAAG"}
1
+ {"version":3,"file":"variant-key-CyI9Qq-f.mjs","names":[],"sources":["../src/process-image.ts","../src/variant-key.ts"],"sourcesContent":["/**\n * Server-side image processing via Sharp.\n *\n * Pure processing module — no DB or storage dependencies.\n * Takes a buffer and image styles, returns metadata + variant buffers.\n */\n\nimport sharp from 'sharp'\nimport type { ImageStyle } from './types.js'\n\n/** Result of processing an image through Sharp */\nexport interface ProcessedImage {\n /** Original image width in pixels */\n width: number\n /** Original image height in pixels */\n height: number\n /** Generated variant buffers keyed by style name */\n variants: Map<string, ProcessedVariant>\n}\n\n/** A single processed variant */\nexport interface ProcessedVariant {\n buffer: Buffer\n format: string\n mimeType: string\n width: number\n height: number\n}\n\n/** MIME types that should NOT be processed (vectors, animations) */\nconst SKIP_MIME_TYPES = new Set(['image/svg+xml', 'image/gif'])\n\n/**\n * Check if a MIME type is eligible for Sharp processing.\n * Returns false for SVG, GIF, and non-image types.\n */\nexport function isProcessableImage(mimeType: string): boolean {\n return mimeType.startsWith('image/') && !SKIP_MIME_TYPES.has(mimeType)\n}\n\n/**\n * Extract image dimensions and generate resized variants.\n *\n * @param buffer - Original image file as a Buffer\n * @param styles - Named image style presets to generate\n * @returns Metadata (width/height) and variant buffers\n */\nexport async function processImage(\n buffer: Buffer,\n styles: Record<string, ImageStyle>,\n): Promise<ProcessedImage> {\n const meta = await sharp(buffer).metadata()\n const width = meta.width ?? 0\n const height = meta.height ?? 0\n\n const variants = new Map<string, ProcessedVariant>()\n\n const entries = Object.entries(styles)\n await Promise.all(\n entries.map(async ([name, style]) => {\n const fmt = style.format ?? 'webp'\n const quality = style.quality ?? 80\n const fit = style.fit ?? 'cover'\n\n const resized = sharp(buffer).resize({\n width: style.width,\n height: style.height,\n fit,\n withoutEnlargement: true,\n })\n\n const { data: variantBuffer, info } = await resized[fmt]({ quality }).toBuffer({\n resolveWithObject: true,\n })\n\n variants.set(name, {\n buffer: variantBuffer,\n format: fmt,\n mimeType: `image/${fmt}`,\n width: info.width,\n height: info.height,\n })\n }),\n )\n\n return { width, height, variants }\n}\n\n/**\n * Extract only image dimensions (no variant generation).\n * Useful for getting width/height when styles are empty.\n */\nexport async function getImageDimensions(\n buffer: Buffer,\n): Promise<{ width: number; height: number }> {\n const meta = await sharp(buffer).metadata()\n return { width: meta.width ?? 0, height: meta.height ?? 0 }\n}\n","/**\n * Variant key derivation convention.\n *\n * Given an original storage key and a style name, produces a deterministic\n * variant key in the same directory.\n *\n * Convention:\n * Original: uploads/2026/02/{uuid}/photo.jpg\n * Variant: uploads/2026/02/{uuid}/thumbnail_photo.webp\n */\n\n/**\n * Derive a variant storage key from the original key + style name.\n *\n * @param originalKey - The original file's storage key\n * @param styleName - The image style name (e.g., 'thumbnail', 'medium')\n * @param format - The variant output format (default: 'webp')\n * @returns The derived variant key\n */\nexport function deriveVariantKey(originalKey: string, styleName: string, format = 'webp'): string {\n const lastSlash = originalKey.lastIndexOf('/')\n const dir = originalKey.substring(0, lastSlash)\n const filename = originalKey.substring(lastSlash + 1)\n const baseName = filename.replace(/\\.[^.]+$/, '')\n return `${dir}/${styleName}_${baseName}.${format}`\n}\n"],"mappings":"qBA8BA,MAAM,EAAkB,IAAI,IAAI,CAAC,gBAAiB,WAAW,CAAC,EAM9D,SAAgB,EAAmB,EAA2B,CAC5D,OAAO,EAAS,WAAW,QAAQ,GAAK,CAAC,EAAgB,IAAI,CAAQ,CACvE,CASA,eAAsB,EACpB,EACA,EACyB,CACzB,IAAM,EAAO,MAAM,EAAM,CAAM,CAAC,CAAC,SAAS,EACpC,EAAQ,EAAK,OAAS,EACtB,EAAS,EAAK,QAAU,EAExB,EAAW,IAAI,IAEf,EAAU,OAAO,QAAQ,CAAM,EA4BrC,OA3BA,MAAM,QAAQ,IACZ,EAAQ,IAAI,MAAO,CAAC,EAAM,KAAW,CACnC,IAAM,EAAM,EAAM,QAAU,OACtB,EAAU,EAAM,SAAW,GAC3B,EAAM,EAAM,KAAO,QASnB,CAAE,KAAM,EAAe,QAAS,MAPtB,EAAM,CAAM,CAAC,CAAC,OAAO,CACnC,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,MACA,mBAAoB,EACtB,CAEkD,CAAC,CAAC,EAAI,CAAC,CAAE,SAAQ,CAAC,CAAC,CAAC,SAAS,CAC7E,kBAAmB,EACrB,CAAC,EAED,EAAS,IAAI,EAAM,CACjB,OAAQ,EACR,OAAQ,EACR,SAAU,SAAS,IACnB,MAAO,EAAK,MACZ,OAAQ,EAAK,MACf,CAAC,CACH,CAAC,CACH,EAEO,CAAE,QAAO,SAAQ,UAAS,CACnC,CAMA,eAAsB,EACpB,EAC4C,CAC5C,IAAM,EAAO,MAAM,EAAM,CAAM,CAAC,CAAC,SAAS,EAC1C,MAAO,CAAE,MAAO,EAAK,OAAS,EAAG,OAAQ,EAAK,QAAU,CAAE,CAC5D,CC9EA,SAAgB,EAAiB,EAAqB,EAAmB,EAAS,OAAgB,CAChG,IAAM,EAAY,EAAY,YAAY,GAAG,EAI7C,MAAO,GAHK,EAAY,UAAU,EAAG,CAGzB,EAAE,GAAG,EAAU,GAFV,EAAY,UAAU,EAAY,CAC3B,CAAC,CAAC,QAAQ,WAAY,EACT,EAAE,GAAG,GAC5C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@murumets-ee/media",
3
- "version": "0.27.0",
3
+ "version": "0.29.0",
4
4
  "license": "Elastic-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -49,21 +49,21 @@
49
49
  "dist"
50
50
  ],
51
51
  "dependencies": {
52
- "@radix-ui/react-dialog": "^1.1.0",
53
- "@radix-ui/react-visually-hidden": "^1.1.0",
52
+ "@radix-ui/react-dialog": "^1.1.16",
53
+ "@radix-ui/react-visually-hidden": "^1.2.5",
54
54
  "clsx": "^2.1.0",
55
55
  "drizzle-orm": "^0.45.2",
56
56
  "server-only": "^0.0.1",
57
57
  "sharp": "^0.34.5",
58
58
  "tailwind-merge": "^2.6.0",
59
59
  "zod": "^3.24.1",
60
- "@murumets-ee/core": "0.27.0",
61
- "@murumets-ee/db": "0.27.0",
62
- "@murumets-ee/entity": "0.27.0",
63
- "@murumets-ee/logging": "0.27.0",
64
- "@murumets-ee/settings": "0.27.0",
65
- "@murumets-ee/storage": "0.27.0",
66
- "@murumets-ee/ui": "0.27.0"
60
+ "@murumets-ee/core": "0.29.0",
61
+ "@murumets-ee/db": "0.29.0",
62
+ "@murumets-ee/entity": "0.29.0",
63
+ "@murumets-ee/logging": "0.29.0",
64
+ "@murumets-ee/settings": "0.29.0",
65
+ "@murumets-ee/storage": "0.29.0",
66
+ "@murumets-ee/ui": "0.29.0"
67
67
  },
68
68
  "peerDependencies": {
69
69
  "lucide-react": ">=0.400.0",
@@ -71,14 +71,14 @@
71
71
  "react-dom": ">=19.0.0"
72
72
  },
73
73
  "devDependencies": {
74
- "@types/node": "^20.19.40",
74
+ "@types/node": "^20.19.42",
75
75
  "@types/react": "^19",
76
76
  "@types/react-dom": "^19",
77
77
  "file-type": "^21.3.4",
78
78
  "lucide-react": "^0.577.0",
79
- "react": "19.2.6",
80
- "react-dom": "19.2.6",
81
- "tsdown": "^0.21.10",
79
+ "react": "19.2.7",
80
+ "react-dom": "19.2.7",
81
+ "tsdown": "^0.22.2",
82
82
  "typescript": "^5.7.3",
83
83
  "vitest": "^2.1.8"
84
84
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-CqjShq2U.d.mts","names":[],"sources":["../src/entity.ts","../src/types.ts"],"mappings":";;;;;;;;AAmBA;;;;;;;;;;;;cAAa,KAAA,gCAAK,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KCdN,SAAA;;UAGK,kBAAA;EDgEf;EC9DA,QAAA;;EAEA,QAAA;;EAEA,IAAA;;EAEA,UAAA,GAAa,cAAA;;EAEb,KAAA;;EAEA,GAAA;;EAEA,WAAA;;EAEA,KAAA;;EAEA,MAAA;;EAEA,UAAA;AAAA;;UAIe,iBAAA;;EAEf,KAAA,EAAO,WAAA;;EAEP,GAAA;AAAA;;;;;;;;KAUU,WAAA,GAAc,cAAA,QAAsB,KAAA,CAAM,SAAA;;UAGrC,gBAAA;;EAEf,SAAA,GAAY,SAAA;;EAEZ,cAAA;;EAEA,MAAA;;EAEA,KAAA;;EAEA,MAAA;;EAEA,OAAA;EAxDmB;EA0DnB,cAAA;AAAA;;UAIe,eAAA;EACf,KAAA,EAAO,WAAA;EACP,KAAA;EACA,KAAA;EACA,MAAA;AAAA;;UAIe,UAAA;EA3DF;EA6Db,KAAA;EAzDA;EA2DA,MAAA;EAvDA;EAyDA,GAAA;EArDA;EAuDA,MAAA;EAvDU;EAyDV,OAAA;AAAA;;UAIe,iBAAA;EAvDf;EAyDA,aAAA;EAvDA;EAyDA,aAAA;EAzDG;EA2DH,iBAAA,GAAoB,cAAA;EAjDC;EAmDrB,WAAA,GAAc,MAAA,SAAe,UAAA;AAAA"}