@webority/mobile-core 0.16.3 → 0.16.4
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/lib/commonjs/formatters/formatConfig.js +1 -1
- package/lib/commonjs/logger/index.js +1 -1
- package/lib/commonjs/logger/redact.js +1 -1
- package/lib/module/formatters/formatConfig.js +1 -1
- package/lib/module/logger/index.js +1 -1
- package/lib/module/logger/redact.js +1 -1
- package/lib/typescript/commonjs/formatters/formatConfig.d.ts +3 -3
- package/lib/typescript/commonjs/logger/redact.d.ts +3 -1
- package/lib/typescript/module/formatters/formatConfig.d.ts +3 -3
- package/lib/typescript/module/logger/redact.d.ts +3 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.styledNumber=exports.numberSeparators=exports.isFormatterConfigured=exports.groupingForLocale=exports.getFormatterConfig=exports.configuredLocale=exports.configureFormatters=void 0;const DEFAULTS={zone:"IST",locale:"en-IN",empty:"-"},SEPARATORS={PointWithCommaGroups:{decimal:".",group:","},CommaWithPointGroups:{decimal:",",group:"."},CommaWithSpaceGroups:{decimal:",",group:" "},PointWithSpaceGroups:{decimal:".",group:" "}},DATE_ORDERS=["DayMonthNameYear","DayMonthYear","MonthDayYear","YearMonthDay"];let current={...DEFAULTS},configured=new Set;const configureFormatters=e=>{if(void 0===e)return current={...DEFAULTS},void(configured=new Set);if(void 0!==e.numberStyle&&!Object.hasOwn(SEPARATORS,e.numberStyle))throw new RangeError(`Unknown number style "${e.numberStyle}"; expected one of ${Object.keys(SEPARATORS).join(", ")}.`);if(void 0!==e.dateOrder&&!DATE_ORDERS.includes(e.dateOrder))throw new RangeError(`Unknown date order "${e.dateOrder}"; expected one of ${DATE_ORDERS.join(", ")}.`);for(const r of Object.keys(e)){const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.styledNumber=exports.numberSeparators=exports.isFormatterConfigured=exports.groupingForLocale=exports.getFormatterConfig=exports.configuredLocale=exports.configureFormatters=void 0;const DEFAULTS={zone:"IST",locale:"en-IN",empty:"-"},SEPARATORS={PointWithCommaGroups:{decimal:".",group:","},CommaWithPointGroups:{decimal:",",group:"."},CommaWithSpaceGroups:{decimal:",",group:" "},PointWithSpaceGroups:{decimal:".",group:" "}},DATE_ORDERS=["DayMonthNameYear","DayMonthYear","MonthDayYear","YearMonthDay"];let current={...DEFAULTS},configured=new Set;const configureFormatters=e=>{if(void 0===e)return current={...DEFAULTS},void(configured=new Set);if(void 0!==e.numberStyle&&!Object.hasOwn(SEPARATORS,e.numberStyle))throw new RangeError(`Unknown number style "${e.numberStyle}"; expected one of ${Object.keys(SEPARATORS).join(", ")}.`);if(void 0!==e.dateOrder&&!DATE_ORDERS.includes(e.dateOrder))throw new RangeError(`Unknown date order "${e.dateOrder}"; expected one of ${DATE_ORDERS.join(", ")}.`);for(const r of Object.keys(e)){const t=e[r];void 0!==t&&(current={...current,[r]:t},configured.add(r))}};exports.configureFormatters=configureFormatters;const getFormatterConfig=()=>({...current});exports.getFormatterConfig=getFormatterConfig;const isFormatterConfigured=e=>configured.has(e);exports.isFormatterConfigured=isFormatterConfigured;const configuredLocale=()=>configured.has("locale")?current.locale:null;exports.configuredLocale=configuredLocale;const groupingForLocale=e=>/-IN(?:-|$)/i.test(e)?"indian":"international";exports.groupingForLocale=groupingForLocale;const numberSeparators=()=>void 0===current.numberStyle?null:SEPARATORS[current.numberStyle];exports.numberSeparators=numberSeparators;const localeMarks=new Map,digitsOf=e=>{const r=new Intl.NumberFormat(e,{useGrouping:!1}),t=new Set;for(let e=0;e<=9;e++)t.add(r.format(e));return t},separatorRuns=(e,r)=>{const t=[];let o=[],n=!1;for(const a of e)r.has(a)?(o.length>0&&(t.push(o),o=[]),n=!0):n&&o.push(a);return t},marksOf=e=>{const r=localeMarks.get(e);if(void 0!==r)return r;const t=digitsOf(e),o=new Intl.NumberFormat(e,{useGrouping:!0,minimumFractionDigits:1,maximumFractionDigits:1}).format(11111.5),n=separatorRuns(Array.from(o),t),a={digits:t,decimal:n.length>=1?n[n.length-1]:null,group:n.length>=2?n[0]:null};return localeMarks.set(e,a),a},isDigitAt=(e,r,t)=>r>=0&&r<e.length&&t.has(e[r]),swapMarks=(e,r,t)=>{const o=Array.from(e);let n="",a=0;for(;a<o.length;){const e=t.find(({mark:e})=>isDigitAt(o,a-1,r)&&e.every((e,r)=>o[a+r]===e)&&isDigitAt(o,a+e.length,r));void 0===e?(n+=o[a],a+=1):(n+=e.to,a+=e.mark.length)}return n},styledNumber=(e,r)=>{const t=numberSeparators();if(null===t)return e.format(r);const{digits:o,decimal:n,group:a}=marksOf(e.resolvedOptions().locale),s=[];return null!==n&&s.push({mark:n,to:t.decimal}),null!==a&&s.push({mark:a,to:t.group}),swapMarks(e.format(r),o,s)};exports.styledNumber=styledNumber;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.setRemoteLogger=exports.setDeviceContext=exports.getDeviceContext=exports.configureLogger=exports.Logger=void 0;var _index=require("../config/index.js"),_extractApiError=require("../errors/extractApiError.js"),_redact=require("./redact.js");const Colors={RESET:"[0m",GRAY:"[90m",BLUE:"[34m",YELLOW:"[33m",RED_BOLD:"[31;1m"},LogLevels={DEBUG:{level:"debug",color:Colors.GRAY},INFO:{level:"info",color:Colors.BLUE},WARN:{level:"warn",color:Colors.YELLOW},ERROR:{level:"error",color:Colors.RED_BOLD}},isLogLevelAllowed=e=>{const r=["debug","info","warn","error"],o=(0,_index.getConfigValue)("logLevel","info");return r.indexOf(e)>=r.indexOf(o)},isEnabled=()=>(0,_index.getConfigValue)("loggingEnabled",!0);let remote=null;const setRemoteLogger=e=>{remote=e};exports.setRemoteLogger=setRemoteLogger;const safe=e=>{if(e)try{e()}catch{}}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.setRemoteLogger=exports.setDeviceContext=exports.getDeviceContext=exports.configureLogger=exports.Logger=void 0;var _index=require("../config/index.js"),_extractApiError=require("../errors/extractApiError.js"),_redact=require("./redact.js");const Colors={RESET:"[0m",GRAY:"[90m",BLUE:"[34m",YELLOW:"[33m",RED_BOLD:"[31;1m"},LogLevels={DEBUG:{level:"debug",color:Colors.GRAY},INFO:{level:"info",color:Colors.BLUE},WARN:{level:"warn",color:Colors.YELLOW},ERROR:{level:"error",color:Colors.RED_BOLD}},isLogLevelAllowed=e=>{const r=["debug","info","warn","error"],o=(0,_index.getConfigValue)("logLevel","info");return r.indexOf(e)>=r.indexOf(o)},isEnabled=()=>(0,_index.getConfigValue)("loggingEnabled",!0);let remote=null;const setRemoteLogger=e=>{remote=e};exports.setRemoteLogger=setRemoteLogger;const safe=e=>{if(e)try{e()}catch{}};let deviceContext=null;const normalizeAttributeValue=e=>null==e?null:"string"==typeof e||"number"==typeof e||"boolean"==typeof e?e:String(e),setDeviceContext=e=>{if(deviceContext=e,e)for(const[r,o]of Object.entries(e))safe(()=>remote?.setAttribute?.(r,normalizeAttributeValue(o)))};exports.setDeviceContext=setDeviceContext;const getDeviceContext=()=>deviceContext;exports.getDeviceContext=getDeviceContext;const DEFAULT_LOGGER_OPTIONS={dedupeWindowMs:5e3,dedupeMaxPerWindow:1,screenHistoryLimit:20,breadcrumbLimit:50};let loggerOptions={...DEFAULT_LOGGER_OPTIONS};const configureLogger=e=>{const{redactKeys:r,...o}=e;void 0!==r&&(0,_redact.configureRedaction)(r),loggerOptions={...loggerOptions,...o},screenHistory.length>loggerOptions.screenHistoryLimit&&(screenHistory=screenHistory.slice(screenHistory.length-loggerOptions.screenHistoryLimit)),trimBreadcrumbs()};exports.configureLogger=configureLogger;let currentScreen=null,screenHistory=[];const breadcrumbs=[],trimBreadcrumbs=()=>{const e=breadcrumbs.length-loggerOptions.breadcrumbLimit;e>0&&breadcrumbs.splice(0,e)},dedupeMap=new Map,MAX_DEDUPE_ENTRIES=200,dedupeKeyFor=e=>{const r=e.stack?.split("\n")[1]?.trim();return r?`${e.message}::${r}`:e.message},capDedupeMap=()=>{for(;dedupeMap.size>200;){const e=dedupeMap.keys().next().value;if(void 0===e)return;dedupeMap.delete(e)}},shouldForward=e=>{if(loggerOptions.dedupeWindowMs<=0)return{forward:!0};const r=Date.now(),o=dedupeMap.get(e);if(!o||r-o.windowStart>=loggerOptions.dedupeWindowMs){const t=o?.suppressedCount??0;return dedupeMap.set(e,{windowStart:r,count:1,suppressedCount:0}),capDedupeMap(),t>0?{forward:!0,suppressedCount:t}:{forward:!0}}return o.count+=1,o.count>loggerOptions.dedupeMaxPerWindow?(o.suppressedCount+=1,{forward:!1}):{forward:!0}},buildErrorContext=(e,r)=>{const o={...deviceContext};return null!==currentScreen&&(o.screen=currentScreen),r&&(o.suppressedCount=r),{...o,...e}},forwardErrorToRemote=(e,r)=>{const o=dedupeKeyFor(e),{forward:t,suppressedCount:s}=shouldForward(o);t&&safe(()=>remote?.recordError?.(e,buildErrorContext(r,s)))},logDebug=(e,...r)=>{isEnabled()&&isLogLevelAllowed(LogLevels.DEBUG.level)&&console.debug(`${LogLevels.DEBUG.color}[DEBUG]: ${(0,_redact.redactString)(e)}${Colors.RESET}`,...(0,_redact.redact)(r))},logInfo=(e,...r)=>{const o=(0,_redact.redactString)(e),t=(0,_redact.redact)(r);isEnabled()&&isLogLevelAllowed(LogLevels.INFO.level)&&(console.info(`${LogLevels.INFO.color}[INFO]: ${o}${Colors.RESET}`,...t),safe(()=>remote?.log?.("info",o,t)))},logWarning=(e,...r)=>{const o=(0,_redact.redactString)(e),t=(0,_redact.redact)(r);isEnabled()&&isLogLevelAllowed(LogLevels.WARN.level)&&(console.warn(`${LogLevels.WARN.color}[WARNING]: ${o}${Colors.RESET}`,...t),safe(()=>remote?.log?.("warn",o,t)))},logError=(e,...r)=>{const o=(0,_redact.redactString)(e),t=(0,_redact.redact)(r);isEnabled()&&isLogLevelAllowed(LogLevels.ERROR.level)&&console.error(`${LogLevels.ERROR.color}[ERROR]: ${o}${Colors.RESET}`,...t),safe(()=>remote?.log?.("error",o,t));const s=r[0];void 0===s||(0,_extractApiError.isNoResponse)(s)||forwardErrorToRemote((0,_redact.redactError)(s),{source:"Logger.error",message:o})},breadcrumb=(e,r)=>{const o=(0,_redact.redactString)(e),t=(0,_redact.redact)(r);breadcrumbs.push({message:o,data:t,timestampUtc:(new Date).toISOString()}),trimBreadcrumbs(),isEnabled()&&isLogLevelAllowed("info")&&console.info(`${Colors.BLUE}[BREADCRUMB]: ${o}${Colors.RESET}`,t??""),safe(()=>remote?.breadcrumb?.(o,t))},recordError=(e,r)=>{const o=(0,_redact.redactError)(e),t=(0,_redact.redact)(r);(0,_extractApiError.isNoResponse)(e)?logInfo(`No response: ${o.message}`):(isEnabled()&&isLogLevelAllowed("error")&&console.error(`${Colors.RED_BOLD}[RECORDED]: ${o.message}${Colors.RESET}`,t??""),forwardErrorToRemote(o,t))},asDict=e=>"object"==typeof e&&null!==e?e:null,headerValue=(e,r)=>{const o=asDict(e);if(!o)return null;const t="function"==typeof o.get?o.get.call(e,r):o[r]??o[r.toLowerCase()];return"string"==typeof t&&""!==t?t:null},requestFailed=(e,r={})=>{const{label:o,expectedStatuses:t=[],...s}=r,n=asDict(e),l=asDict(n?.config),c=asDict(n?.response),i=asDict(c?.data),d="number"==typeof c?.status?c.status:null,a="string"==typeof l?.method?l.method.toUpperCase():null,g="string"==typeof l?.url?l.url.split("?")[0]??null:null,u=o??([a,g].filter(Boolean).join(" ")||"Request");if("CanceledError"===n?.name||"ERR_CANCELED"===n?.code||!0===n?.__CANCEL__)return void logInfo(`${u} canceled`);if("RequestOfflineError"===n?.name)return void logInfo(`${u} not sent (offline)`);if((0,_extractApiError.isNoResponse)(e))return void logInfo(`${u} got no response`);if("WorkspaceChangedError"===n?.name||"workspace_changed"===i?.code)return void logInfo(`${u} refused (another workspace)`);if(null!==d&&t.includes(d))return void logInfo(`${u} refused (${d})`);const p="string"==typeof n?.message?n.message:e instanceof Error?e.message:null,f=(0,_redact.redactString)(null===d?`${u} failed`:`${u} failed (${d})`);isEnabled()&&isLogLevelAllowed(LogLevels.ERROR.level)&&console.error(`${LogLevels.ERROR.color}[ERROR]: ${f}${Colors.RESET}`,(0,_redact.redactString)(p??"")),safe(()=>remote?.log?.("error",f,[]));const E=(0,_index.getConfigValue)("correlationIdHeader",null),L=(0,_redact.redact)({source:"Logger.requestFailed",label:u,status:d,method:a,path:g,code:"string"==typeof i?.code?i.code:null,traceId:"string"==typeof i?.traceId?i.traceId:null,correlationId:E?headerValue(l?.headers,E):null,detail:p,...s});forwardErrorToRemote(new Error(f),L)},setUser=(e,r)=>{safe(()=>remote?.setUser?.(e,r))},setAttribute=(e,r)=>{safe(()=>remote?.setAttribute?.(e,r))},trackScreen=(e,r)=>{e!==currentScreen&&(currentScreen=e,screenHistory.push(e),screenHistory.length>loggerOptions.screenHistoryLimit&&(screenHistory=screenHistory.slice(screenHistory.length-loggerOptions.screenHistoryLimit)),breadcrumb(`Screen: ${e}`,r))},getCurrentScreen=()=>currentScreen,getScreenHistory=()=>[...screenHistory],getBreadcrumbs=()=>[...breadcrumbs],Logger=exports.Logger={debug:logDebug,info:logInfo,warn:logWarning,error:logError,breadcrumb:breadcrumb,recordError:recordError,requestFailed:requestFailed,setUser:setUser,setAttribute:setAttribute,trackScreen:trackScreen,getCurrentScreen:getCurrentScreen,getScreenHistory:getScreenHistory,getBreadcrumbs:getBreadcrumbs};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.redactString=exports.redact=exports.configureRedaction=void 0;const REDACTED="[REDACTED]",BEARER=/\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi,JWT=/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*/g,VALUE=/(?:"(?:[^"\\]|\\.)*"|'[^']*'|[^\s,;&}]+)/.source,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.redactString=exports.redactError=exports.redact=exports.configureRedaction=void 0;const REDACTED="[REDACTED]",OMITTED="[OMITTED]",CIRCULAR="[Circular]",TRUNCATED="[Truncated]",MAX_DEPTH=6,BEARER=/\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi,JWT=/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*/g,VALUE=/(?:"(?:[^"\\]|\\.)*"|'[^']*'|[^\s,;&}]+)/.source,DEFAULT_SECRET_KEYS=["token","accessToken","refreshToken","password","authorization","cookie","setCookie","xApiKey","apiKey","clientSecret","secret","otp","pin","pan","panNumber","aadhaar","aadhaarNumber","accountNumber","cardNumber","cvv","idToken","newPassword","currentPassword","oldPassword","ownerPassword","mpin"],DROPPED_KEYS=new Set(["config","request","data"]),normalizeKey=e=>e.replace(/[-_]/g,"").toLowerCase(),escapeChar=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),keyPattern=e=>Array.from(e,escapeChar).join("[-_]?");let secretKeys=new Set,keyedValue=/(?!)/g;const configureRedaction=e=>{const r=new Set([...DEFAULT_SECRET_KEYS,...e].map(normalizeKey).filter(e=>""!==e));secretKeys=r;const t=[...r].map(keyPattern).join("|");keyedValue=new RegExp(`(?<![a-z])(["']?(?:${t})["']?\\s*[:=]\\s*)${VALUE}`,"gi")};exports.configureRedaction=configureRedaction,configureRedaction([]);const redactString=e=>e.replace(BEARER,`Bearer ${REDACTED}`).replace(JWT,REDACTED).replace(keyedValue,(e,r)=>`${r}"${REDACTED}"`);exports.redactString=redactString;const asDict=e=>"object"==typeof e&&null!==e?e:null,isErrorLike=e=>e instanceof Error||!0===e.isAxiosError,summarizeError=e=>{const r=e,t=asDict(r.config),n=asDict(r.response);return{name:"string"==typeof r.name?r.name:"Error",message:redactString("string"==typeof r.message?r.message:""),stack:"string"==typeof r.stack?redactString(r.stack):null,code:"string"==typeof r.code?r.code:null,status:"number"==typeof n?.status?n.status:null,method:"string"==typeof t?.method?t.method.toUpperCase():null,url:"string"==typeof t?.url?t.url.split(/[?#]/)[0]??null:null}},redactInner=(e,r,t)=>{if("string"==typeof e)return redactString(e);if(null===e||"object"!=typeof e)return e;if(isErrorLike(e))return summarizeError(e);if(e instanceof Date)return e;if(t.has(e))return CIRCULAR;if(r>=6)return TRUNCATED;t.add(e);try{if(Array.isArray(e))return e.map(e=>redactInner(e,r+1,t));const n={};for(const[a,o]of Object.entries(e)){const e=normalizeKey(a);DROPPED_KEYS.has(e)?n[a]=OMITTED:secretKeys.has(e)?n[a]=REDACTED:n[a]=redactInner(o,r+1,t)}return n}finally{t.delete(e)}},redact=e=>redactInner(e,0,new Set);exports.redact=redact;const redactError=e=>{if("object"==typeof e&&null!==e&&isErrorLike(e)){const r=summarizeError(e),t=new Error(r.message);return t.name=r.name,null!==r.stack&&(t.stack=r.stack),t}const r=redact(e);if("string"==typeof r)return new Error(r);try{return new Error(JSON.stringify(r))}catch{return new Error(String(r))}};exports.redactError=redactError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const DEFAULTS={zone:"IST",locale:"en-IN",empty:"-"},SEPARATORS={PointWithCommaGroups:{decimal:".",group:","},CommaWithPointGroups:{decimal:",",group:"."},CommaWithSpaceGroups:{decimal:",",group:" "},PointWithSpaceGroups:{decimal:".",group:" "}},DATE_ORDERS=["DayMonthNameYear","DayMonthYear","MonthDayYear","YearMonthDay"];let current={...DEFAULTS},configured=new Set;export const configureFormatters=e=>{if(void 0===e)return current={...DEFAULTS},void(configured=new Set);if(void 0!==e.numberStyle&&!Object.hasOwn(SEPARATORS,e.numberStyle))throw new RangeError(`Unknown number style "${e.numberStyle}"; expected one of ${Object.keys(SEPARATORS).join(", ")}.`);if(void 0!==e.dateOrder&&!DATE_ORDERS.includes(e.dateOrder))throw new RangeError(`Unknown date order "${e.dateOrder}"; expected one of ${DATE_ORDERS.join(", ")}.`);for(const r of Object.keys(e)){const
|
|
1
|
+
"use strict";const DEFAULTS={zone:"IST",locale:"en-IN",empty:"-"},SEPARATORS={PointWithCommaGroups:{decimal:".",group:","},CommaWithPointGroups:{decimal:",",group:"."},CommaWithSpaceGroups:{decimal:",",group:" "},PointWithSpaceGroups:{decimal:".",group:" "}},DATE_ORDERS=["DayMonthNameYear","DayMonthYear","MonthDayYear","YearMonthDay"];let current={...DEFAULTS},configured=new Set;export const configureFormatters=e=>{if(void 0===e)return current={...DEFAULTS},void(configured=new Set);if(void 0!==e.numberStyle&&!Object.hasOwn(SEPARATORS,e.numberStyle))throw new RangeError(`Unknown number style "${e.numberStyle}"; expected one of ${Object.keys(SEPARATORS).join(", ")}.`);if(void 0!==e.dateOrder&&!DATE_ORDERS.includes(e.dateOrder))throw new RangeError(`Unknown date order "${e.dateOrder}"; expected one of ${DATE_ORDERS.join(", ")}.`);for(const r of Object.keys(e)){const t=e[r];void 0!==t&&(current={...current,[r]:t},configured.add(r))}};export const getFormatterConfig=()=>({...current});export const isFormatterConfigured=e=>configured.has(e);export const configuredLocale=()=>configured.has("locale")?current.locale:null;export const groupingForLocale=e=>/-IN(?:-|$)/i.test(e)?"indian":"international";export const numberSeparators=()=>void 0===current.numberStyle?null:SEPARATORS[current.numberStyle];const localeMarks=new Map,digitsOf=e=>{const r=new Intl.NumberFormat(e,{useGrouping:!1}),t=new Set;for(let e=0;e<=9;e++)t.add(r.format(e));return t},separatorRuns=(e,r)=>{const t=[];let o=[],n=!1;for(const a of e)r.has(a)?(o.length>0&&(t.push(o),o=[]),n=!0):n&&o.push(a);return t},marksOf=e=>{const r=localeMarks.get(e);if(void 0!==r)return r;const t=digitsOf(e),o=new Intl.NumberFormat(e,{useGrouping:!0,minimumFractionDigits:1,maximumFractionDigits:1}).format(11111.5),n=separatorRuns(Array.from(o),t),a={digits:t,decimal:n.length>=1?n[n.length-1]:null,group:n.length>=2?n[0]:null};return localeMarks.set(e,a),a},isDigitAt=(e,r,t)=>r>=0&&r<e.length&&t.has(e[r]),swapMarks=(e,r,t)=>{const o=Array.from(e);let n="",a=0;for(;a<o.length;){const e=t.find(({mark:e})=>isDigitAt(o,a-1,r)&&e.every((e,r)=>o[a+r]===e)&&isDigitAt(o,a+e.length,r));void 0===e?(n+=o[a],a+=1):(n+=e.to,a+=e.mark.length)}return n};export const styledNumber=(e,r)=>{const t=numberSeparators();if(null===t)return e.format(r);const{digits:o,decimal:n,group:a}=marksOf(e.resolvedOptions().locale),i=[];return null!==n&&i.push({mark:n,to:t.decimal}),null!==a&&i.push({mark:a,to:t.group}),swapMarks(e.format(r),o,i)};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{getConfigValue}from"../config/index.js";import{isNoResponse}from"../errors/extractApiError.js";import{configureRedaction,redact,redactString}from"./redact.js";const Colors={RESET:"[0m",GRAY:"[90m",BLUE:"[34m",YELLOW:"[33m",RED_BOLD:"[31;1m"},LogLevels={DEBUG:{level:"debug",color:Colors.GRAY},INFO:{level:"info",color:Colors.BLUE},WARN:{level:"warn",color:Colors.YELLOW},ERROR:{level:"error",color:Colors.RED_BOLD}},isLogLevelAllowed=e=>{const r=["debug","info","warn","error"],o=getConfigValue("logLevel","info");return r.indexOf(e)>=r.indexOf(o)},isEnabled=()=>getConfigValue("loggingEnabled",!0);let remote=null;export const setRemoteLogger=e=>{remote=e};const safe=e=>{if(e)try{e()}catch{}}
|
|
1
|
+
"use strict";import{getConfigValue}from"../config/index.js";import{isNoResponse}from"../errors/extractApiError.js";import{configureRedaction,redact,redactError,redactString}from"./redact.js";const Colors={RESET:"[0m",GRAY:"[90m",BLUE:"[34m",YELLOW:"[33m",RED_BOLD:"[31;1m"},LogLevels={DEBUG:{level:"debug",color:Colors.GRAY},INFO:{level:"info",color:Colors.BLUE},WARN:{level:"warn",color:Colors.YELLOW},ERROR:{level:"error",color:Colors.RED_BOLD}},isLogLevelAllowed=e=>{const r=["debug","info","warn","error"],o=getConfigValue("logLevel","info");return r.indexOf(e)>=r.indexOf(o)},isEnabled=()=>getConfigValue("loggingEnabled",!0);let remote=null;export const setRemoteLogger=e=>{remote=e};const safe=e=>{if(e)try{e()}catch{}};let deviceContext=null;const normalizeAttributeValue=e=>null==e?null:"string"==typeof e||"number"==typeof e||"boolean"==typeof e?e:String(e);export const setDeviceContext=e=>{if(deviceContext=e,e)for(const[r,o]of Object.entries(e))safe(()=>remote?.setAttribute?.(r,normalizeAttributeValue(o)))};export const getDeviceContext=()=>deviceContext;const DEFAULT_LOGGER_OPTIONS={dedupeWindowMs:5e3,dedupeMaxPerWindow:1,screenHistoryLimit:20,breadcrumbLimit:50};let loggerOptions={...DEFAULT_LOGGER_OPTIONS};export const configureLogger=e=>{const{redactKeys:r,...o}=e;void 0!==r&&configureRedaction(r),loggerOptions={...loggerOptions,...o},screenHistory.length>loggerOptions.screenHistoryLimit&&(screenHistory=screenHistory.slice(screenHistory.length-loggerOptions.screenHistoryLimit)),trimBreadcrumbs()};let currentScreen=null,screenHistory=[];const breadcrumbs=[],trimBreadcrumbs=()=>{const e=breadcrumbs.length-loggerOptions.breadcrumbLimit;e>0&&breadcrumbs.splice(0,e)},dedupeMap=new Map,MAX_DEDUPE_ENTRIES=200,dedupeKeyFor=e=>{const r=e.stack?.split("\n")[1]?.trim();return r?`${e.message}::${r}`:e.message},capDedupeMap=()=>{for(;dedupeMap.size>200;){const e=dedupeMap.keys().next().value;if(void 0===e)return;dedupeMap.delete(e)}},shouldForward=e=>{if(loggerOptions.dedupeWindowMs<=0)return{forward:!0};const r=Date.now(),o=dedupeMap.get(e);if(!o||r-o.windowStart>=loggerOptions.dedupeWindowMs){const t=o?.suppressedCount??0;return dedupeMap.set(e,{windowStart:r,count:1,suppressedCount:0}),capDedupeMap(),t>0?{forward:!0,suppressedCount:t}:{forward:!0}}return o.count+=1,o.count>loggerOptions.dedupeMaxPerWindow?(o.suppressedCount+=1,{forward:!1}):{forward:!0}},buildErrorContext=(e,r)=>{const o={...deviceContext};return null!==currentScreen&&(o.screen=currentScreen),r&&(o.suppressedCount=r),{...o,...e}},forwardErrorToRemote=(e,r)=>{const o=dedupeKeyFor(e),{forward:t,suppressedCount:s}=shouldForward(o);t&&safe(()=>remote?.recordError?.(e,buildErrorContext(r,s)))},logDebug=(e,...r)=>{isEnabled()&&isLogLevelAllowed(LogLevels.DEBUG.level)&&console.debug(`${LogLevels.DEBUG.color}[DEBUG]: ${redactString(e)}${Colors.RESET}`,...redact(r))},logInfo=(e,...r)=>{const o=redactString(e),t=redact(r);isEnabled()&&isLogLevelAllowed(LogLevels.INFO.level)&&(console.info(`${LogLevels.INFO.color}[INFO]: ${o}${Colors.RESET}`,...t),safe(()=>remote?.log?.("info",o,t)))},logWarning=(e,...r)=>{const o=redactString(e),t=redact(r);isEnabled()&&isLogLevelAllowed(LogLevels.WARN.level)&&(console.warn(`${LogLevels.WARN.color}[WARNING]: ${o}${Colors.RESET}`,...t),safe(()=>remote?.log?.("warn",o,t)))},logError=(e,...r)=>{const o=redactString(e),t=redact(r);isEnabled()&&isLogLevelAllowed(LogLevels.ERROR.level)&&console.error(`${LogLevels.ERROR.color}[ERROR]: ${o}${Colors.RESET}`,...t),safe(()=>remote?.log?.("error",o,t));const s=r[0];void 0===s||isNoResponse(s)||forwardErrorToRemote(redactError(s),{source:"Logger.error",message:o})},breadcrumb=(e,r)=>{const o=redactString(e),t=redact(r);breadcrumbs.push({message:o,data:t,timestampUtc:(new Date).toISOString()}),trimBreadcrumbs(),isEnabled()&&isLogLevelAllowed("info")&&console.info(`${Colors.BLUE}[BREADCRUMB]: ${o}${Colors.RESET}`,t??""),safe(()=>remote?.breadcrumb?.(o,t))},recordError=(e,r)=>{const o=redactError(e),t=redact(r);isNoResponse(e)?logInfo(`No response: ${o.message}`):(isEnabled()&&isLogLevelAllowed("error")&&console.error(`${Colors.RED_BOLD}[RECORDED]: ${o.message}${Colors.RESET}`,t??""),forwardErrorToRemote(o,t))},asDict=e=>"object"==typeof e&&null!==e?e:null,headerValue=(e,r)=>{const o=asDict(e);if(!o)return null;const t="function"==typeof o.get?o.get.call(e,r):o[r]??o[r.toLowerCase()];return"string"==typeof t&&""!==t?t:null},requestFailed=(e,r={})=>{const{label:o,expectedStatuses:t=[],...s}=r,n=asDict(e),l=asDict(n?.config),c=asDict(n?.response),i=asDict(c?.data),a="number"==typeof c?.status?c.status:null,d="string"==typeof l?.method?l.method.toUpperCase():null,u="string"==typeof l?.url?l.url.split("?")[0]??null:null,g=o??([d,u].filter(Boolean).join(" ")||"Request");if("CanceledError"===n?.name||"ERR_CANCELED"===n?.code||!0===n?.__CANCEL__)return void logInfo(`${g} canceled`);if("RequestOfflineError"===n?.name)return void logInfo(`${g} not sent (offline)`);if(isNoResponse(e))return void logInfo(`${g} got no response`);if("WorkspaceChangedError"===n?.name||"workspace_changed"===i?.code)return void logInfo(`${g} refused (another workspace)`);if(null!==a&&t.includes(a))return void logInfo(`${g} refused (${a})`);const p="string"==typeof n?.message?n.message:e instanceof Error?e.message:null,f=redactString(null===a?`${g} failed`:`${g} failed (${a})`);isEnabled()&&isLogLevelAllowed(LogLevels.ERROR.level)&&console.error(`${LogLevels.ERROR.color}[ERROR]: ${f}${Colors.RESET}`,redactString(p??"")),safe(()=>remote?.log?.("error",f,[]));const E=getConfigValue("correlationIdHeader",null),m=redact({source:"Logger.requestFailed",label:g,status:a,method:d,path:u,code:"string"==typeof i?.code?i.code:null,traceId:"string"==typeof i?.traceId?i.traceId:null,correlationId:E?headerValue(l?.headers,E):null,detail:p,...s});forwardErrorToRemote(new Error(f),m)},setUser=(e,r)=>{safe(()=>remote?.setUser?.(e,r))},setAttribute=(e,r)=>{safe(()=>remote?.setAttribute?.(e,r))},trackScreen=(e,r)=>{e!==currentScreen&&(currentScreen=e,screenHistory.push(e),screenHistory.length>loggerOptions.screenHistoryLimit&&(screenHistory=screenHistory.slice(screenHistory.length-loggerOptions.screenHistoryLimit)),breadcrumb(`Screen: ${e}`,r))},getCurrentScreen=()=>currentScreen,getScreenHistory=()=>[...screenHistory],getBreadcrumbs=()=>[...breadcrumbs];export const Logger={debug:logDebug,info:logInfo,warn:logWarning,error:logError,breadcrumb:breadcrumb,recordError:recordError,requestFailed:requestFailed,setUser:setUser,setAttribute:setAttribute,trackScreen:trackScreen,getCurrentScreen:getCurrentScreen,getScreenHistory:getScreenHistory,getBreadcrumbs:getBreadcrumbs};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const REDACTED="[REDACTED]",BEARER=/\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi,JWT=/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*/g,VALUE=/(?:"(?:[^"\\]|\\.)*"|'[^']*'|[^\s,;&}]+)/.source,
|
|
1
|
+
"use strict";const REDACTED="[REDACTED]",OMITTED="[OMITTED]",CIRCULAR="[Circular]",TRUNCATED="[Truncated]",MAX_DEPTH=6,BEARER=/\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi,JWT=/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*/g,VALUE=/(?:"(?:[^"\\]|\\.)*"|'[^']*'|[^\s,;&}]+)/.source,DEFAULT_SECRET_KEYS=["token","accessToken","refreshToken","password","authorization","cookie","setCookie","xApiKey","apiKey","clientSecret","secret","otp","pin","pan","panNumber","aadhaar","aadhaarNumber","accountNumber","cardNumber","cvv","idToken","newPassword","currentPassword","oldPassword","ownerPassword","mpin"],DROPPED_KEYS=new Set(["config","request","data"]),normalizeKey=e=>e.replace(/[-_]/g,"").toLowerCase(),escapeChar=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),keyPattern=e=>Array.from(e,escapeChar).join("[-_]?");let secretKeys=new Set,keyedValue=/(?!)/g;export const configureRedaction=e=>{const r=new Set([...DEFAULT_SECRET_KEYS,...e].map(normalizeKey).filter(e=>""!==e));secretKeys=r;const t=[...r].map(keyPattern).join("|");keyedValue=new RegExp(`(?<![a-z])(["']?(?:${t})["']?\\s*[:=]\\s*)${VALUE}`,"gi")};configureRedaction([]);export const redactString=e=>e.replace(BEARER,`Bearer ${REDACTED}`).replace(JWT,REDACTED).replace(keyedValue,(e,r)=>`${r}"${REDACTED}"`);const asDict=e=>"object"==typeof e&&null!==e?e:null,isErrorLike=e=>e instanceof Error||!0===e.isAxiosError,summarizeError=e=>{const r=e,t=asDict(r.config),n=asDict(r.response);return{name:"string"==typeof r.name?r.name:"Error",message:redactString("string"==typeof r.message?r.message:""),stack:"string"==typeof r.stack?redactString(r.stack):null,code:"string"==typeof r.code?r.code:null,status:"number"==typeof n?.status?n.status:null,method:"string"==typeof t?.method?t.method.toUpperCase():null,url:"string"==typeof t?.url?t.url.split(/[?#]/)[0]??null:null}},redactInner=(e,r,t)=>{if("string"==typeof e)return redactString(e);if(null===e||"object"!=typeof e)return e;if(isErrorLike(e))return summarizeError(e);if(e instanceof Date)return e;if(t.has(e))return CIRCULAR;if(r>=6)return TRUNCATED;t.add(e);try{if(Array.isArray(e))return e.map(e=>redactInner(e,r+1,t));const n={};for(const[a,s]of Object.entries(e)){const e=normalizeKey(a);DROPPED_KEYS.has(e)?n[a]=OMITTED:secretKeys.has(e)?n[a]=REDACTED:n[a]=redactInner(s,r+1,t)}return n}finally{t.delete(e)}};export const redact=e=>redactInner(e,0,new Set);export const redactError=e=>{if("object"==typeof e&&null!==e&&isErrorLike(e)){const r=summarizeError(e),t=new Error(r.message);return t.name=r.name,null!==r.stack&&(t.stack=r.stack),t}const r=redact(e);if("string"==typeof r)return new Error(r);try{return new Error(JSON.stringify(r))}catch{return new Error(String(r))}};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* App-wide settings for the house formatters.
|
|
3
|
-
*
|
|
2
|
+
* App-wide settings for the house formatters. @webority/web-core carries a copy
|
|
3
|
+
* of this file, kept in step by its own change, so a screen formats the same
|
|
4
4
|
* instant the same way on a phone and in a browser.
|
|
5
5
|
*
|
|
6
6
|
* Zone policy: an India-market product shows every instant in IST, unlabelled
|
|
@@ -78,7 +78,7 @@ export declare const groupingForLocale: (locale: string) => NumberGrouping;
|
|
|
78
78
|
export declare const numberSeparators: () => NumberSeparators | null;
|
|
79
79
|
/**
|
|
80
80
|
* `format.format(n)`, with the configured number style's decimal mark and group separator in place
|
|
81
|
-
* of the locale's. Only those two
|
|
81
|
+
* of the locale's. Only those two marks change, so group sizes, signs and symbols stay the locale's.
|
|
82
82
|
*/
|
|
83
83
|
export declare const styledNumber: (format: Intl.NumberFormat, n: number) => string;
|
|
84
84
|
//# sourceMappingURL=formatConfig.d.ts.map
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/** Rebuilds the masking rules from the built-in list plus `extraKeys`. Replaces any earlier extras. */
|
|
2
2
|
export declare const configureRedaction: (extraKeys: readonly string[]) => void;
|
|
3
3
|
export declare const redactString: (input: string) => string;
|
|
4
|
-
/** Returns a copy with secrets masked
|
|
4
|
+
/** Returns a copy with secrets masked. An Error comes back as its summary, never as the Error itself. */
|
|
5
5
|
export declare const redact: <T>(value: T) => T;
|
|
6
|
+
/** An Error safe to hand to a sink: the original name and stack, a redacted message, and no request data. */
|
|
7
|
+
export declare const redactError: (input: unknown) => Error;
|
|
6
8
|
//# sourceMappingURL=redact.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* App-wide settings for the house formatters.
|
|
3
|
-
*
|
|
2
|
+
* App-wide settings for the house formatters. @webority/web-core carries a copy
|
|
3
|
+
* of this file, kept in step by its own change, so a screen formats the same
|
|
4
4
|
* instant the same way on a phone and in a browser.
|
|
5
5
|
*
|
|
6
6
|
* Zone policy: an India-market product shows every instant in IST, unlabelled
|
|
@@ -78,7 +78,7 @@ export declare const groupingForLocale: (locale: string) => NumberGrouping;
|
|
|
78
78
|
export declare const numberSeparators: () => NumberSeparators | null;
|
|
79
79
|
/**
|
|
80
80
|
* `format.format(n)`, with the configured number style's decimal mark and group separator in place
|
|
81
|
-
* of the locale's. Only those two
|
|
81
|
+
* of the locale's. Only those two marks change, so group sizes, signs and symbols stay the locale's.
|
|
82
82
|
*/
|
|
83
83
|
export declare const styledNumber: (format: Intl.NumberFormat, n: number) => string;
|
|
84
84
|
//# sourceMappingURL=formatConfig.d.ts.map
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/** Rebuilds the masking rules from the built-in list plus `extraKeys`. Replaces any earlier extras. */
|
|
2
2
|
export declare const configureRedaction: (extraKeys: readonly string[]) => void;
|
|
3
3
|
export declare const redactString: (input: string) => string;
|
|
4
|
-
/** Returns a copy with secrets masked
|
|
4
|
+
/** Returns a copy with secrets masked. An Error comes back as its summary, never as the Error itself. */
|
|
5
5
|
export declare const redact: <T>(value: T) => T;
|
|
6
|
+
/** An Error safe to hand to a sink: the original name and stack, a redacted message, and no request data. */
|
|
7
|
+
export declare const redactError: (input: unknown) => Error;
|
|
6
8
|
//# sourceMappingURL=redact.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webority/mobile-core",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.4",
|
|
4
4
|
"description": "Platform layer for Webority React Native apps: HTTP clients, auth/token storage, config, logging, formatters, validators, network status, permissions, storage, version checks and over-the-air updates. No UI.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react-native",
|