@sneat/auth-core 0.12.1 → 0.13.1

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.
@@ -3,13 +3,37 @@ import { Injectable, inject } from '@angular/core';
3
3
  import { Auth } from '@angular/fire/auth';
4
4
  import { map } from 'rxjs/operators';
5
5
  import * as i0 from "@angular/core";
6
+ /**
7
+ * Strip the document's `<base href>` prefix from a browser pathname, returning a
8
+ * router-relative path.
9
+ *
10
+ * Apps mounted under a base href (e.g. `/app/` in the Sneat site-hosting
11
+ * pattern) have a `location.pathname` of `/app/new-game`, but the Angular Router
12
+ * matches routes relative to the base href (`new-game`). Feeding the un-stripped
13
+ * pathname back into the router after login fails to match any route (NG04002).
14
+ */
15
+ function routerRelativePath(pathname) {
16
+ const baseHref = document.querySelector('base')?.getAttribute('href') ?? '/';
17
+ if (baseHref === '/' || baseHref === '') {
18
+ return pathname;
19
+ }
20
+ const base = baseHref.replace(/\/$/, ''); // '/app/' -> '/app'
21
+ if (pathname === base) {
22
+ return '/';
23
+ }
24
+ if (pathname.startsWith(base + '/')) {
25
+ return pathname.slice(base.length); // '/app/new-game' -> '/new-game'
26
+ }
27
+ return pathname;
28
+ }
6
29
  export const redirectToLoginIfNotSignedIn = map((user) => {
7
30
  if (user) {
8
31
  return true;
9
32
  }
33
+ const path = routerRelativePath(location.pathname);
10
34
  let url = '/login';
11
- if (location.pathname != '/') {
12
- url += '#' + location.pathname;
35
+ if (path != '/') {
36
+ url += '#' + path;
13
37
  }
14
38
  return url;
15
39
  });
@@ -1 +1 @@
1
- {"version":3,"file":"sneat-auth-guard.js","sourceRoot":"","sources":["../../../../../../libs/auth/core/src/lib/sneat-auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,MAAM,GAIP,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;;AAQrC,MAAM,CAAC,MAAM,4BAA4B,GAAa,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;IACjE,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,IAAI,QAAQ,CAAC,QAAQ,IAAI,GAAG,EAAE,CAAC;QAC7B,GAAG,IAAI,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACjC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,CAAC;AAKH,MAAM,OAAO,cAAc,CAAC,qDAAqD;IAHjF;QAImB,WAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,SAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;KA0DtC;IAxDQ,OAAO,CACZ,MAAa,EACb,SAAuB;QAMvB,CAAC;YACC,0DAA0D;YAC1D,0BAA0B;YAC1B,qFAAqF;YACrF,yCAAyC;YACzC,uCAAuC;YACvC,kCAAkC;YAClC,qBAAqB;YACrB,6CAA6C;YAC7C,KAAK;YACL,KAAK;YACL,8BAA8B;YAC9B,mBAAmB;YACnB,+BAA+B;YAC/B,iBAAiB;YACjB,OAAO;YACP,YAAY;YACZ,qCAAqC;YACrC,kBAAkB;YAClB,6BAA6B;YAC7B,oCAAoC;YACpC,iBAAiB;YACjB,qCAAqC;YACrC,4CAA4C;YAC5C,aAAa;YACb,uCAAuC;YACvC,MAAM;YACN,OAAO;YACP,KAAK;YACL,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEM,WAAW,CAChB,MAA8B,EAC9B,MAA2B;QAE3B,2DAA2D;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CACd,WAAmC,EACnC,MAA2B;QAE3B,qEAAqE;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;8GA3DU,cAAc,CAAC,qDAAqD;kHAApE,cAAc,CAAC,qDAAqD,cAFnE,MAAM;;2FAEP,cAAc,CAAC,qDAAqD;kBAHhF,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;AA+DD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAA+B,EAAE,EAAE,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC,cAAc,CAAC;IACzB,IAAI,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE;CACrC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,WAAW,EAAE,CAAC,cAAc,CAAC;IAC7B,OAAO,EAAE,CAAC,cAAc,CAAC;CAC1B,CAAC","sourcesContent":["import {\n ActivatedRouteSnapshot,\n // CanActivate,\n // CanActivateChild,\n // CanLoad,\n Route,\n Router,\n RouterStateSnapshot,\n UrlSegment,\n UrlTree,\n} from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { Injectable, inject } from '@angular/core';\nimport { Auth } from '@angular/fire/auth';\nimport { map } from 'rxjs/operators';\nimport { AuthPipe } from '@angular/fire/auth-guard';\n\ntype AuthCanLoadPipeGenerator = (\n route: Route,\n segments: UrlSegment[],\n) => AuthPipe;\n\nexport const redirectToLoginIfNotSignedIn: AuthPipe = map((user) => {\n if (user) {\n return true;\n }\n let url = '/login';\n if (location.pathname != '/') {\n url += '#' + location.pathname;\n }\n return url;\n});\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SneatAuthGuard /*implements CanLoad, CanActivate, CanActivateChild*/ {\n private readonly router = inject(Router);\n private readonly auth = inject(Auth);\n\n public canLoad(\n _route: Route,\n _segments: UrlSegment[],\n ):\n | Observable<boolean | UrlTree>\n | Promise<boolean | UrlTree>\n | boolean\n | UrlTree {\n {\n // console.log('SneatAuthGuard.canLoad', route, segments);\n // const authPipeFactory =\n // \t(route.data && route.data['authCanLoadGuardPipe'] as AuthCanLoadPipeGenerator) ||\n // \t(() => redirectToLoginIfNotSignedIn);\n // const subj = new Subject<boolean>();\n // onAuthStateChanged(this.auth, {\n // \tnext: (user) => {\n // \t\tconsole.log('onAuthStateChanged', user);\n // \t}\n // })\n // return this.auth.user.pipe(\n // \tmap((user) => {\n // \t\tconsole.log('user', user);\n // \t\treturn user;\n // \t}),\n // \ttake(1),\n // \tauthPipeFactory(route, segments),\n // \tmap((can) => {\n // \t\tconsole.log('can', can);\n // \t\tif (typeof can === 'boolean') {\n // \t\t\treturn can;\n // \t\t} else if (Array.isArray(can)) {\n // \t\t\treturn this.router.createUrlTree(can);\n // \t\t} else {\n // \t\t\treturn this.router.parseUrl(can);\n // \t\t}\n // \t}),\n // );\n return true;\n }\n }\n\n public canActivate(\n _route: ActivatedRouteSnapshot,\n _state: RouterStateSnapshot, //: Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree\n ) {\n // console.log('SneatAuthGuard.canActivate', route, state);\n return true;\n }\n\n canActivateChild(\n _childRoute: ActivatedRouteSnapshot,\n _state: RouterStateSnapshot, // : Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree\n ) {\n // console.log('SneatAuthGuard.canActivateChild', childRoute, state);\n return true;\n }\n}\n\nexport const canLoad = (pipe?: AuthCanLoadPipeGenerator) => ({\n canLoad: [SneatAuthGuard],\n data: { authCanLoadGuardPipe: pipe },\n});\n\nexport const SNEAT_AUTH_GUARDS = {\n canActivate: [SneatAuthGuard],\n canLoad: [SneatAuthGuard],\n};\n"]}
1
+ {"version":3,"file":"sneat-auth-guard.js","sourceRoot":"","sources":["../../../../../../libs/auth/core/src/lib/sneat-auth-guard.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActivatedRouteSnapshot,\n // CanActivate,\n // CanActivateChild,\n // CanLoad,\n Route,\n Router,\n RouterStateSnapshot,\n UrlSegment,\n UrlTree,\n} from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { Injectable, inject } from '@angular/core';\nimport { Auth } from '@angular/fire/auth';\nimport { map } from 'rxjs/operators';\nimport { AuthPipe } from '@angular/fire/auth-guard';\n\ntype AuthCanLoadPipeGenerator = (\n route: Route,\n segments: UrlSegment[],\n) => AuthPipe;\n\n/**\n * Strip the document's `<base href>` prefix from a browser pathname, returning a\n * router-relative path.\n *\n * Apps mounted under a base href (e.g. `/app/` in the Sneat site-hosting\n * pattern) have a `location.pathname` of `/app/new-game`, but the Angular Router\n * matches routes relative to the base href (`new-game`). Feeding the un-stripped\n * pathname back into the router after login fails to match any route (NG04002).\n */\nfunction routerRelativePath(pathname: string): string {\n const baseHref = document.querySelector('base')?.getAttribute('href') ?? '/';\n if (baseHref === '/' || baseHref === '') {\n return pathname;\n }\n const base = baseHref.replace(/\\/$/, ''); // '/app/' -> '/app'\n if (pathname === base) {\n return '/';\n }\n if (pathname.startsWith(base + '/')) {\n return pathname.slice(base.length); // '/app/new-game' -> '/new-game'\n }\n return pathname;\n}\n\nexport const redirectToLoginIfNotSignedIn: AuthPipe = map((user) => {\n if (user) {\n return true;\n }\n const path = routerRelativePath(location.pathname);\n let url = '/login';\n if (path != '/') {\n url += '#' + path;\n }\n return url;\n});\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SneatAuthGuard /*implements CanLoad, CanActivate, CanActivateChild*/ {\n private readonly router = inject(Router);\n private readonly auth = inject(Auth);\n\n public canLoad(\n _route: Route,\n _segments: UrlSegment[],\n ):\n | Observable<boolean | UrlTree>\n | Promise<boolean | UrlTree>\n | boolean\n | UrlTree {\n {\n // console.log('SneatAuthGuard.canLoad', route, segments);\n // const authPipeFactory =\n // \t(route.data && route.data['authCanLoadGuardPipe'] as AuthCanLoadPipeGenerator) ||\n // \t(() => redirectToLoginIfNotSignedIn);\n // const subj = new Subject<boolean>();\n // onAuthStateChanged(this.auth, {\n // \tnext: (user) => {\n // \t\tconsole.log('onAuthStateChanged', user);\n // \t}\n // })\n // return this.auth.user.pipe(\n // \tmap((user) => {\n // \t\tconsole.log('user', user);\n // \t\treturn user;\n // \t}),\n // \ttake(1),\n // \tauthPipeFactory(route, segments),\n // \tmap((can) => {\n // \t\tconsole.log('can', can);\n // \t\tif (typeof can === 'boolean') {\n // \t\t\treturn can;\n // \t\t} else if (Array.isArray(can)) {\n // \t\t\treturn this.router.createUrlTree(can);\n // \t\t} else {\n // \t\t\treturn this.router.parseUrl(can);\n // \t\t}\n // \t}),\n // );\n return true;\n }\n }\n\n public canActivate(\n _route: ActivatedRouteSnapshot,\n _state: RouterStateSnapshot, //: Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree\n ) {\n // console.log('SneatAuthGuard.canActivate', route, state);\n return true;\n }\n\n canActivateChild(\n _childRoute: ActivatedRouteSnapshot,\n _state: RouterStateSnapshot, // : Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree\n ) {\n // console.log('SneatAuthGuard.canActivateChild', childRoute, state);\n return true;\n }\n}\n\nexport const canLoad = (pipe?: AuthCanLoadPipeGenerator) => ({\n canLoad: [SneatAuthGuard],\n data: { authCanLoadGuardPipe: pipe },\n});\n\nexport const SNEAT_AUTH_GUARDS = {\n canActivate: [SneatAuthGuard],\n canLoad: [SneatAuthGuard],\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sneat/auth-core",
3
- "version": "0.12.1",
3
+ "version": "0.13.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },