UNPKG

@angular/common

Version:

Angular - commonly needed directives and services

1 lines 29.7 kB
{"version":3,"file":"_location-chunk.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/common/src/location/util.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/common/src/location/location_strategy.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/common/src/location/location.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Joins two parts of a URL with a slash if needed.\n *\n * @param start URL string\n * @param end URL string\n *\n *\n * @returns The joined URL string.\n */\nexport function joinWithSlash(start: string, end: string) {\n // If `start` is an empty string, return `end` as the result.\n if (!start) return end;\n // If `end` is an empty string, return `start` as the result.\n if (!end) return start;\n // If `start` ends with a slash, remove the leading slash from `end`.\n if (start.endsWith('/')) {\n return end.startsWith('/') ? start + end.slice(1) : start + end;\n }\n // If `start` doesn't end with a slash, add one if `end` doesn't start with a slash.\n return end.startsWith('/') ? start + end : `${start}/${end}`;\n}\n\n/**\n * Removes a trailing slash from a URL string if needed.\n * Looks for the first occurrence of either `#`, `?`, or the end of the\n * line as `/` characters and removes the trailing slash if one exists.\n *\n * @param url URL string.\n *\n * @returns The URL string, modified if needed.\n */\nexport function stripTrailingSlash(url: string): string {\n // Find the index of the first occurrence of `#`, `?`, or the end of the string.\n // This marks the start of the query string, fragment, or the end of the URL path.\n const pathEndIdx = url.search(/#|\\?|$/);\n // Check if the character before `pathEndIdx` is a trailing slash.\n // If it is, remove the trailing slash and return the modified URL.\n // Otherwise, return the URL as is.\n return url[pathEndIdx - 1] === '/' ? url.slice(0, pathEndIdx - 1) + url.slice(pathEndIdx) : url;\n}\n\n/**\n * Normalizes URL parameters by prepending with `?` if needed.\n *\n * @param params String of URL parameters.\n *\n * @returns The normalized URL parameters string.\n */\nexport function normalizeQueryParams(params: string): string {\n return params && params[0] !== '?' ? `?${params}` : params;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n DOCUMENT,\n Inject,\n inject,\n Injectable,\n InjectionToken,\n OnDestroy,\n Optional,\n} from '@angular/core';\n\nimport {LocationChangeListener, PlatformLocation} from './platform_location';\nimport {joinWithSlash, normalizeQueryParams} from './util';\n\n/**\n * Enables the `Location` service to read route state from the browser's URL.\n * Angular provides two strategies:\n * `HashLocationStrategy` and `PathLocationStrategy`.\n *\n * Applications should use the `Router` or `Location` services to\n * interact with application route state.\n *\n * For instance, `HashLocationStrategy` produces URLs like\n * <code class=\"no-auto-link\">http://example.com/#/foo</code>,\n * and `PathLocationStrategy` produces\n * <code class=\"no-auto-link\">http://example.com/foo</code> as an equivalent URL.\n *\n * See these two classes for more.\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root', useFactory: () => inject(PathLocationStrategy)})\nexport abstract class LocationStrategy {\n abstract path(includeHash?: boolean): string;\n abstract prepareExternalUrl(internal: string): string;\n abstract getState(): unknown;\n abstract pushState(state: any, title: string, url: string, queryParams: string): void;\n abstract replaceState(state: any, title: string, url: string, queryParams: string): void;\n abstract forward(): void;\n abstract back(): void;\n historyGo?(relativePosition: number): void {\n throw new Error(ngDevMode ? 'Not implemented' : '');\n }\n abstract onPopState(fn: LocationChangeListener): void;\n abstract getBaseHref(): string;\n}\n\n/**\n * A predefined DI token for the base href\n * to be used with the `PathLocationStrategy`.\n * The base href is the URL prefix that should be preserved when generating\n * and recognizing URLs.\n *\n * @usageNotes\n *\n * The following example shows how to use this token to configure the root app injector\n * with a base href value, so that the DI framework can supply the dependency anywhere in the app.\n *\n * ```ts\n * import {NgModule} from '@angular/core';\n * import {APP_BASE_HREF} from '@angular/common';\n *\n * @NgModule({\n * providers: [{provide: APP_BASE_HREF, useValue: '/my/app'}]\n * })\n * class AppModule {}\n * ```\n *\n * @publicApi\n */\nexport const APP_BASE_HREF = new InjectionToken<string>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'appBaseHref' : '',\n);\n\n/**\n * @description\n * A {@link LocationStrategy} used to configure the {@link Location} service to\n * represent its state in the\n * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the\n * browser's URL.\n *\n * If you're using `PathLocationStrategy`, you may provide a {@link APP_BASE_HREF}\n * or add a `<base href>` element to the document to override the default.\n *\n * For instance, if you provide an `APP_BASE_HREF` of `'/my/app/'` and call\n * `location.go('/foo')`, the browser's URL will become\n * `example.com/my/app/foo`. To ensure all relative URIs resolve correctly,\n * the `<base href>` and/or `APP_BASE_HREF` should end with a `/`.\n *\n * Similarly, if you add `<base href='/my/app/'/>` to the document and call\n * `location.go('/foo')`, the browser's URL will become\n * `example.com/my/app/foo`.\n *\n * Note that when using `PathLocationStrategy`, neither the query nor\n * the fragment in the `<base href>` will be preserved, as outlined\n * by the [RFC](https://tools.ietf.org/html/rfc3986#section-5.2.2).\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/location/ts/path_location_component.ts region='LocationComponent'}\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root'})\nexport class PathLocationStrategy extends LocationStrategy implements OnDestroy {\n private _baseHref: string;\n private _removeListenerFns: (() => void)[] = [];\n\n constructor(\n private _platformLocation: PlatformLocation,\n @Optional() @Inject(APP_BASE_HREF) href?: string,\n ) {\n super();\n\n this._baseHref =\n href ??\n this._platformLocation.getBaseHrefFromDOM() ??\n inject(DOCUMENT).location?.origin ??\n '';\n }\n\n /** @docs-private */\n ngOnDestroy(): void {\n while (this._removeListenerFns.length) {\n this._removeListenerFns.pop()!();\n }\n }\n\n override onPopState(fn: LocationChangeListener): void {\n this._removeListenerFns.push(\n this._platformLocation.onPopState(fn),\n this._platformLocation.onHashChange(fn),\n );\n }\n\n override getBaseHref(): string {\n return this._baseHref;\n }\n\n override prepareExternalUrl(internal: string): string {\n return joinWithSlash(this._baseHref, internal);\n }\n\n override path(includeHash: boolean = false): string {\n const pathname =\n this._platformLocation.pathname + normalizeQueryParams(this._platformLocation.search);\n const hash = this._platformLocation.hash;\n return hash && includeHash ? `${pathname}${hash}` : pathname;\n }\n\n override pushState(state: any, title: string, url: string, queryParams: string) {\n const externalUrl = this.prepareExternalUrl(url + normalizeQueryParams(queryParams));\n this._platformLocation.pushState(state, title, externalUrl);\n }\n\n override replaceState(state: any, title: string, url: string, queryParams: string) {\n const externalUrl = this.prepareExternalUrl(url + normalizeQueryParams(queryParams));\n this._platformLocation.replaceState(state, title, externalUrl);\n }\n\n override forward(): void {\n this._platformLocation.forward();\n }\n\n override back(): void {\n this._platformLocation.back();\n }\n\n override getState(): unknown {\n return this._platformLocation.getState();\n }\n\n override historyGo(relativePosition: number = 0): void {\n this._platformLocation.historyGo?.(relativePosition);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injectable, OnDestroy, ɵɵinject} from '@angular/core';\nimport {Subject, SubscriptionLike} from 'rxjs';\n\nimport {LocationStrategy} from './location_strategy';\nimport {joinWithSlash, normalizeQueryParams, stripTrailingSlash} from './util';\n\n/** @publicApi */\nexport interface PopStateEvent {\n pop?: boolean;\n state?: any;\n type?: string;\n url?: string;\n}\n\n/**\n * @description\n *\n * A service that applications can use to interact with a browser's URL.\n *\n * Depending on the `LocationStrategy` used, `Location` persists\n * to the URL's path or the URL's hash segment.\n *\n * @usageNotes\n *\n * It's better to use the `Router.navigate()` service to trigger route changes. Use\n * `Location` only if you need to interact with or create normalized URLs outside of\n * routing.\n *\n * `Location` is responsible for normalizing the URL against the application's base href.\n * A normalized URL is absolute from the URL host, includes the application's base href, and has no\n * trailing slash:\n * - `/my/app/user/123` is normalized\n * - `my/app/user/123` **is not** normalized\n * - `/my/app/user/123/` **is not** normalized\n *\n * ### Example\n *\n * {@example common/location/ts/path_location_component.ts region='LocationComponent'}\n *\n * @publicApi\n */\n@Injectable({\n providedIn: 'root',\n // See #23917\n useFactory: createLocation,\n})\nexport class Location implements OnDestroy {\n /** @internal */\n _subject = new Subject<PopStateEvent>();\n /** @internal */\n _basePath: string;\n /** @internal */\n _locationStrategy: LocationStrategy;\n /** @internal */\n _urlChangeListeners: ((url: string, state: unknown) => void)[] = [];\n /** @internal */\n _urlChangeSubscription: SubscriptionLike | null = null;\n\n constructor(locationStrategy: LocationStrategy) {\n this._locationStrategy = locationStrategy;\n const baseHref = this._locationStrategy.getBaseHref();\n // Note: This class's interaction with base HREF does not fully follow the rules\n // outlined in the spec https://www.freesoft.org/CIE/RFC/1808/18.htm.\n // Instead of trying to fix individual bugs with more and more code, we should\n // investigate using the URL constructor and providing the base as a second\n // argument.\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/URL#parameters\n this._basePath = _stripOrigin(stripTrailingSlash(_stripIndexHtml(baseHref)));\n this._locationStrategy.onPopState((ev) => {\n this._subject.next({\n 'url': this.path(true),\n 'pop': true,\n 'state': ev.state,\n 'type': ev.type,\n });\n });\n }\n\n /** @docs-private */\n ngOnDestroy(): void {\n this._urlChangeSubscription?.unsubscribe();\n this._urlChangeListeners = [];\n }\n\n /**\n * Normalizes the URL path for this location.\n *\n * @param includeHash True to include an anchor fragment in the path.\n *\n * @returns The normalized URL path.\n */\n // TODO: vsavkin. Remove the boolean flag and always include hash once the deprecated router is\n // removed.\n path(includeHash: boolean = false): string {\n return this.normalize(this._locationStrategy.path(includeHash));\n }\n\n /**\n * Reports the current state of the location history.\n * @returns The current value of the `history.state` object.\n */\n getState(): unknown {\n return this._locationStrategy.getState();\n }\n\n /**\n * Normalizes the given path and compares to the current normalized path.\n *\n * @param path The given URL path.\n * @param query Query parameters.\n *\n * @returns True if the given URL path is equal to the current normalized path, false\n * otherwise.\n */\n isCurrentPathEqualTo(path: string, query: string = ''): boolean {\n return this.path() == this.normalize(path + normalizeQueryParams(query));\n }\n\n /**\n * Normalizes a URL path by stripping any trailing slashes.\n *\n * @param url String representing a URL.\n *\n * @returns The normalized URL string.\n */\n normalize(url: string): string {\n return Location.stripTrailingSlash(_stripBasePath(this._basePath, _stripIndexHtml(url)));\n }\n\n /**\n * Normalizes an external URL path.\n * If the given URL doesn't begin with a leading slash (`'/'`), adds one\n * before normalizing. Adds a hash if `HashLocationStrategy` is\n * in use, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.\n *\n * @param url String representing a URL.\n *\n * @returns A normalized platform-specific URL.\n */\n prepareExternalUrl(url: string): string {\n if (url && url[0] !== '/') {\n url = '/' + url;\n }\n return this._locationStrategy.prepareExternalUrl(url);\n }\n\n // TODO: rename this method to pushState\n /**\n * Changes the browser's URL to a normalized version of a given URL, and pushes a\n * new item onto the platform's history.\n *\n * @param path URL path to normalize.\n * @param query Query parameters.\n * @param state Location history state.\n *\n */\n go(path: string, query: string = '', state: any = null): void {\n this._locationStrategy.pushState(state, '', path, query);\n this._notifyUrlChangeListeners(\n this.prepareExternalUrl(path + normalizeQueryParams(query)),\n state,\n );\n }\n\n /**\n * Changes the browser's URL to a normalized version of the given URL, and replaces\n * the top item on the platform's history stack.\n *\n * @param path URL path to normalize.\n * @param query Query parameters.\n * @param state Location history state.\n */\n replaceState(path: string, query: string = '', state: any = null): void {\n this._locationStrategy.replaceState(state, '', path, query);\n this._notifyUrlChangeListeners(\n this.prepareExternalUrl(path + normalizeQueryParams(query)),\n state,\n );\n }\n\n /**\n * Navigates forward in the platform's history.\n */\n forward(): void {\n this._locationStrategy.forward();\n }\n\n /**\n * Navigates back in the platform's history.\n */\n back(): void {\n this._locationStrategy.back();\n }\n\n /**\n * Navigate to a specific page from session history, identified by its relative position to the\n * current page.\n *\n * @param relativePosition Position of the target page in the history relative to the current\n * page.\n * A negative value moves backwards, a positive value moves forwards, e.g. `location.historyGo(2)`\n * moves forward two pages and `location.historyGo(-2)` moves back two pages. When we try to go\n * beyond what's stored in the history session, we stay in the current page. Same behaviour occurs\n * when `relativePosition` equals 0.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/History_API#Moving_to_a_specific_point_in_history\n */\n historyGo(relativePosition: number = 0): void {\n this._locationStrategy.historyGo?.(relativePosition);\n }\n\n /**\n * Registers a URL change listener. Use to catch updates performed by the Angular\n * framework that are not detectible through \"popstate\" or \"hashchange\" events.\n *\n * @param fn The change handler function, which take a URL and a location history state.\n * @returns A function that, when executed, unregisters a URL change listener.\n */\n onUrlChange(fn: (url: string, state: unknown) => void): VoidFunction {\n this._urlChangeListeners.push(fn);\n\n this._urlChangeSubscription ??= this.subscribe((v) => {\n this._notifyUrlChangeListeners(v.url, v.state);\n });\n\n return () => {\n const fnIndex = this._urlChangeListeners.indexOf(fn);\n this._urlChangeListeners.splice(fnIndex, 1);\n\n if (this._urlChangeListeners.length === 0) {\n this._urlChangeSubscription?.unsubscribe();\n this._urlChangeSubscription = null;\n }\n };\n }\n\n /** @internal */\n _notifyUrlChangeListeners(url: string = '', state: unknown) {\n this._urlChangeListeners.forEach((fn) => fn(url, state));\n }\n\n /**\n * Subscribes to the platform's `popState` events.\n *\n * Note: `Location.go()` does not trigger the `popState` event in the browser. Use\n * `Location.onUrlChange()` to subscribe to URL changes instead.\n *\n * @param value Event that is triggered when the state history changes.\n * @param exception The exception to throw.\n *\n * @see [onpopstate](https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onpopstate)\n *\n * @returns Subscribed events.\n */\n subscribe(\n onNext: (value: PopStateEvent) => void,\n onThrow?: ((exception: any) => void) | null,\n onReturn?: (() => void) | null,\n ): SubscriptionLike {\n return this._subject.subscribe({\n next: onNext,\n error: onThrow ?? undefined,\n complete: onReturn ?? undefined,\n });\n }\n\n /**\n * Normalizes URL parameters by prepending with `?` if needed.\n *\n * @param params String of URL parameters.\n *\n * @returns The normalized URL parameters string.\n */\n public static normalizeQueryParams: (params: string) => string = normalizeQueryParams;\n\n /**\n * Joins two parts of a URL with a slash if needed.\n *\n * @param start URL string\n * @param end URL string\n *\n *\n * @returns The joined URL string.\n */\n public static joinWithSlash: (start: string, end: string) => string = joinWithSlash;\n\n /**\n * Removes a trailing slash from a URL string if needed.\n * Looks for the first occurrence of either `#`, `?`, or the end of the\n * line as `/` characters and removes the trailing slash if one exists.\n *\n * @param url URL string.\n *\n * @returns The URL string, modified if needed.\n */\n public static stripTrailingSlash: (url: string) => string = stripTrailingSlash;\n}\n\nexport function createLocation() {\n return new Location(ɵɵinject(LocationStrategy as any));\n}\n\nfunction _stripBasePath(basePath: string, url: string): string {\n if (!basePath || !url.startsWith(basePath)) {\n return url;\n }\n const strippedUrl = url.substring(basePath.length);\n if (strippedUrl === '' || ['/', ';', '?', '#'].includes(strippedUrl[0])) {\n return strippedUrl;\n }\n return url;\n}\n\nfunction _stripIndexHtml(url: string): string {\n return url.replace(/\\/index.html$/, '');\n}\n\nfunction _stripOrigin(baseHref: string): string {\n // DO NOT REFACTOR! Previously, this check looked like this:\n // `/^(https?:)?\\/\\//.test(baseHref)`, but that resulted in\n // syntactically incorrect code after Closure Compiler minification.\n // This was likely caused by a bug in Closure Compiler, but\n // for now, the check is rewritten to use `new RegExp` instead.\n const isAbsoluteUrl = new RegExp('^(https?:)?//').test(baseHref);\n if (isAbsoluteUrl) {\n const [, pathname] = baseHref.split(/\\/\\/[^\\/]+/);\n return pathname;\n }\n return baseHref;\n}\n"],"names":["joinWithSlash","start","end","endsWith","startsWith","slice","stripTrailingSlash","url","pathEndIdx","search","normalizeQueryParams","params","LocationStrategy","historyGo","relativePosition","Error","ngDevMode","deps","target","i0","ɵɵFactoryTarget","Injectable","providedIn","useFactory","inject","PathLocationStrategy","decorators","args","APP_BASE_HREF","InjectionToken","_platformLocation","_baseHref","_removeListenerFns","constructor","href","getBaseHrefFromDOM","DOCUMENT","location","origin","ngOnDestroy","length","pop","onPopState","fn","push","onHashChange","getBaseHref","prepareExternalUrl","internal","path","includeHash","pathname","hash","pushState","state","title","queryParams","externalUrl","replaceState","forward","back","getState","ɵfac","ɵɵngDeclareFactory","minVersion","version","ngImport","type","optional","ɵprov","ɵɵngDeclareInjectable","Optional","Inject","Location","_subject","Subject","_basePath","_locationStrategy","_urlChangeListeners","_urlChangeSubscription","locationStrategy","baseHref","_stripOrigin","_stripIndexHtml","ev","next","unsubscribe","normalize","isCurrentPathEqualTo","query","_stripBasePath","go","_notifyUrlChangeListeners","onUrlChange","subscribe","v","fnIndex","indexOf","splice","forEach","onNext","onThrow","onReturn","error","undefined","complete","token","i1","createLocation","ɵɵinject","basePath","strippedUrl","substring","includes","replace","isAbsoluteUrl","RegExp","test","split"],"mappings":"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"}