UNPKG

@limitless-angular/sanity

Version:

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

1 lines 23.6 kB
{"version":3,"file":"limitless-angular-sanity-visual-editing.mjs","sources":["../../../../packages/sanity/visual-editing/src/utils.ts","../../../../packages/sanity/visual-editing/src/visual-editing-client.component.ts","../../../../packages/sanity/visual-editing/src/visual-editing.component.ts","../../../../packages/sanity/visual-editing/src/limitless-angular-sanity-visual-editing.ts"],"sourcesContent":["/**\n * From: https://github.com/vercel/next.js/blob/5469e6427b54ab7e9876d4c85b47f9c3afdc5c1f/packages/next/src/shared/lib/router/utils/path-has-prefix.ts#L10-L17\n * Checks if a given path starts with a given prefix. It ensures it matches\n * exactly without containing extra chars. e.g. prefix /docs should replace\n * for /docs, /docs/, /docs/a but not /docsss\n * @param path The path to check.\n * @param prefix The prefix to check against.\n */\nfunction pathHasPrefix(path: string, prefix: string): boolean {\n if (typeof path !== 'string') {\n return false;\n }\n\n const { pathname } = parsePath(path);\n return pathname === prefix || pathname.startsWith(`${prefix}/`);\n}\n\n/**\n * From: https://github.com/vercel/next.js/blob/5469e6427b54ab7e9876d4c85b47f9c3afdc5c1f/packages/next/src/shared/lib/router/utils/parse-path.ts#L6-L22\n * Given a path this function will find the pathname, query and hash and return\n * them. This is useful to parse full paths on the client side.\n * @param path A path to parse e.g. /foo/bar?id=1#hash\n */\nfunction parsePath(path: string): {\n pathname: string;\n query: string;\n hash: string;\n} {\n const hashIndex = path.indexOf('#');\n const queryIndex = path.indexOf('?');\n const hasQuery = queryIndex > -1 && (hashIndex < 0 || queryIndex < hashIndex);\n\n if (hasQuery || hashIndex > -1) {\n return {\n pathname: path.substring(0, hasQuery ? queryIndex : hashIndex),\n query: hasQuery\n ? path.substring(queryIndex, hashIndex > -1 ? hashIndex : undefined)\n : '',\n hash: hashIndex > -1 ? path.slice(hashIndex) : '',\n };\n }\n\n return { pathname: path, query: '', hash: '' };\n}\n\n/**\n * From: https://github.com/vercel/next.js/blob/5469e6427b54ab7e9876d4c85b47f9c3afdc5c1f/packages/next/src/shared/lib/router/utils/add-path-prefix.ts#L3C1-L14C2\n * Adds the provided prefix to the given path. It first ensures that the path\n * is indeed starting with a slash.\n */\nexport function addPathPrefix(path: string, prefix?: string): string {\n if (!path.startsWith('/') || !prefix) {\n return path;\n }\n // If the path is exactly '/' then return just the prefix\n if (path === '/' && prefix) {\n return prefix;\n }\n\n const { pathname, query, hash } = parsePath(path);\n return `${prefix}${pathname}${query}${hash}`;\n}\n\n/**\n * From: https://github.com/vercel/next.js/blob/5469e6427b54ab7e9876d4c85b47f9c3afdc5c1f/packages/next/src/shared/lib/router/utils/remove-path-prefix.ts#L3-L39\n * Given a path and a prefix it will remove the prefix when it exists in the\n * given path. It ensures it matches exactly without containing extra chars\n * and if the prefix is not there it will be noop.\n *\n * @param path The path to remove the prefix from.\n * @param prefix The prefix to be removed.\n */\nexport function removePathPrefix(path: string, prefix: string): string {\n // If the path doesn't start with the prefix we can return it as is. This\n // protects us from situations where the prefix is a substring of the path\n // prefix such as:\n //\n // For prefix: /blog\n //\n // /blog -> true\n // /blog/ -> true\n // /blog/1 -> true\n // /blogging -> false\n // /blogging/ -> false\n // /blogging/1 -> false\n if (!pathHasPrefix(path, prefix)) {\n return path;\n }\n\n // Remove the prefix from the path via slicing.\n const withoutPrefix = path.slice(prefix.length);\n\n // If the path without the prefix starts with a `/` we can return it as is.\n if (withoutPrefix.startsWith('/')) {\n return withoutPrefix;\n }\n\n // If the path without the prefix doesn't start with a `/` we need to add it\n // back to the path to make sure it's a valid path.\n return `/${withoutPrefix}`;\n}\n\n/**\n * From: https://github.com/vercel/next.js/blob/dfe7fc03e2268e7cb765dce6a89e02c831c922d5/packages/next/src/client/normalize-trailing-slash.ts#L16\n * Normalizes the trailing slash of a path according to the `trailingSlash` option\n * in `next.config.js`.\n */\nexport const normalizePathTrailingSlash = (\n path: string,\n trailingSlash: boolean,\n): string => {\n const { pathname, query, hash } = parsePath(path);\n if (trailingSlash) {\n if (pathname.endsWith('/')) {\n return `${pathname}${query}${hash}`;\n }\n return `${pathname}/${query}${hash}`;\n }\n\n return `${removeTrailingSlash(pathname)}${query}${hash}`;\n};\n\n/**\n * From: https://github.com/vercel/next.js/blob/dfe7fc03e2268e7cb765dce6a89e02c831c922d5/packages/next/src/shared/lib/router/utils/remove-trailing-slash.ts#L8\n * Removes the trailing slash for a given route or page path. Preserves the\n * root page. Examples:\n * - `/foo/bar/` -> `/foo/bar`\n * - `/foo/bar` -> `/foo/bar`\n * - `/` -> `/`\n */\nfunction removeTrailingSlash(route: string) {\n return route.replace(/\\/$/, '') || '/';\n}\n","import {\n Component,\n inject,\n effect,\n signal,\n computed,\n ChangeDetectionStrategy,\n input,\n untracked,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Location } from '@angular/common';\nimport { Router, NavigationEnd } from '@angular/router';\n\nimport {\n enableVisualEditing,\n type HistoryAdapterNavigate,\n type VisualEditingOptions,\n} from '@sanity/visual-editing';\nimport { filter } from 'rxjs/operators';\n\n// import { revalidateRootLayout } from 'next-sanity/visual-editing/server-actions'; // You might need to adapt this import\n\nimport {\n addPathPrefix,\n normalizePathTrailingSlash,\n removePathPrefix,\n} from './utils';\n\nexport interface VisualEditingProps\n extends Omit<VisualEditingOptions, 'history'> {\n /**\n * If next.config.ts is configured with a basePath we try to configure it automatically,\n * you can disable this by setting basePath to ''.\n * @example basePath=\"/my-custom-base-path\"\n * @alpha experimental and may change without notice\n * @defaultValue process.env.__NEXT_ROUTER_BASEPATH || ''\n */\n basePath?: string;\n /**\n * If next.config.ts is configured with a `trailingSlash` we try to detect it automatically,\n * it can be controlled manually by passing a boolean.\n * @example trailingSlash={true}\n * @alpha experimental and may change without notice\n * @defaultValue Boolean(process.env.__NEXT_TRAILING_SLASH)\n */\n trailingSlash?: boolean;\n}\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'visual-editing-client',\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class VisualEditingClientComponent {\n refresh = input<VisualEditingProps['refresh']>();\n\n zIndex = input<VisualEditingProps['zIndex']>();\n\n basePath = input<string, VisualEditingProps['basePath']>('', {\n transform: (value) => value ?? '',\n });\n\n trailingSlash = input<boolean, VisualEditingProps['trailingSlash']>(false, {\n transform: (value) => Boolean(value),\n });\n\n private navigate = signal<HistoryAdapterNavigate | undefined>(undefined);\n\n private currentUrl = computed(() => {\n const urlTree = this.router.parseUrl(this.router.url);\n const pathname =\n urlTree.root.children['primary']?.segments\n .map((segment) => segment.path)\n .join('/') || '/';\n const searchParams = new URLSearchParams(urlTree.queryParams).toString();\n return normalizePathTrailingSlash(\n addPathPrefix(\n `${pathname}${searchParams ? `?${searchParams}` : ''}`,\n this.basePath(),\n ),\n this.trailingSlash(),\n );\n });\n\n private location = inject(Location);\n\n private router = inject(Router);\n\n constructor() {\n effect(() => {\n const zIndex = this.zIndex();\n const refresh = this.refresh();\n const basePath = this.basePath();\n\n return untracked(() => {\n const disable = enableVisualEditing({\n zIndex,\n refresh: refresh || this.defaultRefresh,\n history: {\n subscribe: (_navigate) => {\n this.navigate.set(_navigate);\n return () => this.navigate.set(undefined);\n },\n update: (update) => {\n switch (update.type) {\n case 'push':\n return this.router.navigateByUrl(\n removePathPrefix(update.url, basePath),\n );\n case 'pop':\n return this.location.back();\n case 'replace':\n return this.router.navigateByUrl(\n removePathPrefix(update.url, basePath),\n { replaceUrl: true },\n );\n default:\n throw new Error(`Unknown update type: ${update.type}`);\n }\n },\n },\n });\n\n return () => disable();\n });\n });\n\n effect(() => {\n const currentNavigate = this.navigate();\n const url = this.currentUrl();\n\n untracked(() => {\n if (currentNavigate) {\n currentNavigate({\n type: 'push',\n url,\n });\n }\n });\n });\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(),\n )\n .subscribe(() => {\n const currentNavigate = this.navigate();\n const url = this.currentUrl();\n\n untracked(() => {\n if (currentNavigate) {\n currentNavigate({\n type: 'push',\n url,\n });\n }\n });\n });\n }\n\n private defaultRefresh: VisualEditingOptions['refresh'] = (payload) => {\n switch (payload.source) {\n case 'manual':\n return payload.livePreviewEnabled\n ? this.manualFastRefresh()\n : this.manualFallbackRefresh();\n case 'mutation':\n return payload.livePreviewEnabled\n ? this.mutationFastRefresh()\n : this.mutationFallbackRefresh();\n default:\n // eslint-disable-next-line no-case-declarations\n const error = new Error('Unknown refresh source');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).details = { cause: payload };\n throw error;\n }\n };\n\n private manualFastRefresh() {\n console.debug(\n 'Live preview is setup, refreshing the view without refetching cached data',\n );\n // In Angular, we don't have a direct equivalent to router.refresh()\n // You might need to implement a custom solution here\n // TODO: check alternative\n return Promise.resolve();\n }\n\n private manualFallbackRefresh() {\n console.debug(\n 'No loaders in live mode detected, or preview kit setup, revalidating root layout',\n );\n return Promise.resolve();\n // TODO: check alternative\n // return revalidateRootLayout();\n }\n\n private mutationFastRefresh(): false {\n console.debug(\n 'Live preview is setup, mutation is skipped assuming its handled by the live preview',\n );\n return false;\n }\n\n private mutationFallbackRefresh() {\n console.debug(\n 'No loaders in live mode detected, or preview kit setup, revalidating root layout',\n );\n return Promise.resolve();\n // TODO: check alternative\n // return revalidateRootLayout();\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n computed,\n PLATFORM_ID,\n inject,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nimport {\n VisualEditingClientComponent,\n type VisualEditingProps,\n} from './visual-editing-client.component';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'visual-editing',\n imports: [VisualEditingClientComponent],\n template: `\n @if (isBrowser) {\n <visual-editing-client\n [refresh]=\"refresh()\"\n [zIndex]=\"zIndex()\"\n [basePath]=\"computedBasePath()\"\n [trailingSlash]=\"computedTrailingSlash()\"\n />\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class VisualEditingComponent {\n refresh = input<VisualEditingProps['refresh']>();\n zIndex = input<VisualEditingProps['zIndex']>();\n basePath = input<VisualEditingProps['basePath']>(undefined);\n trailingSlash = input<VisualEditingProps['trailingSlash']>();\n\n isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private autoBasePath = computed(() => {\n if (typeof this.basePath() === 'string') {\n return undefined;\n }\n\n try {\n const detectedBasePath = !this.isBrowser\n ? process.env['__NEXT_ROUTER_BASEPATH']\n : undefined;\n if (detectedBasePath) {\n console.log(\n `Detected next basePath as ${JSON.stringify(detectedBasePath)} by reading \"process.env.__NEXT_ROUTER_BASEPATH\". If this is incorrect then you can set it manually with the basePath input on the VisualEditing component.`,\n );\n }\n\n return detectedBasePath;\n } catch (err) {\n console.error('Failed detecting basePath', err);\n return undefined;\n }\n });\n\n private autoTrailingSlash = computed(() => {\n if (typeof this.trailingSlash() === 'boolean') {\n return undefined;\n }\n\n try {\n const detectedTrailingSlash = Boolean(\n !this.isBrowser && process.env['__NEXT_TRAILING_SLASH'],\n );\n if (detectedTrailingSlash) {\n console.log(\n `Detected next trailingSlash as ${JSON.stringify(detectedTrailingSlash)} by reading \"process.env.__NEXT_TRAILING_SLASH\". If this is incorrect then you can set it manually with the trailingSlash input on the VisualEditing component.`,\n );\n }\n\n return detectedTrailingSlash;\n } catch (err) {\n console.error('Failed detecting trailingSlash', err);\n return undefined;\n }\n });\n\n computedBasePath = computed(() => this.basePath() ?? this.autoBasePath());\n computedTrailingSlash = computed(\n () => this.trailingSlash() ?? this.autoTrailingSlash(),\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}