UNPKG

@limitless-angular/sanity

Version:

A powerful Angular library for Sanity.io integration, featuring Portable Text rendering and optimized image loading.

1 lines 10.6 kB
{"version":3,"file":"limitless-angular-sanity-image-loader.mjs","sources":["../../../../packages/sanity/image-loader/src/loader.ts","../../../../packages/sanity/image-loader/src/sanity-image.directive.ts","../../../../packages/sanity/image-loader/src/limitless-angular-sanity-image-loader.ts"],"sourcesContent":["import { inject, Provider } from '@angular/core';\nimport { IMAGE_LOADER, ImageLoaderConfig } from '@angular/common';\n\nimport imageUrlBuilder from '@sanity/image-url';\n\nimport { SANITY_CONFIG, SanityConfig } from '@limitless-angular/sanity/shared';\n\nexport function sanityImageLoader(config?: SanityConfig | null) {\n return (loaderConfig: ImageLoaderConfig) => {\n const { src, loaderParams = {}, width, isPlaceholder } = loaderConfig;\n let url: URL | undefined;\n const { quality, ...options } = loaderParams;\n try {\n url = new URL(src);\n } catch {\n const builder = imageUrlBuilder(config ?? undefined);\n url = new URL(builder.image(src).withOptions(options).url());\n }\n\n url.searchParams.set('auto', 'format');\n url.searchParams.set(\n 'fit',\n url.searchParams.get('fit') || url.searchParams.has('h') ? 'min' : 'max',\n );\n if (width && url.searchParams.has('h') && url.searchParams.has('w')) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const originalHeight = parseInt(url.searchParams.get('h')!, 10);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const originalWidth = parseInt(url.searchParams.get('w')!, 10);\n url.searchParams.set(\n 'h',\n Math.round((originalHeight / originalWidth) * width).toString(),\n );\n }\n\n if (width) {\n url.searchParams.set('w', width.toString());\n }\n\n if (quality) {\n url.searchParams.set('q', quality.toString());\n }\n\n if (isPlaceholder) {\n url.searchParams.set('blur', '50');\n url.searchParams.set('q', '20');\n }\n\n return url.href;\n };\n}\n\nexport function provideSanityLoader(config?: SanityConfig): Provider {\n const configProviders = config\n ? [{ provide: SANITY_CONFIG, useValue: config }]\n : [];\n\n return [\n ...configProviders,\n {\n provide: IMAGE_LOADER,\n useFactory: () => {\n const config = inject(SANITY_CONFIG, { optional: true });\n return sanityImageLoader(config);\n },\n },\n ];\n}\n","import {\n computed,\n Directive,\n inject,\n Input,\n input,\n OnChanges,\n OnInit,\n SimpleChange,\n SimpleChanges,\n} from '@angular/core';\nimport {\n IMAGE_LOADER,\n type ImageLoaderConfig,\n NgOptimizedImage,\n} from '@angular/common';\n\nimport type {\n ImageUrlBuilderOptions,\n SanityImageSource,\n} from '@sanity/image-url/lib/types/types';\nimport imageUrlBuilder from '@sanity/image-url';\n\nimport { SANITY_CONFIG } from '@limitless-angular/sanity/shared';\nimport { sanityImageLoader } from './loader';\n\ntype LoaderParams = Omit<ImageUrlBuilderOptions, 'quality'>;\n\nfunction getNoopImageLoader() {\n return (\n IMAGE_LOADER.ɵprov as {\n factory: () => (config: ImageLoaderConfig) => string;\n }\n ).factory();\n}\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: 'img[sanityImage]',\n providers: [\n {\n provide: IMAGE_LOADER,\n useFactory: () => {\n const config = inject(SANITY_CONFIG);\n const imageLoader = inject(IMAGE_LOADER, { skipSelf: true });\n const noopImageLoader = getNoopImageLoader();\n return imageLoader !== noopImageLoader\n ? imageLoader\n : sanityImageLoader(config);\n },\n },\n ],\n})\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport class SanityImage extends NgOptimizedImage implements OnInit, OnChanges {\n private _loaderParams: LoaderParams = {};\n\n sanityImage = input.required<SanityImageSource>();\n\n @Input()\n // @ts-expect-error we want to add some internal properties to loaderParams input\n override set loaderParams(loaderParams: LoaderParams) {\n this._loaderParams = loaderParams;\n }\n\n override get loaderParams(): LoaderParams {\n return this._loaderParams;\n }\n\n @Input() override ngSrc!: string;\n\n quality = input<number>();\n\n private imageUrl = computed(() => {\n const url = new URL(\n imageUrlBuilder(this.sanityConfig)\n .image(this.sanityImage())\n .withOptions(this._loaderParams)\n .url(),\n );\n if (this.width) {\n url.searchParams.set('w', this.width.toString());\n }\n\n if (this.height) {\n url.searchParams.set('h', this.height.toString());\n }\n\n if (this.quality()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n url.searchParams.set('q', this.quality()!.toString());\n }\n\n return url.toString();\n });\n\n private sanityConfig = inject(SANITY_CONFIG);\n\n override ngOnInit() {\n this.ngSrc = this.imageUrl();\n super.ngOnInit();\n }\n\n // ngSrc is not being updated by NgOptimizedImage, so we need to do it manually\n override ngOnChanges(changes: SimpleChanges) {\n if (changes['sanityImage']) {\n const ngSrc = this.imageUrl();\n changes['ngSrc'] = new SimpleChange(\n this.ngSrc,\n ngSrc,\n changes['sanityImage'].isFirstChange(),\n );\n this.ngSrc = ngSrc;\n }\n\n super.ngOnChanges(changes);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}