@telia-ace/alliance-internal-node-utilities 1.0.1-next.0 → 1.0.2-next.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @telia-ace/alliance-internal-node-utilities
2
2
 
3
+ ## 1.0.2-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 59f0d3f: Remove unnecessary scripts.
8
+
9
+ ## 1.0.1
10
+
11
+ ### Patch Changes
12
+
13
+ - fd378fe: Move internal utilities from `@telia-ace/alliance-utilities` to `@telia-ace/alliance-internal-client-utilities` and `@telia-ace/alliance-internal-node-utilities`.
14
+
3
15
  ## 1.0.1-next.0
4
16
 
5
17
  ### Patch Changes
@@ -0,0 +1,13 @@
1
+ import { ConfigService } from '@nestjs/config';
2
+ import type { RequestHandler } from 'express';
3
+ import { ConfigParams } from 'express-openid-connect';
4
+ type Settings = {
5
+ baseURL?: ConfigParams['baseURL'];
6
+ clientID?: ConfigParams['clientID'];
7
+ clientSecret?: ConfigParams['clientSecret'];
8
+ authRequired?: ConfigParams['authRequired'];
9
+ authorizationParams?: ConfigParams['authorizationParams'];
10
+ afterCallback?: ConfigParams['afterCallback'];
11
+ };
12
+ export declare function authMiddleware(configService: ConfigService, { baseURL, clientSecret, clientID, authRequired, authorizationParams, afterCallback, }?: Settings): RequestHandler;
13
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './auth.middleware';
2
+ export * from './tokens';
@@ -0,0 +1,2 @@
1
+ export * from './config';
2
+ export * from './headers';
@@ -0,0 +1,7 @@
1
+ import { HttpException } from '@nestjs/common';
2
+ import { ErrorCodes } from './codes';
3
+ export declare class AllianceException extends HttpException {
4
+ info: string;
5
+ code: ErrorCodes;
6
+ constructor(code: ErrorCodes, variables?: Record<string, string>);
7
+ }
@@ -1,4 +1,4 @@
1
- import { ArgumentsHost, ExceptionFilter, HttpException } from '@nestjs/common';
1
+ import { HttpStatus } from '@nestjs/common';
2
2
  export declare enum GatewayErrorCodes {
3
3
  NoMatchingEndpoint = 10000,
4
4
  NoObjectId = 10001,
@@ -16,18 +16,19 @@ export declare enum GatewayErrorCodes {
16
16
  }
17
17
  export declare enum DatabasesErrorCodes {
18
18
  NoPublicKey = 11000,
19
- NoAuthHeader = 11001
19
+ NoAuthHeader = 11001,
20
+ FailedFileStore = 11002,
21
+ FailedFileRead = 11003
20
22
  }
21
23
  export declare enum PortalErrorCodes {
22
24
  NoObjectId = 12000
23
25
  }
24
- type ErrorCodes = GatewayErrorCodes | DatabasesErrorCodes | PortalErrorCodes;
25
- export declare class AllianceException extends HttpException {
26
- info: string;
27
- code: ErrorCodes;
28
- constructor(code: ErrorCodes, variables?: Record<string, string>);
29
- }
30
- export declare class AllianceExceptionFilter implements ExceptionFilter {
31
- catch(exception: AllianceException, host: ArgumentsHost): void;
32
- }
26
+ export type ErrorCodes = GatewayErrorCodes | DatabasesErrorCodes | PortalErrorCodes;
27
+ type AllianceErrors = {
28
+ [key in ErrorCodes]: {
29
+ httpCode: HttpStatus;
30
+ message: string;
31
+ };
32
+ };
33
+ export declare const allianceErrors: AllianceErrors;
33
34
  export {};
@@ -0,0 +1,5 @@
1
+ import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
2
+ import { AllianceException } from './alliance.exception';
3
+ export declare class AllianceExceptionFilter implements ExceptionFilter {
4
+ catch(exception: AllianceException, host: ArgumentsHost): void;
5
+ }
@@ -0,0 +1,3 @@
1
+ export * from './alliance.exception';
2
+ export * from './codes';
3
+ export * from './exception.filter';
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";const nestjsPino=require("nestjs-pino"),jsonwebtoken=require("jsonwebtoken"),common=require("@nestjs/common"),config=require("@nestjs/config"),node_fs=require("node:fs"),node_path=require("node:path"),promises=require("node:stream/promises");var SharedConfigKeys=(e=>(e.AuthAuthority="AUTH_AUTHORITY",e.AuthCookieName="AUTH_COOKIE_NAME",e.AuthCookieSecret="AUTH_COOKIE_SECRET",e.DbEndpoint="DB_ENDPOINT",e.JwtPrivateKey="JWT_PRIVATE_KEY",e.ServiceLogLevel="SERVICE_LOG_LEVEL",e.ServicePort="SERVICE_PORT",e))(SharedConfigKeys||{});function createBearerToken({privateKey:e,aud:o,sub:t,name:i,user:n,workspace:d}){return`Bearer ${jsonwebtoken.sign({iss:"Alliance",aud:o,sub:t,name:i,"https://alliance.teliacompany.net/user_type":n.type,"https://alliance.teliacompany.net/user_privileges":n.permissions,"https://alliance.teliacompany.net/workspace":d.slug,"https://alliance.teliacompany.net/workspace_name":d.name,"https://alliance.teliacompany.net/tenant":d.slug,"https://alliance.teliacompany.net/tenant_name":d.name},e,{expiresIn:"1h",algorithm:"RS256"})}`}function getPrivateKey(e){return`-----BEGIN RSA PRIVATE KEY-----
1
+ "use strict";const nestjsPino=require("nestjs-pino"),expressOpenidConnect=require("express-openid-connect"),jsonwebtoken=require("jsonwebtoken"),common=require("@nestjs/common"),config=require("@nestjs/config"),t=require("slugify"),node_fs=require("node:fs"),node_path=require("node:path"),promises=require("node:stream/promises");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const t__default=_interopDefaultCompat(t);var SharedConfigKeys=(e=>(e.AuthAuthority="AUTH_AUTHORITY",e.AuthCookieName="AUTH_COOKIE_NAME",e.AuthCookieSecret="AUTH_COOKIE_SECRET",e.DbEndpoint="DB_ENDPOINT",e.JwtPrivateKey="JWT_PRIVATE_KEY",e.ServiceLogLevel="SERVICE_LOG_LEVEL",e.ServicePort="SERVICE_PORT",e))(SharedConfigKeys||{}),AllianceHeaders=(e=>(e.TargetUrl="alliance-target-url",e.TargetApp="alliance-target-app",e.TargetWorkspace="alliance-target-workspace",e))(AllianceHeaders||{});function authMiddleware(e,{baseURL:i="https://127.0.0.1",clientSecret:o,clientID:u=" ",authRequired:n=!0,authorizationParams:g={},afterCallback:d}={}){return expressOpenidConnect.auth({baseURL:i,clientSecret:o,clientID:u,authRequired:n,authorizationParams:g,afterCallback:d,issuerBaseURL:`${e.getOrThrow(SharedConfigKeys.AuthAuthority)}/.well-known/openid-configuration`,secret:e.getOrThrow(SharedConfigKeys.AuthCookieSecret),session:{name:e.getOrThrow(SharedConfigKeys.AuthCookieName)},routes:{callback:"/signin-oidc"}})}function createBearerToken({privateKey:e,aud:i,sub:o,name:u,user:n,workspace:g}){return`Bearer ${jsonwebtoken.sign({iss:"Alliance",aud:i,sub:o,name:u,"https://alliance.teliacompany.net/user_type":n.type,"https://alliance.teliacompany.net/user_privileges":n.permissions,"https://alliance.teliacompany.net/workspace":g.slug,"https://alliance.teliacompany.net/workspace_name":g.name,"https://alliance.teliacompany.net/tenant":g.slug,"https://alliance.teliacompany.net/tenant_name":g.name},e,{expiresIn:"1h",algorithm:"RS256"})}`}function getPrivateKey(e){return`-----BEGIN RSA PRIVATE KEY-----
2
2
  `+e.getOrThrow(SharedConfigKeys.JwtPrivateKey)+`
3
- -----END RSA PRIVATE KEY-----`}function createSystemUserToken(e){return createBearerToken({aud:"system",sub:"system",name:"system",workspace:{slug:"system",name:"system"},user:{type:"system",permissions:[]},privateKey:getPrivateKey(e)})}var AllianceHeaders=(e=>(e.TargetUrl="alliance-target-url",e.TargetApp="alliance-target-app",e.TargetWorkspace="alliance-target-workspace",e))(AllianceHeaders||{}),r=Object.defineProperty,u=Object.getOwnPropertyDescriptor,c=(e,o,t,i)=>{for(var n=i>1?void 0:i?u(o,t):o,d=e.length-1,R;d>=0;d--)(R=e[d])&&(n=(i?R(o,t,n):R(n))||n);return i&&n&&r(o,t,n),n},GatewayErrorCodes=(e=>(e[e.NoMatchingEndpoint=1e4]="NoMatchingEndpoint",e[e.NoObjectId=10001]="NoObjectId",e[e.NoTargetAppHeader=10002]="NoTargetAppHeader",e[e.NoTargetWorkspaceHeader=10003]="NoTargetWorkspaceHeader",e[e.NoManifestsInCache=10004]="NoManifestsInCache",e[e.NoDevSessionInCache=10005]="NoDevSessionInCache",e[e.NoManifest=10006]="NoManifest",e[e.NoRequestContext=10007]="NoRequestContext",e[e.NoUserInRequestContext=10008]="NoUserInRequestContext",e[e.NoAppInRequestContext=10009]="NoAppInRequestContext",e[e.NoWorkspaceInRequestContext=10010]="NoWorkspaceInRequestContext",e[e.NoManifestInRequestContext=10011]="NoManifestInRequestContext",e[e.NoUserPermissionsInRequestContext=10012]="NoUserPermissionsInRequestContext",e))(GatewayErrorCodes||{}),DatabasesErrorCodes=(e=>(e[e.NoPublicKey=11e3]="NoPublicKey",e[e.NoAuthHeader=11001]="NoAuthHeader",e))(DatabasesErrorCodes||{}),PortalErrorCodes=(e=>(e[e.NoObjectId=12e3]="NoObjectId",e))(PortalErrorCodes||{});const g={[1e4]:{httpCode:common.HttpStatus.BAD_REQUEST,message:"Could not find endpoint matching request in app manifest."},[10001]:{httpCode:common.HttpStatus.UNAUTHORIZED,message:"No object id available on authenticated user."},[10002]:{httpCode:common.HttpStatus.BAD_REQUEST,message:`Request missing header '${AllianceHeaders.TargetApp}'.`},[10003]:{httpCode:common.HttpStatus.BAD_REQUEST,message:`Request missing header '${AllianceHeaders.TargetWorkspace}'.`},[10004]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"App manifests missing in cache."},[10005]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No dev session in memory cache."},[10006]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"Could not find manifest for app '{{appSlug}}'."},[10007]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No request context."},[10008]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No user in request context."},[10009]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No app in request context."},[10010]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No workspace in request context."},[10011]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No manifest in request context."},[10012]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No user permissions in request context."},[11e3]:{httpCode:common.HttpStatus.UNAUTHORIZED,message:"No public key available to decode JWT."},[11001]:{httpCode:common.HttpStatus.UNAUTHORIZED,message:"No authorization header found."},[12e3]:{httpCode:common.HttpStatus.UNAUTHORIZED,message:"No object id found in user claims."}};function E(e,o){return Object.entries(o).reduce((t,[i,n])=>t.replaceAll(`{{${i}}}`,n),e)}class AllianceException extends common.HttpException{constructor(o,t={}){const{message:i,httpCode:n}=g[o];super(E(i,t),n),this.code=o,this.info=`https://github.com/telia-company/ace-alliance-sdk/wiki/error-codes#${o}`}}exports.AllianceExceptionFilter=class{catch(o,t){const i=t.switchToHttp().getResponse(),n=o.getStatus();i.status(n).json({httpCode:n,code:o.code,info:o.info,message:o.message})}},exports.AllianceExceptionFilter=c([common.Catch(AllianceException)],exports.AllianceExceptionFilter);var l=Object.defineProperty,p=Object.getOwnPropertyDescriptor,s=(e,o,t,i)=>{for(var n=i>1?void 0:i?p(o,t):o,d=e.length-1,R;d>=0;d--)(R=e[d])&&(n=(i?R(o,t,n):R(n))||n);return i&&n&&l(o,t,n),n},a=(e,o)=>(t,i)=>o(t,i,e);exports.LoggerService=class{constructor(o){this.logger=o,this.log=(...t)=>this.logger.info(...t),this.trace=(...t)=>this.logger.trace(...t),this.debug=(...t)=>this.logger.debug(...t),this.info=(...t)=>this.logger.info(...t),this.warn=(...t)=>this.logger.warn(...t),this.error=(...t)=>this.logger.error(...t),this.fatal=(...t)=>this.logger.fatal(...t)}},exports.LoggerService=s([common.Injectable(),a(0,nestjsPino.InjectPinoLogger())],exports.LoggerService),exports.LoggerModule=class{static forRoot({logLevel:o,redact:t=!0}={}){return{module:exports.LoggerModule,controllers:[],imports:[nestjsPino.LoggerModule.forRootAsync({imports:[config.ConfigModule],inject:[config.ConfigService],useFactory:async i=>({pinoHttp:{level:o||i.get(SharedConfigKeys.ServiceLogLevel)||"silent",redact:t?["authorization","headers.authorization","req.headers.authorization","req.remoteAddress","req.remotePort"]:[],transport:{target:"pino-pretty",options:{colorize:!0,colorizeObjects:!0}}}})})],global:!0,providers:[exports.LoggerService],exports:[]}}},exports.LoggerModule=s([common.Module({providers:[exports.LoggerService],exports:[exports.LoggerService]})],exports.LoggerModule);function viteCssImportPlugin(e,o=!1){return{name:"vite-plugin-css-import",apply:"build",enforce:"post",writeBundle:async(t,i)=>{const n=Object.keys(i).filter(m=>m.endsWith(".css"));if(!n.length)return;const d=node_path.resolve(process.cwd(),`${e}-temp.js`),R=node_path.resolve(process.cwd(),`${e}.js`),S=n.reduce((m,N)=>{if(o){const x=node_path.dirname(R),A=node_path.relative(x,N);return`${m}import "${A.replaceAll("\\","/")}";
4
- `}return`${m}import "./${N}";
5
- `},""),h=node_fs.createWriteStream(d);h.write(S,"utf8");const C=node_fs.createReadStream(R);await promises.pipeline(C,h),node_fs.rmSync(R,{force:!0}),node_fs.renameSync(d,R),h.end()}}}exports.LoggerErrorInterceptor=nestjsPino.LoggerErrorInterceptor,exports.AllianceException=AllianceException,exports.AllianceHeaders=AllianceHeaders,exports.DatabasesErrorCodes=DatabasesErrorCodes,exports.GatewayErrorCodes=GatewayErrorCodes,exports.PortalErrorCodes=PortalErrorCodes,exports.SharedConfigKeys=SharedConfigKeys,exports.createBearerToken=createBearerToken,exports.createSystemUserToken=createSystemUserToken,exports.getPrivateKey=getPrivateKey,exports.viteCssImportPlugin=viteCssImportPlugin;
3
+ -----END RSA PRIVATE KEY-----`}function createSystemUserToken(e){return createBearerToken({aud:"system",sub:"system",name:"system",workspace:{slug:"system",name:"system"},user:{type:"system",permissions:[]},privateKey:getPrivateKey(e)})}var GatewayErrorCodes=(e=>(e[e.NoMatchingEndpoint=1e4]="NoMatchingEndpoint",e[e.NoObjectId=10001]="NoObjectId",e[e.NoTargetAppHeader=10002]="NoTargetAppHeader",e[e.NoTargetWorkspaceHeader=10003]="NoTargetWorkspaceHeader",e[e.NoManifestsInCache=10004]="NoManifestsInCache",e[e.NoDevSessionInCache=10005]="NoDevSessionInCache",e[e.NoManifest=10006]="NoManifest",e[e.NoRequestContext=10007]="NoRequestContext",e[e.NoUserInRequestContext=10008]="NoUserInRequestContext",e[e.NoAppInRequestContext=10009]="NoAppInRequestContext",e[e.NoWorkspaceInRequestContext=10010]="NoWorkspaceInRequestContext",e[e.NoManifestInRequestContext=10011]="NoManifestInRequestContext",e[e.NoUserPermissionsInRequestContext=10012]="NoUserPermissionsInRequestContext",e))(GatewayErrorCodes||{}),DatabasesErrorCodes=(e=>(e[e.NoPublicKey=11e3]="NoPublicKey",e[e.NoAuthHeader=11001]="NoAuthHeader",e[e.FailedFileStore=11002]="FailedFileStore",e[e.FailedFileRead=11003]="FailedFileRead",e))(DatabasesErrorCodes||{}),PortalErrorCodes=(e=>(e[e.NoObjectId=12e3]="NoObjectId",e))(PortalErrorCodes||{});const allianceErrors={[1e4]:{httpCode:common.HttpStatus.BAD_REQUEST,message:"Could not find endpoint matching request in app manifest."},[10001]:{httpCode:common.HttpStatus.UNAUTHORIZED,message:"No object id available on authenticated user."},[10002]:{httpCode:common.HttpStatus.BAD_REQUEST,message:`Request missing header '${AllianceHeaders.TargetApp}'.`},[10003]:{httpCode:common.HttpStatus.BAD_REQUEST,message:`Request missing header '${AllianceHeaders.TargetWorkspace}'.`},[10004]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"App manifests missing in cache."},[10005]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No dev session in memory cache."},[10006]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"Could not find manifest for app '{{appSlug}}'."},[10007]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No request context."},[10008]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No user in request context."},[10009]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No app in request context."},[10010]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No workspace in request context."},[10011]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No manifest in request context."},[10012]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"No user permissions in request context."},[11e3]:{httpCode:common.HttpStatus.UNAUTHORIZED,message:"No public key available to decode JWT."},[11001]:{httpCode:common.HttpStatus.UNAUTHORIZED,message:"No authorization header found."},[11002]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"Error storing file."},[11003]:{httpCode:common.HttpStatus.INTERNAL_SERVER_ERROR,message:"Error reading file."},[12e3]:{httpCode:common.HttpStatus.UNAUTHORIZED,message:"No object id found in user claims."}};function p(e,i){return Object.entries(i).reduce((o,[u,n])=>o.replaceAll(`{{${u}}}`,n),e)}class AllianceException extends common.HttpException{constructor(i,o={}){const{message:u,httpCode:n}=allianceErrors[i];super(p(u,o),n),this.code=i,this.info=`https://github.com/telia-company/ace-alliance-sdk/wiki/error-codes#${i}`}}var c=Object.defineProperty,a$2=Object.getOwnPropertyDescriptor,r=(e,i,o,u)=>{for(var n=u>1?void 0:u?a$2(i,o):i,g=e.length-1,d;g>=0;g--)(d=e[g])&&(n=(u?d(i,o,n):d(n))||n);return u&&n&&c(i,o,n),n};exports.AllianceExceptionFilter=class{catch(i,o){const u=o.switchToHttp().getResponse(),n=i.getStatus();u.status&&u.status(n).json({httpCode:n,code:i.code,info:i.info,message:i.message})}},exports.AllianceExceptionFilter=r([common.Catch(AllianceException)],exports.AllianceExceptionFilter);var f=Object.defineProperty,s=Object.getOwnPropertyDescriptor,a$1=(e,i,o,u)=>{for(var n=u>1?void 0:u?s(i,o):i,g=e.length-1,d;g>=0;g--)(d=e[g])&&(n=(u?d(i,o,n):d(n))||n);return u&&n&&f(i,o,n),n},l$1=(e,i)=>(o,u)=>i(o,u,e);exports.LoggerService=class{constructor(i){this.logger=i,this.log=(...o)=>this.logger.info(...o),this.trace=(...o)=>this.logger.trace(...o),this.debug=(...o)=>this.logger.debug(...o),this.info=(...o)=>this.logger.info(...o),this.warn=(...o)=>this.logger.warn(...o),this.error=(...o)=>this.logger.error(...o),this.fatal=(...o)=>this.logger.fatal(...o)}},exports.LoggerService=a$1([common.Injectable(),l$1(0,nestjsPino.InjectPinoLogger())],exports.LoggerService);var l=Object.defineProperty,m=Object.getOwnPropertyDescriptor,a=(e,i,o,u)=>{for(var n=u>1?void 0:u?m(i,o):i,g=e.length-1,d;g>=0;g--)(d=e[g])&&(n=(u?d(i,o,n):d(n))||n);return u&&n&&l(i,o,n),n};exports.LoggerModule=class{static forRoot({logLevel:i,redact:o=!0}={}){return{module:exports.LoggerModule,controllers:[],imports:[nestjsPino.LoggerModule.forRootAsync({imports:[config.ConfigModule],inject:[config.ConfigService],useFactory:async u=>({pinoHttp:{level:i||u.get(SharedConfigKeys.ServiceLogLevel)||"silent",redact:o?["authorization","headers.authorization","req.headers.authorization","req.remoteAddress","req.remotePort"]:[],transport:{target:"pino-pretty",options:{colorize:!0,colorizeObjects:!0}}}})})],global:!0,providers:[exports.LoggerService],exports:[]}}},exports.LoggerModule=a([common.Module({providers:[exports.LoggerService],exports:[exports.LoggerService]})],exports.LoggerModule);function slugify(e){return t__default(e,{strict:!0,replacement:"-",lower:!0})}function viteCssImportPlugin(e,i=!1){return{name:"vite-plugin-css-import",apply:"build",enforce:"post",writeBundle:async(o,u)=>{const n=Object.keys(u).filter(R=>R.endsWith(".css"));if(!n.length)return;const g=node_path.resolve(process.cwd(),`${e}-temp.js`),d=node_path.resolve(process.cwd(),`${e}.js`),N=n.reduce((R,E)=>{if(i){const C=node_path.dirname(d),A=node_path.relative(C,E);return`${R}import "${A.replaceAll("\\","/")}";
4
+ `}return`${R}import "./${E}";
5
+ `},""),h=node_fs.createWriteStream(g);h.write(N,"utf8");const S=node_fs.createReadStream(d);await promises.pipeline(S,h),node_fs.rmSync(d,{force:!0}),node_fs.renameSync(g,d),h.end()}}}exports.LoggerErrorInterceptor=nestjsPino.LoggerErrorInterceptor,exports.AllianceException=AllianceException,exports.AllianceHeaders=AllianceHeaders,exports.DatabasesErrorCodes=DatabasesErrorCodes,exports.GatewayErrorCodes=GatewayErrorCodes,exports.PortalErrorCodes=PortalErrorCodes,exports.SharedConfigKeys=SharedConfigKeys,exports.authMiddleware=authMiddleware,exports.createBearerToken=createBearerToken,exports.createSystemUserToken=createSystemUserToken,exports.getPrivateKey=getPrivateKey,exports.slugify=slugify,exports.viteCssImportPlugin=viteCssImportPlugin;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { LoggerErrorInterceptor } from 'nestjs-pino';
2
- export * from './auth';
3
- export * from './config';
4
- export * from './constants';
5
- export * from './exceptions';
6
- export * from './logging';
7
- export * from './vite-plugin-css-import';
2
+ export { authMiddleware, createBearerToken, createSystemUserToken, getPrivateKey } from './auth';
3
+ export { AllianceHeaders, SharedConfigKeys } from './constants';
4
+ export { AllianceException, AllianceExceptionFilter, DatabasesErrorCodes, GatewayErrorCodes, PortalErrorCodes, } from './exceptions';
5
+ export { LoggerModule, LoggerService } from './logging';
6
+ export { slugify } from './slugify';
7
+ export * from './vite-css-import.plugin';
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import{InjectPinoLogger as S,LoggerModule as b}from"nestjs-pino";export{LoggerErrorInterceptor}from"nestjs-pino";import{sign as x}from"jsonwebtoken";import{HttpStatus as a,Catch as q,HttpException as L,Injectable as P,Module as w}from"@nestjs/common";import{ConfigModule as U,ConfigService as k}from"@nestjs/config";import{createWriteStream as j,createReadStream as H,rmSync as D,renameSync as V}from"node:fs";import{resolve as h,dirname as M,relative as K}from"node:path";import{pipeline as $}from"node:stream/promises";var l=(e=>(e.AuthAuthority="AUTH_AUTHORITY",e.AuthCookieName="AUTH_COOKIE_NAME",e.AuthCookieSecret="AUTH_COOKIE_SECRET",e.DbEndpoint="DB_ENDPOINT",e.JwtPrivateKey="JWT_PRIVATE_KEY",e.ServiceLogLevel="SERVICE_LOG_LEVEL",e.ServicePort="SERVICE_PORT",e))(l||{});function N({privateKey:e,aud:t,sub:s,name:r,user:o,workspace:n}){return`Bearer ${x({iss:"Alliance",aud:t,sub:s,name:r,"https://alliance.teliacompany.net/user_type":o.type,"https://alliance.teliacompany.net/user_privileges":o.permissions,"https://alliance.teliacompany.net/workspace":n.slug,"https://alliance.teliacompany.net/workspace_name":n.name,"https://alliance.teliacompany.net/tenant":n.slug,"https://alliance.teliacompany.net/tenant_name":n.name},e,{expiresIn:"1h",algorithm:"RS256"})}`}function E(e){return`-----BEGIN RSA PRIVATE KEY-----
2
- `+e.getOrThrow(l.JwtPrivateKey)+`
3
- -----END RSA PRIVATE KEY-----`}function W(e){return N({aud:"system",sub:"system",name:"system",workspace:{slug:"system",name:"system"},user:{type:"system",permissions:[]},privateKey:E(e)})}var u=(e=>(e.TargetUrl="alliance-target-url",e.TargetApp="alliance-target-app",e.TargetWorkspace="alliance-target-workspace",e))(u||{}),B=Object.defineProperty,z=Object.getOwnPropertyDescriptor,J=(e,t,s,r)=>{for(var o=r>1?void 0:r?z(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&B(t,s,o),o},f=(e=>(e[e.NoMatchingEndpoint=1e4]="NoMatchingEndpoint",e[e.NoObjectId=10001]="NoObjectId",e[e.NoTargetAppHeader=10002]="NoTargetAppHeader",e[e.NoTargetWorkspaceHeader=10003]="NoTargetWorkspaceHeader",e[e.NoManifestsInCache=10004]="NoManifestsInCache",e[e.NoDevSessionInCache=10005]="NoDevSessionInCache",e[e.NoManifest=10006]="NoManifest",e[e.NoRequestContext=10007]="NoRequestContext",e[e.NoUserInRequestContext=10008]="NoUserInRequestContext",e[e.NoAppInRequestContext=10009]="NoAppInRequestContext",e[e.NoWorkspaceInRequestContext=10010]="NoWorkspaceInRequestContext",e[e.NoManifestInRequestContext=10011]="NoManifestInRequestContext",e[e.NoUserPermissionsInRequestContext=10012]="NoUserPermissionsInRequestContext",e))(f||{}),C=(e=>(e[e.NoPublicKey=11e3]="NoPublicKey",e[e.NoAuthHeader=11001]="NoAuthHeader",e))(C||{}),A=(e=>(e[e.NoObjectId=12e3]="NoObjectId",e))(A||{});const Y={[1e4]:{httpCode:a.BAD_REQUEST,message:"Could not find endpoint matching request in app manifest."},[10001]:{httpCode:a.UNAUTHORIZED,message:"No object id available on authenticated user."},[10002]:{httpCode:a.BAD_REQUEST,message:`Request missing header '${u.TargetApp}'.`},[10003]:{httpCode:a.BAD_REQUEST,message:`Request missing header '${u.TargetWorkspace}'.`},[10004]:{httpCode:a.INTERNAL_SERVER_ERROR,message:"App manifests missing in cache."},[10005]:{httpCode:a.INTERNAL_SERVER_ERROR,message:"No dev session in memory cache."},[10006]:{httpCode:a.INTERNAL_SERVER_ERROR,message:"Could not find manifest for app '{{appSlug}}'."},[10007]:{httpCode:a.INTERNAL_SERVER_ERROR,message:"No request context."},[10008]:{httpCode:a.INTERNAL_SERVER_ERROR,message:"No user in request context."},[10009]:{httpCode:a.INTERNAL_SERVER_ERROR,message:"No app in request context."},[10010]:{httpCode:a.INTERNAL_SERVER_ERROR,message:"No workspace in request context."},[10011]:{httpCode:a.INTERNAL_SERVER_ERROR,message:"No manifest in request context."},[10012]:{httpCode:a.INTERNAL_SERVER_ERROR,message:"No user permissions in request context."},[11e3]:{httpCode:a.UNAUTHORIZED,message:"No public key available to decode JWT."},[11001]:{httpCode:a.UNAUTHORIZED,message:"No authorization header found."},[12e3]:{httpCode:a.UNAUTHORIZED,message:"No object id found in user claims."}};function Z(e,t){return Object.entries(t).reduce((s,[r,o])=>s.replaceAll(`{{${r}}}`,o),e)}class I extends L{constructor(t,s={}){const{message:r,httpCode:o}=Y[t];super(Z(r,s),o),this.code=t,this.info=`https://github.com/telia-company/ace-alliance-sdk/wiki/error-codes#${t}`}}let m=class{catch(e,t){const s=t.switchToHttp().getResponse(),r=e.getStatus();s.status(r).json({httpCode:r,code:e.code,info:e.info,message:e.message})}};m=J([q(I)],m);var G=Object.defineProperty,Q=Object.getOwnPropertyDescriptor,y=(e,t,s,r)=>{for(var o=r>1?void 0:r?Q(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&G(t,s,o),o},F=(e,t)=>(s,r)=>t(s,r,e);let c=class{constructor(e){this.logger=e,this.log=(...t)=>this.logger.info(...t),this.trace=(...t)=>this.logger.trace(...t),this.debug=(...t)=>this.logger.debug(...t),this.info=(...t)=>this.logger.info(...t),this.warn=(...t)=>this.logger.warn(...t),this.error=(...t)=>this.logger.error(...t),this.fatal=(...t)=>this.logger.fatal(...t)}};c=y([P(),F(0,S())],c);let g=class{static forRoot({logLevel:e,redact:t=!0}={}){return{module:g,controllers:[],imports:[b.forRootAsync({imports:[U],inject:[k],useFactory:async s=>({pinoHttp:{level:e||s.get(l.ServiceLogLevel)||"silent",redact:t?["authorization","headers.authorization","req.headers.authorization","req.remoteAddress","req.remotePort"]:[],transport:{target:"pino-pretty",options:{colorize:!0,colorizeObjects:!0}}}})})],global:!0,providers:[c],exports:[]}}};g=y([w({providers:[c],exports:[c]})],g);function X(e,t=!1){return{name:"vite-plugin-css-import",apply:"build",enforce:"post",writeBundle:async(s,r)=>{const o=Object.keys(r).filter(p=>p.endsWith(".css"));if(!o.length)return;const n=h(process.cwd(),`${e}-temp.js`),i=h(process.cwd(),`${e}.js`),T=o.reduce((p,R)=>{if(t){const _=M(i),O=K(_,R);return`${p}import "${O.replaceAll("\\","/")}";
4
- `}return`${p}import "./${R}";
5
- `},""),d=j(n);d.write(T,"utf8");const v=H(i);await $(v,d),D(i,{force:!0}),V(n,i),d.end()}}}export{I as AllianceException,m as AllianceExceptionFilter,u as AllianceHeaders,C as DatabasesErrorCodes,f as GatewayErrorCodes,g as LoggerModule,c as LoggerService,A as PortalErrorCodes,l as SharedConfigKeys,N as createBearerToken,W as createSystemUserToken,E as getPrivateKey,X as viteCssImportPlugin};
1
+ import{InjectPinoLogger as S,LoggerModule as _}from"nestjs-pino";export{LoggerErrorInterceptor}from"nestjs-pino";import{auth as b}from"express-openid-connect";import{sign as w}from"jsonwebtoken";import{HttpStatus as i,HttpException as L,Catch as x,Injectable as k,Module as q}from"@nestjs/common";import{ConfigModule as P,ConfigService as U}from"@nestjs/config";import j from"slugify";import{createWriteStream as D,createReadStream as H,rmSync as V,renameSync as $}from"node:fs";import{resolve as h,dirname as M,relative as K}from"node:path";import{pipeline as F}from"node:stream/promises";var c=(e=>(e.AuthAuthority="AUTH_AUTHORITY",e.AuthCookieName="AUTH_COOKIE_NAME",e.AuthCookieSecret="AUTH_COOKIE_SECRET",e.DbEndpoint="DB_ENDPOINT",e.JwtPrivateKey="JWT_PRIVATE_KEY",e.ServiceLogLevel="SERVICE_LOG_LEVEL",e.ServicePort="SERVICE_PORT",e))(c||{}),u=(e=>(e.TargetUrl="alliance-target-url",e.TargetApp="alliance-target-app",e.TargetWorkspace="alliance-target-workspace",e))(u||{});function W(e,{baseURL:t="https://127.0.0.1",clientSecret:a,clientID:o=" ",authRequired:r=!0,authorizationParams:s={},afterCallback:n}={}){return b({baseURL:t,clientSecret:a,clientID:o,authRequired:r,authorizationParams:s,afterCallback:n,issuerBaseURL:`${e.getOrThrow(c.AuthAuthority)}/.well-known/openid-configuration`,secret:e.getOrThrow(c.AuthCookieSecret),session:{name:e.getOrThrow(c.AuthCookieName)},routes:{callback:"/signin-oidc"}})}function E({privateKey:e,aud:t,sub:a,name:o,user:r,workspace:s}){return`Bearer ${w({iss:"Alliance",aud:t,sub:a,name:o,"https://alliance.teliacompany.net/user_type":r.type,"https://alliance.teliacompany.net/user_privileges":r.permissions,"https://alliance.teliacompany.net/workspace":s.slug,"https://alliance.teliacompany.net/workspace_name":s.name,"https://alliance.teliacompany.net/tenant":s.slug,"https://alliance.teliacompany.net/tenant_name":s.name},e,{expiresIn:"1h",algorithm:"RS256"})}`}function N(e){return`-----BEGIN RSA PRIVATE KEY-----
2
+ `+e.getOrThrow(c.JwtPrivateKey)+`
3
+ -----END RSA PRIVATE KEY-----`}function B(e){return E({aud:"system",sub:"system",name:"system",workspace:{slug:"system",name:"system"},user:{type:"system",permissions:[]},privateKey:N(e)})}var f=(e=>(e[e.NoMatchingEndpoint=1e4]="NoMatchingEndpoint",e[e.NoObjectId=10001]="NoObjectId",e[e.NoTargetAppHeader=10002]="NoTargetAppHeader",e[e.NoTargetWorkspaceHeader=10003]="NoTargetWorkspaceHeader",e[e.NoManifestsInCache=10004]="NoManifestsInCache",e[e.NoDevSessionInCache=10005]="NoDevSessionInCache",e[e.NoManifest=10006]="NoManifest",e[e.NoRequestContext=10007]="NoRequestContext",e[e.NoUserInRequestContext=10008]="NoUserInRequestContext",e[e.NoAppInRequestContext=10009]="NoAppInRequestContext",e[e.NoWorkspaceInRequestContext=10010]="NoWorkspaceInRequestContext",e[e.NoManifestInRequestContext=10011]="NoManifestInRequestContext",e[e.NoUserPermissionsInRequestContext=10012]="NoUserPermissionsInRequestContext",e))(f||{}),C=(e=>(e[e.NoPublicKey=11e3]="NoPublicKey",e[e.NoAuthHeader=11001]="NoAuthHeader",e[e.FailedFileStore=11002]="FailedFileStore",e[e.FailedFileRead=11003]="FailedFileRead",e))(C||{}),A=(e=>(e[e.NoObjectId=12e3]="NoObjectId",e))(A||{});const z={[1e4]:{httpCode:i.BAD_REQUEST,message:"Could not find endpoint matching request in app manifest."},[10001]:{httpCode:i.UNAUTHORIZED,message:"No object id available on authenticated user."},[10002]:{httpCode:i.BAD_REQUEST,message:`Request missing header '${u.TargetApp}'.`},[10003]:{httpCode:i.BAD_REQUEST,message:`Request missing header '${u.TargetWorkspace}'.`},[10004]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"App manifests missing in cache."},[10005]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"No dev session in memory cache."},[10006]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"Could not find manifest for app '{{appSlug}}'."},[10007]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"No request context."},[10008]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"No user in request context."},[10009]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"No app in request context."},[10010]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"No workspace in request context."},[10011]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"No manifest in request context."},[10012]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"No user permissions in request context."},[11e3]:{httpCode:i.UNAUTHORIZED,message:"No public key available to decode JWT."},[11001]:{httpCode:i.UNAUTHORIZED,message:"No authorization header found."},[11002]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"Error storing file."},[11003]:{httpCode:i.INTERNAL_SERVER_ERROR,message:"Error reading file."},[12e3]:{httpCode:i.UNAUTHORIZED,message:"No object id found in user claims."}};function J(e,t){return Object.entries(t).reduce((a,[o,r])=>a.replaceAll(`{{${o}}}`,r),e)}class I extends L{constructor(t,a={}){const{message:o,httpCode:r}=z[t];super(J(o,a),r),this.code=t,this.info=`https://github.com/telia-company/ace-alliance-sdk/wiki/error-codes#${t}`}}var Y=Object.defineProperty,Z=Object.getOwnPropertyDescriptor,G=(e,t,a,o)=>{for(var r=o>1?void 0:o?Z(t,a):t,s=e.length-1,n;s>=0;s--)(n=e[s])&&(r=(o?n(t,a,r):n(r))||r);return o&&r&&Y(t,a,r),r};let g=class{catch(e,t){const a=t.switchToHttp().getResponse(),o=e.getStatus();a.status&&a.status(o).json({httpCode:o,code:e.code,info:e.info,message:e.message})}};g=G([x(I)],g);var Q=Object.defineProperty,X=Object.getOwnPropertyDescriptor,ee=(e,t,a,o)=>{for(var r=o>1?void 0:o?X(t,a):t,s=e.length-1,n;s>=0;s--)(n=e[s])&&(r=(o?n(t,a,r):n(r))||r);return o&&r&&Q(t,a,r),r},te=(e,t)=>(a,o)=>t(a,o,e);let p=class{constructor(e){this.logger=e,this.log=(...t)=>this.logger.info(...t),this.trace=(...t)=>this.logger.trace(...t),this.debug=(...t)=>this.logger.debug(...t),this.info=(...t)=>this.logger.info(...t),this.warn=(...t)=>this.logger.warn(...t),this.error=(...t)=>this.logger.error(...t),this.fatal=(...t)=>this.logger.fatal(...t)}};p=ee([k(),te(0,S())],p);var re=Object.defineProperty,oe=Object.getOwnPropertyDescriptor,ae=(e,t,a,o)=>{for(var r=o>1?void 0:o?oe(t,a):t,s=e.length-1,n;s>=0;s--)(n=e[s])&&(r=(o?n(t,a,r):n(r))||r);return o&&r&&re(t,a,r),r};let R=class{static forRoot({logLevel:e,redact:t=!0}={}){return{module:R,controllers:[],imports:[_.forRootAsync({imports:[P],inject:[U],useFactory:async a=>({pinoHttp:{level:e||a.get(c.ServiceLogLevel)||"silent",redact:t?["authorization","headers.authorization","req.headers.authorization","req.remoteAddress","req.remotePort"]:[],transport:{target:"pino-pretty",options:{colorize:!0,colorizeObjects:!0}}}})})],global:!0,providers:[p],exports:[]}}};R=ae([q({providers:[p],exports:[p]})],R);function se(e){return j(e,{strict:!0,replacement:"-",lower:!0})}function ne(e,t=!1){return{name:"vite-plugin-css-import",apply:"build",enforce:"post",writeBundle:async(a,o)=>{const r=Object.keys(o).filter(l=>l.endsWith(".css"));if(!r.length)return;const s=h(process.cwd(),`${e}-temp.js`),n=h(process.cwd(),`${e}.js`),T=r.reduce((l,m)=>{if(t){const v=M(n),O=K(v,m);return`${l}import "${O.replaceAll("\\","/")}";
4
+ `}return`${l}import "./${m}";
5
+ `},""),d=D(s);d.write(T,"utf8");const y=H(n);await F(y,d),V(n,{force:!0}),$(s,n),d.end()}}}export{I as AllianceException,g as AllianceExceptionFilter,u as AllianceHeaders,C as DatabasesErrorCodes,f as GatewayErrorCodes,R as LoggerModule,p as LoggerService,A as PortalErrorCodes,c as SharedConfigKeys,W as authMiddleware,E as createBearerToken,B as createSystemUserToken,N as getPrivateKey,se as slugify,ne as viteCssImportPlugin};
@@ -0,0 +1,2 @@
1
+ export * from './logging.module';
2
+ export * from './logging.service';
@@ -0,0 +1,9 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ type ModuleSettings = {
3
+ logLevel?: string;
4
+ redact?: boolean;
5
+ };
6
+ export declare class LoggerModule {
7
+ static forRoot({ logLevel, redact }?: ModuleSettings): DynamicModule;
8
+ }
9
+ export {};
@@ -1,4 +1,3 @@
1
- import { DynamicModule } from '@nestjs/common';
2
1
  import { PinoLogger } from 'nestjs-pino';
3
2
  export declare class LoggerService {
4
3
  private readonly logger;
@@ -11,11 +10,3 @@ export declare class LoggerService {
11
10
  error: PinoLogger['error'];
12
11
  fatal: PinoLogger['fatal'];
13
12
  }
14
- type ModuleSettings = {
15
- logLevel?: string;
16
- redact?: boolean;
17
- };
18
- export declare class LoggerModule {
19
- static forRoot({ logLevel, redact }?: ModuleSettings): DynamicModule;
20
- }
21
- export {};
@@ -0,0 +1 @@
1
+ export declare function slugify(name: string): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telia-ace/alliance-internal-node-utilities",
3
- "version": "1.0.1-next.0",
3
+ "version": "1.0.2-next.0",
4
4
  "description": "Utilities used internally by packages developed by team Alliance.",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "Telia Company AB",
@@ -14,28 +14,28 @@
14
14
  "dist"
15
15
  ],
16
16
  "dependencies": {
17
- "@nestjs/common": "^9.4.0",
18
- "@nestjs/config": "^2.3.1",
19
- "jsonwebtoken": "^9.0.0",
20
- "nestjs-pino": "^3.2.0",
17
+ "@nestjs/common": "^10.1.0",
18
+ "@nestjs/config": "^3.0.0",
19
+ "express-openid-connect": "^2.16.0",
20
+ "jsonwebtoken": "^9.0.1",
21
+ "nestjs-pino": "^3.3.0",
21
22
  "pino-http": "^8.3.3",
22
- "pino-pretty": "^10.0.0"
23
+ "pino-pretty": "^10.1.0",
24
+ "slugify": "^1.6.6"
23
25
  },
24
26
  "devDependencies": {
25
27
  "@types/express": "^4.17.17",
26
28
  "@types/jsonwebtoken": "^9.0.2",
27
- "@types/node": "^20.1.2",
28
- "vite": "^4.3.5",
29
- "unbuild": "^1.2.1"
29
+ "@types/node": "^20.4.2",
30
+ "unbuild": "^1.2.1",
31
+ "vite": "^4.4.6"
30
32
  },
31
33
  "publishConfig": {
32
34
  "access": "public"
33
35
  },
34
36
  "scripts": {
35
37
  "build:dev": "tsc && unbuild --mode development",
36
- "build:prod": "rimraf dist && tsc && unbuild --mode prod",
37
- "build:test": "rimraf dist && tsc && unbuild --mode test",
38
- "build:docker": "unbuild",
38
+ "build:prod": "rimraf dist && tsc && unbuild",
39
39
  "dev": "tsc && unbuild --mode development --watch"
40
40
  }
41
41
  }
File without changes
File without changes
File without changes