@shellicar/core-config 1.0.0 → 1.0.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.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var t=require("util"),e=require("crypto");function r(t){return t&&t.__esModule?t:{default:t}}var s=r(t),n=Object.defineProperty,a=(t,e)=>n(t,"name",{value:e,configurable:!0}),o=a((t=>void 0===t?e.createHash("sha256"):e.createHmac("sha256",t)),"getHash"),c=a(((t,e)=>`sha256:${o(e).update(t).digest("hex")}`),"sha256"),i=class{static{a(this,"BaseObject")}},u=class t extends i{static{a(this,"SecureString")}#t;#e;get secretValue(){return this.#t}constructor(t,e){super(),this.#t=t,this.#e=c(t,e)}static factory(e){return r=>t.from(r,e)}static from(e,r){return null===e?null:void 0!==e?new t(e,r):void 0}toString(){return this.#e}toJSON(){return this.toString()}[s.default.inspect.custom](t,e,r){if(t<0)return"[SecureURL]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},l=["AccessKey","SharedAccessKey","Password","AccountKey","Secret","SecretKey","ApiKey","Token","Key","MasterKey","PrimaryKey","SecondaryKey"],h=class t extends i{static{a(this,"SecureConnectionString")}#t;#r;get secretValue(){return this.#t}constructor(t,e,r){super(),this.#t=t,this.#r=this.parseConnectionString(t,e.map((t=>t.toLocaleLowerCase())),r)}parseConnectionString(t,e,r){return t.split(";").filter(Boolean).map((t=>{const[s,n]=t.split("="),a=n??"",o=e.includes(s.toLocaleLowerCase())?u.from(a,r):a;return[s,o]}))}static factory(e,r){return s=>t.from(s,r,e)}static from(e,r,s){return null===e?null:void 0!==e?new t(e,r??l,s):void 0}toString(){return this.#r.map((([t,e])=>`${t}=${e}`)).join(";")}toJSON(){return Object.fromEntries(this.#r)}[s.default.inspect.custom](t,e,r){if(t<0)return"[SecureConnectionString]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},d=class t extends i{static{a(this,"SecureURL")}#t;#s;get secretValue(){return this.#t}constructor(t,e){super(),this.#t=t,this.#s=u.from(t.password||null,e)}static factory(e){return r=>t.from(r,e)}static from(e,r){return null===e?null:void 0!==e?new t(e,r):void 0}toString(){const t=new URL(this.#t.href);return null!==this.#s&&(t.password=this.#s.toString()),t.href}toJSON(){const t=new URL(this.#t.href);t.password="";const e=new URLSearchParams(t.searchParams);let r;t.search="",null!==this.#s&&(r=this.#s.toString());const s={href:t.href};return void 0!==r&&(s.password=r),e.size>0&&(s.searchParams=Object.fromEntries(e)),s}[s.default.inspect.custom](t,e,r){if(t<0)return"[SecureURL]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},p=a((t=>({string:u.factory(t),connectionString:h.factory(t),url:d.factory(t)})),"createFactory");exports.SecureConnectionString=h,exports.SecureString=u,exports.SecureURL=d,exports.createFactory=p,exports.defaultSecureKeys=l;//# sourceMappingURL=index.cjs.map
1
+ "use strict";var t=require("util"),e=require("crypto");function r(t){return t&&t.__esModule?t:{default:t}}var s=r(t),a=Object.defineProperty,n=(t,e)=>a(t,"name",{value:e,configurable:!0}),o={sha256:n((()=>({hash:n((t=>e.createHash("sha256").update(t).digest("hex")),"hash"),prefix:"sha256"})),"sha256"),hs256:n((t=>({hash:n((r=>e.createHmac("sha256",t).update(r).digest("hex")),"hash"),prefix:"hs256"})),"hs256")},i=n((t=>void 0===t?o.sha256():o.hs256(t)),"getAlgorithm"),c=n(((t,e)=>{const r=i(e),s=r.hash(t);return`${r.prefix}:${s}`}),"hash"),u=class{static{n(this,"BaseObject")}},h=class t extends u{static{n(this,"SecureString")}#t;#e;get secretValue(){return this.#t}constructor(t,e){super(),this.#t=t,this.#e=c(t,e)}static factory(e){return r=>t.from(r,e)}static from(e,r){return null===e?null:void 0!==e?new t(e,r):void 0}toString(){return this.#e}toJSON(){return this.toString()}[s.default.inspect.custom](t,e,r){if(t<0)return"[SecureString]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},l=["AccessKey","SharedAccessKey","Password","AccountKey","Secret","SecretKey","ApiKey","Token","Key","MasterKey","PrimaryKey","SecondaryKey"],d=class t extends u{static{n(this,"SecureConnectionString")}#t;#r;get secretValue(){return this.#t}constructor(t,e,r){super(),this.#t=t,this.#r=this.parseConnectionString(t,e.map((t=>t.toLocaleLowerCase())),r)}parseConnectionString(t,e,r){return t.split(";").filter(Boolean).map((t=>{const[s,a]=t.split("="),n=a??"",o=e.includes(s.toLocaleLowerCase())?h.from(n,r):n;return[s,o]}))}static factory(e,r){return s=>t.from(s,r,e)}static from(e,r,s){return null===e?null:void 0!==e?new t(e,r??l,s):void 0}toString(){return this.#r.map((([t,e])=>`${t}=${e}`)).join(";")}toJSON(){return Object.fromEntries(this.#r)}[s.default.inspect.custom](t,e,r){if(t<0)return"[SecureConnectionString]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},p=class t extends u{static{n(this,"SecureURL")}#t;#s;get secretValue(){return this.#t}constructor(t,e){super(),this.#t=t,this.#s=h.from(t.password||null,e)}static factory(e){return r=>t.from(r,e)}static from(e,r){return null===e?null:void 0!==e?new t(e,r):void 0}toString(){const t=new URL(this.#t.href);return null!==this.#s&&(t.password=this.#s.toString()),t.href}toJSON(){const t=new URL(this.#t.href);t.password="";const e=new URLSearchParams(t.searchParams);let r;t.search="",null!==this.#s&&(r=this.#s.toString());const s={href:t.href};return void 0!==r&&(s.password=r),e.size>0&&(s.searchParams=Object.fromEntries(e)),s}[s.default.inspect.custom](t,e,r){if(t<0)return"[SecureURL]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},f=n((t=>({string:h.factory(t),connectionString:d.factory(t),url:p.factory(t)})),"createFactory");exports.SecureConnectionString=d,exports.SecureString=h,exports.SecureURL=p,exports.createFactory=f,exports.defaultSecureKeys=l;//# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sha256.ts","../src/types.ts","../src/SecureString.ts","../src/defaults.ts","../src/SecureConnectionString.ts","../src/SecureURL.ts","../src/createFactory.ts"],"names":["createHash","createHmac","util","value"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type Hash, type Hmac, createHash, createHmac } from 'node:crypto';\n\nconst getHash = (secret?: string) => {\n if (secret === undefined) {\n return createHash('sha256');\n }\n return createHmac('sha256', secret);\n};\n\nexport const sha256 = (input: string, secret?: string) => {\n const hash = getHash(secret);\n const digest = hash.update(input).digest('hex');\n return `sha256:${digest}`;\n};\n","import util, { type InspectOptions } from 'node:util';\nimport type { SecureConnectionString } from './SecureConnectionString';\nimport type { SecureString } from './SecureString';\nimport type { SecureURL } from './SecureURL';\n\nexport type InspectFunction = typeof util.inspect;\n\nexport abstract class BaseObject {\n public abstract toString(): string;\n public abstract toJSON(): string | object;\n public abstract [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string;\n}\n\nexport type SecureFactory = {\n string: (value: string) => SecureString;\n connectionString: (value: string, secretKeys?: readonly string[]) => SecureConnectionString;\n url: (value: URL) => SecureURL;\n};\n\nexport type SecureKeys = readonly string[];\n","import util, { type InspectOptions } from 'node:util';\nimport { sha256 } from './sha256';\nimport { BaseObject, type InspectFunction } from './types';\n\nexport class SecureString extends BaseObject {\n readonly #value: string;\n readonly #hash: string;\n\n public get secretValue(): string {\n return this.#value;\n }\n\n private constructor(value: string, secret?: string) {\n super();\n this.#value = value;\n this.#hash = sha256(value, secret);\n }\n\n static factory(secret: string | undefined): (value: string) => SecureString {\n return (value: string) => SecureString.from(value, secret);\n }\n\n public static from<T extends string | null | undefined>(value: T, secret?: string): T extends string ? SecureString : T {\n if (value === null) {\n return null as T extends string ? SecureString : T;\n }\n if (value === undefined) {\n return undefined as T extends string ? SecureString : T;\n }\n return new SecureString(value, secret) as T extends string ? SecureString : T;\n }\n\n public override toString() {\n return this.#hash;\n }\n public override toJSON() {\n return this.toString();\n }\n override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureURL]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import type { SecureKeys } from './types';\n\nexport const defaultSecureKeys = ['AccessKey', 'SharedAccessKey', 'Password', 'AccountKey', 'Secret', 'SecretKey', 'ApiKey', 'Token', 'Key', 'MasterKey', 'PrimaryKey', 'SecondaryKey'] as const satisfies SecureKeys;\n","import util, { type InspectOptions } from 'node:util';\nimport { SecureString } from './SecureString';\nimport { defaultSecureKeys } from './defaults';\nimport { BaseObject, type InspectFunction, type SecureKeys } from './types';\n\nexport class SecureConnectionString extends BaseObject {\n readonly #value: string;\n readonly #data: [string, string | SecureString][];\n\n public get secretValue(): string {\n return this.#value;\n }\n\n private constructor(value: string, secretKeys: SecureKeys, secret: string | undefined) {\n super();\n this.#value = value;\n this.#data = this.parseConnectionString(\n value,\n secretKeys.map((x) => x.toLocaleLowerCase()),\n secret,\n );\n }\n\n private parseConnectionString(value: string, secretKeys: SecureKeys, secret: string | undefined): [string, string | SecureString][] {\n return value\n .split(';')\n .filter(Boolean)\n .map((pair) => {\n const [key, value] = pair.split('=');\n const v = value ?? '';\n const val = secretKeys.includes(key.toLocaleLowerCase()) ? SecureString.from(v, secret) : v;\n return [key, val];\n });\n }\n\n static factory(secret: string | undefined, secretKeys?: SecureKeys): (value: string) => SecureConnectionString {\n return (value: string) => SecureConnectionString.from(value, secretKeys, secret);\n }\n\n public static from<T extends string | null | undefined>(value: T, secretKeys?: SecureKeys, secret?: string): T extends string ? SecureConnectionString : T {\n if (value === null) {\n return null as T extends string ? SecureConnectionString : T;\n }\n if (value === undefined) {\n return undefined as T extends string ? SecureConnectionString : T;\n }\n return new SecureConnectionString(value, secretKeys ?? defaultSecureKeys, secret) as T extends string ? SecureConnectionString : T;\n }\n\n public override toString(): string {\n return this.#data.map(([key, value]) => `${key}=${value}`).join(';');\n }\n\n public override toJSON(): object {\n return Object.fromEntries(this.#data);\n }\n\n public override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureConnectionString]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import util, { type InspectOptions } from 'node:util';\nimport { SecureString } from './SecureString';\nimport { BaseObject, type InspectFunction } from './types';\n\ntype UrlObject = {\n href: string;\n password?: string;\n searchParams?: Record<string, string>;\n};\n\n/**\n * SecureURL obfuscates the password from the URL.\n */\nexport class SecureURL extends BaseObject {\n readonly #value: URL;\n readonly #password: SecureString | null;\n\n public get secretValue(): URL {\n return this.#value;\n }\n\n private constructor(value: URL, secret: string | undefined) {\n super();\n this.#value = value;\n this.#password = SecureString.from(value.password || null, secret);\n }\n\n static factory(secret: string | undefined): (value: URL) => SecureURL {\n return (value: URL) => SecureURL.from(value, secret);\n }\n\n public static from<T extends URL | null | undefined>(value: T, secret?: string): T extends URL ? SecureURL : T {\n if (value === null) {\n return null as T extends URL ? SecureURL : T;\n }\n if (value === undefined) {\n return undefined as T extends URL ? SecureURL : T;\n }\n return new SecureURL(value, secret) as T extends URL ? SecureURL : T;\n }\n\n override toString(): string {\n const newUrl = new URL(this.#value.href);\n if (this.#password !== null) {\n newUrl.password = this.#password.toString();\n }\n return newUrl.href;\n }\n\n override toJSON(): UrlObject {\n const newUrl = new URL(this.#value.href);\n newUrl.password = '';\n\n const searchParams = new URLSearchParams(newUrl.searchParams);\n newUrl.search = '';\n\n let password: string | undefined;\n if (this.#password !== null) {\n password = this.#password.toString();\n }\n\n const result: UrlObject = {\n href: newUrl.href,\n };\n if (password !== undefined) {\n result.password = password;\n }\n if (searchParams.size > 0) {\n result.searchParams = Object.fromEntries(searchParams);\n }\n return result;\n }\n override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureURL]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import { SecureConnectionString } from './SecureConnectionString';\nimport { SecureString } from './SecureString';\nimport { SecureURL } from './SecureURL';\nimport type { SecureFactory } from './types';\n\nexport const createFactory = (secret?: string): SecureFactory => {\n return {\n string: SecureString.factory(secret),\n connectionString: SecureConnectionString.factory(secret),\n url: SecureURL.factory(secret),\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/hash.ts","../src/types.ts","../src/SecureString.ts","../src/defaults.ts","../src/SecureConnectionString.ts","../src/SecureURL.ts","../src/createFactory.ts"],"names":["createHash","createHmac","hash","util","value"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createHash, createHmac } from 'node:crypto';\n\ntype HashAlgorithm = {\n hash: (x: string) => string;\n prefix: string;\n};\n\nconst algorithms = {\n sha256: () => ({\n hash: (x: string) => createHash('sha256').update(x).digest('hex'),\n prefix: 'sha256',\n }),\n hs256: (secret: string) => ({\n hash: (x: string) => createHmac('sha256', secret).update(x).digest('hex'),\n prefix: 'hs256',\n }),\n} as const;\n\nconst getAlgorithm = (secret?: string): HashAlgorithm => {\n return secret === undefined ? algorithms.sha256() : algorithms.hs256(secret);\n};\n\nexport const hash = (input: string, secret?: string) => {\n const alg = getAlgorithm(secret);\n const hash = alg.hash(input);\n return `${alg.prefix}:${hash}`;\n};\n","import util, { type InspectOptions } from 'node:util';\nimport type { SecureConnectionString } from './SecureConnectionString';\nimport type { SecureString } from './SecureString';\nimport type { SecureURL } from './SecureURL';\n\nexport type InspectFunction = typeof util.inspect;\n\nexport abstract class BaseObject {\n public abstract toString(): string;\n public abstract toJSON(): string | object;\n public abstract [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string;\n}\n\nexport type SecureFactory = {\n string: (value: string) => SecureString;\n connectionString: (value: string, secretKeys?: readonly string[]) => SecureConnectionString;\n url: (value: URL) => SecureURL;\n};\n\nexport type SecureKeys = readonly string[];\n","import util, { type InspectOptions } from 'node:util';\nimport { hash } from './hash';\nimport { BaseObject, type InspectFunction } from './types';\n\nexport class SecureString extends BaseObject {\n readonly #value: string;\n readonly #hash: string;\n\n public get secretValue(): string {\n return this.#value;\n }\n\n private constructor(value: string, secret?: string) {\n super();\n this.#value = value;\n this.#hash = hash(value, secret);\n }\n\n static factory(secret: string | undefined): (value: string) => SecureString {\n return (value: string) => SecureString.from(value, secret);\n }\n\n public static from<T extends string | null | undefined>(value: T, secret?: string): T extends string ? SecureString : T {\n if (value === null) {\n return null as T extends string ? SecureString : T;\n }\n if (value === undefined) {\n return undefined as T extends string ? SecureString : T;\n }\n return new SecureString(value, secret) as T extends string ? SecureString : T;\n }\n\n public override toString() {\n return this.#hash;\n }\n public override toJSON() {\n return this.toString();\n }\n override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureString]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import type { SecureKeys } from './types';\n\nexport const defaultSecureKeys = ['AccessKey', 'SharedAccessKey', 'Password', 'AccountKey', 'Secret', 'SecretKey', 'ApiKey', 'Token', 'Key', 'MasterKey', 'PrimaryKey', 'SecondaryKey'] as const satisfies SecureKeys;\n","import util, { type InspectOptions } from 'node:util';\nimport { SecureString } from './SecureString';\nimport { defaultSecureKeys } from './defaults';\nimport { BaseObject, type InspectFunction, type SecureKeys } from './types';\n\nexport class SecureConnectionString extends BaseObject {\n readonly #value: string;\n readonly #data: [string, string | SecureString][];\n\n public get secretValue(): string {\n return this.#value;\n }\n\n private constructor(value: string, secretKeys: SecureKeys, secret: string | undefined) {\n super();\n this.#value = value;\n this.#data = this.parseConnectionString(\n value,\n secretKeys.map((x) => x.toLocaleLowerCase()),\n secret,\n );\n }\n\n private parseConnectionString(value: string, secretKeys: SecureKeys, secret: string | undefined): [string, string | SecureString][] {\n return value\n .split(';')\n .filter(Boolean)\n .map((pair) => {\n const [key, value] = pair.split('=');\n const v = value ?? '';\n const val = secretKeys.includes(key.toLocaleLowerCase()) ? SecureString.from(v, secret) : v;\n return [key, val];\n });\n }\n\n static factory(secret: string | undefined, secretKeys?: SecureKeys): (value: string) => SecureConnectionString {\n return (value: string) => SecureConnectionString.from(value, secretKeys, secret);\n }\n\n public static from<T extends string | null | undefined>(value: T, secretKeys?: SecureKeys, secret?: string): T extends string ? SecureConnectionString : T {\n if (value === null) {\n return null as T extends string ? SecureConnectionString : T;\n }\n if (value === undefined) {\n return undefined as T extends string ? SecureConnectionString : T;\n }\n return new SecureConnectionString(value, secretKeys ?? defaultSecureKeys, secret) as T extends string ? SecureConnectionString : T;\n }\n\n public override toString(): string {\n return this.#data.map(([key, value]) => `${key}=${value}`).join(';');\n }\n\n public override toJSON(): object {\n return Object.fromEntries(this.#data);\n }\n\n public override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureConnectionString]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import util, { type InspectOptions } from 'node:util';\nimport { SecureString } from './SecureString';\nimport { BaseObject, type InspectFunction } from './types';\n\ntype UrlObject = {\n href: string;\n password?: string;\n searchParams?: Record<string, string>;\n};\n\n/**\n * SecureURL obfuscates the password from the URL.\n */\nexport class SecureURL extends BaseObject {\n readonly #value: URL;\n readonly #password: SecureString | null;\n\n public get secretValue(): URL {\n return this.#value;\n }\n\n private constructor(value: URL, secret: string | undefined) {\n super();\n this.#value = value;\n this.#password = SecureString.from(value.password || null, secret);\n }\n\n static factory(secret: string | undefined): (value: URL) => SecureURL {\n return (value: URL) => SecureURL.from(value, secret);\n }\n\n public static from<T extends URL | null | undefined>(value: T, secret?: string): T extends URL ? SecureURL : T {\n if (value === null) {\n return null as T extends URL ? SecureURL : T;\n }\n if (value === undefined) {\n return undefined as T extends URL ? SecureURL : T;\n }\n return new SecureURL(value, secret) as T extends URL ? SecureURL : T;\n }\n\n override toString(): string {\n const newUrl = new URL(this.#value.href);\n if (this.#password !== null) {\n newUrl.password = this.#password.toString();\n }\n return newUrl.href;\n }\n\n override toJSON(): UrlObject {\n const newUrl = new URL(this.#value.href);\n newUrl.password = '';\n\n const searchParams = new URLSearchParams(newUrl.searchParams);\n newUrl.search = '';\n\n let password: string | undefined;\n if (this.#password !== null) {\n password = this.#password.toString();\n }\n\n const result: UrlObject = {\n href: newUrl.href,\n };\n if (password !== undefined) {\n result.password = password;\n }\n if (searchParams.size > 0) {\n result.searchParams = Object.fromEntries(searchParams);\n }\n return result;\n }\n override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureURL]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import { SecureConnectionString } from './SecureConnectionString';\nimport { SecureString } from './SecureString';\nimport { SecureURL } from './SecureURL';\nimport type { SecureFactory } from './types';\n\nexport const createFactory = (secret?: string): SecureFactory => {\n return {\n string: SecureString.factory(secret),\n connectionString: SecureConnectionString.factory(secret),\n url: SecureURL.factory(secret),\n };\n};\n"]}
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import t from"node:util";import{createHash as e,createHmac as r}from"node:crypto";var s=Object.defineProperty,n=(t,e)=>s(t,"name",{value:e,configurable:!0}),o=n((t=>void 0===t?e("sha256"):r("sha256",t)),"getHash"),a=n(((t,e)=>`sha256:${o(e).update(t).digest("hex")}`),"sha256"),i=class{static{n(this,"BaseObject")}},c=class e extends i{static{n(this,"SecureString")}#t;#e;get secretValue(){return this.#t}constructor(t,e){super(),this.#t=t,this.#e=a(t,e)}static factory(t){return r=>e.from(r,t)}static from(t,r){return null===t?null:void 0!==t?new e(t,r):void 0}toString(){return this.#e}toJSON(){return this.toString()}[t.inspect.custom](t,e,r){if(t<0)return"[SecureURL]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},u=["AccessKey","SharedAccessKey","Password","AccountKey","Secret","SecretKey","ApiKey","Token","Key","MasterKey","PrimaryKey","SecondaryKey"],l=class e extends i{static{n(this,"SecureConnectionString")}#t;#r;get secretValue(){return this.#t}constructor(t,e,r){super(),this.#t=t,this.#r=this.parseConnectionString(t,e.map((t=>t.toLocaleLowerCase())),r)}parseConnectionString(t,e,r){return t.split(";").filter(Boolean).map((t=>{const[s,n]=t.split("="),o=n??"",a=e.includes(s.toLocaleLowerCase())?c.from(o,r):o;return[s,a]}))}static factory(t,r){return s=>e.from(s,r,t)}static from(t,r,s){return null===t?null:void 0!==t?new e(t,r??u,s):void 0}toString(){return this.#r.map((([t,e])=>`${t}=${e}`)).join(";")}toJSON(){return Object.fromEntries(this.#r)}[t.inspect.custom](t,e,r){if(t<0)return"[SecureConnectionString]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},h=class e extends i{static{n(this,"SecureURL")}#t;#s;get secretValue(){return this.#t}constructor(t,e){super(),this.#t=t,this.#s=c.from(t.password||null,e)}static factory(t){return r=>e.from(r,t)}static from(t,r){return null===t?null:void 0!==t?new e(t,r):void 0}toString(){const t=new URL(this.#t.href);return null!==this.#s&&(t.password=this.#s.toString()),t.href}toJSON(){const t=new URL(this.#t.href);t.password="";const e=new URLSearchParams(t.searchParams);let r;t.search="",null!==this.#s&&(r=this.#s.toString());const s={href:t.href};return void 0!==r&&(s.password=r),e.size>0&&(s.searchParams=Object.fromEntries(e)),s}[t.inspect.custom](t,e,r){if(t<0)return"[SecureURL]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},d=n((t=>({string:c.factory(t),connectionString:l.factory(t),url:h.factory(t)})),"createFactory");export{l as SecureConnectionString,c as SecureString,h as SecureURL,d as createFactory,u as defaultSecureKeys};//# sourceMappingURL=index.js.map
1
+ import t from"node:util";import{createHash as e,createHmac as r}from"node:crypto";var s=Object.defineProperty,n=(t,e)=>s(t,"name",{value:e,configurable:!0}),a={sha256:n((()=>({hash:n((t=>e("sha256").update(t).digest("hex")),"hash"),prefix:"sha256"})),"sha256"),hs256:n((t=>({hash:n((e=>r("sha256",t).update(e).digest("hex")),"hash"),prefix:"hs256"})),"hs256")},o=n((t=>void 0===t?a.sha256():a.hs256(t)),"getAlgorithm"),i=n(((t,e)=>{const r=o(e),s=r.hash(t);return`${r.prefix}:${s}`}),"hash"),c=class{static{n(this,"BaseObject")}},h=class e extends c{static{n(this,"SecureString")}#t;#e;get secretValue(){return this.#t}constructor(t,e){super(),this.#t=t,this.#e=i(t,e)}static factory(t){return r=>e.from(r,t)}static from(t,r){return null===t?null:void 0!==t?new e(t,r):void 0}toString(){return this.#e}toJSON(){return this.toString()}[t.inspect.custom](t,e,r){if(t<0)return"[SecureString]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},u=["AccessKey","SharedAccessKey","Password","AccountKey","Secret","SecretKey","ApiKey","Token","Key","MasterKey","PrimaryKey","SecondaryKey"],l=class e extends c{static{n(this,"SecureConnectionString")}#t;#r;get secretValue(){return this.#t}constructor(t,e,r){super(),this.#t=t,this.#r=this.parseConnectionString(t,e.map((t=>t.toLocaleLowerCase())),r)}parseConnectionString(t,e,r){return t.split(";").filter(Boolean).map((t=>{const[s,n]=t.split("="),a=n??"",o=e.includes(s.toLocaleLowerCase())?h.from(a,r):a;return[s,o]}))}static factory(t,r){return s=>e.from(s,r,t)}static from(t,r,s){return null===t?null:void 0!==t?new e(t,r??u,s):void 0}toString(){return this.#r.map((([t,e])=>`${t}=${e}`)).join(";")}toJSON(){return Object.fromEntries(this.#r)}[t.inspect.custom](t,e,r){if(t<0)return"[SecureConnectionString]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},d=class e extends c{static{n(this,"SecureURL")}#t;#s;get secretValue(){return this.#t}constructor(t,e){super(),this.#t=t,this.#s=h.from(t.password||null,e)}static factory(t){return r=>e.from(r,t)}static from(t,r){return null===t?null:void 0!==t?new e(t,r):void 0}toString(){const t=new URL(this.#t.href);return null!==this.#s&&(t.password=this.#s.toString()),t.href}toJSON(){const t=new URL(this.#t.href);t.password="";const e=new URLSearchParams(t.searchParams);let r;t.search="",null!==this.#s&&(r=this.#s.toString());const s={href:t.href};return void 0!==r&&(s.password=r),e.size>0&&(s.searchParams=Object.fromEntries(e)),s}[t.inspect.custom](t,e,r){if(t<0)return"[SecureURL]";const s=Object.assign({},e,{depth:null==e.depth?null:e.depth-1});return r(this.toJSON(),s)}},p=n((t=>({string:h.factory(t),connectionString:l.factory(t),url:d.factory(t)})),"createFactory");export{l as SecureConnectionString,h as SecureString,d as SecureURL,p as createFactory,u as defaultSecureKeys};//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sha256.ts","../src/types.ts","../src/SecureString.ts","../src/defaults.ts","../src/SecureConnectionString.ts","../src/SecureURL.ts","../src/createFactory.ts"],"names":["value","util"],"mappings":"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","file":"index.js","sourcesContent":["import { type Hash, type Hmac, createHash, createHmac } from 'node:crypto';\n\nconst getHash = (secret?: string) => {\n if (secret === undefined) {\n return createHash('sha256');\n }\n return createHmac('sha256', secret);\n};\n\nexport const sha256 = (input: string, secret?: string) => {\n const hash = getHash(secret);\n const digest = hash.update(input).digest('hex');\n return `sha256:${digest}`;\n};\n","import util, { type InspectOptions } from 'node:util';\nimport type { SecureConnectionString } from './SecureConnectionString';\nimport type { SecureString } from './SecureString';\nimport type { SecureURL } from './SecureURL';\n\nexport type InspectFunction = typeof util.inspect;\n\nexport abstract class BaseObject {\n public abstract toString(): string;\n public abstract toJSON(): string | object;\n public abstract [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string;\n}\n\nexport type SecureFactory = {\n string: (value: string) => SecureString;\n connectionString: (value: string, secretKeys?: readonly string[]) => SecureConnectionString;\n url: (value: URL) => SecureURL;\n};\n\nexport type SecureKeys = readonly string[];\n","import util, { type InspectOptions } from 'node:util';\nimport { sha256 } from './sha256';\nimport { BaseObject, type InspectFunction } from './types';\n\nexport class SecureString extends BaseObject {\n readonly #value: string;\n readonly #hash: string;\n\n public get secretValue(): string {\n return this.#value;\n }\n\n private constructor(value: string, secret?: string) {\n super();\n this.#value = value;\n this.#hash = sha256(value, secret);\n }\n\n static factory(secret: string | undefined): (value: string) => SecureString {\n return (value: string) => SecureString.from(value, secret);\n }\n\n public static from<T extends string | null | undefined>(value: T, secret?: string): T extends string ? SecureString : T {\n if (value === null) {\n return null as T extends string ? SecureString : T;\n }\n if (value === undefined) {\n return undefined as T extends string ? SecureString : T;\n }\n return new SecureString(value, secret) as T extends string ? SecureString : T;\n }\n\n public override toString() {\n return this.#hash;\n }\n public override toJSON() {\n return this.toString();\n }\n override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureURL]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import type { SecureKeys } from './types';\n\nexport const defaultSecureKeys = ['AccessKey', 'SharedAccessKey', 'Password', 'AccountKey', 'Secret', 'SecretKey', 'ApiKey', 'Token', 'Key', 'MasterKey', 'PrimaryKey', 'SecondaryKey'] as const satisfies SecureKeys;\n","import util, { type InspectOptions } from 'node:util';\nimport { SecureString } from './SecureString';\nimport { defaultSecureKeys } from './defaults';\nimport { BaseObject, type InspectFunction, type SecureKeys } from './types';\n\nexport class SecureConnectionString extends BaseObject {\n readonly #value: string;\n readonly #data: [string, string | SecureString][];\n\n public get secretValue(): string {\n return this.#value;\n }\n\n private constructor(value: string, secretKeys: SecureKeys, secret: string | undefined) {\n super();\n this.#value = value;\n this.#data = this.parseConnectionString(\n value,\n secretKeys.map((x) => x.toLocaleLowerCase()),\n secret,\n );\n }\n\n private parseConnectionString(value: string, secretKeys: SecureKeys, secret: string | undefined): [string, string | SecureString][] {\n return value\n .split(';')\n .filter(Boolean)\n .map((pair) => {\n const [key, value] = pair.split('=');\n const v = value ?? '';\n const val = secretKeys.includes(key.toLocaleLowerCase()) ? SecureString.from(v, secret) : v;\n return [key, val];\n });\n }\n\n static factory(secret: string | undefined, secretKeys?: SecureKeys): (value: string) => SecureConnectionString {\n return (value: string) => SecureConnectionString.from(value, secretKeys, secret);\n }\n\n public static from<T extends string | null | undefined>(value: T, secretKeys?: SecureKeys, secret?: string): T extends string ? SecureConnectionString : T {\n if (value === null) {\n return null as T extends string ? SecureConnectionString : T;\n }\n if (value === undefined) {\n return undefined as T extends string ? SecureConnectionString : T;\n }\n return new SecureConnectionString(value, secretKeys ?? defaultSecureKeys, secret) as T extends string ? SecureConnectionString : T;\n }\n\n public override toString(): string {\n return this.#data.map(([key, value]) => `${key}=${value}`).join(';');\n }\n\n public override toJSON(): object {\n return Object.fromEntries(this.#data);\n }\n\n public override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureConnectionString]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import util, { type InspectOptions } from 'node:util';\nimport { SecureString } from './SecureString';\nimport { BaseObject, type InspectFunction } from './types';\n\ntype UrlObject = {\n href: string;\n password?: string;\n searchParams?: Record<string, string>;\n};\n\n/**\n * SecureURL obfuscates the password from the URL.\n */\nexport class SecureURL extends BaseObject {\n readonly #value: URL;\n readonly #password: SecureString | null;\n\n public get secretValue(): URL {\n return this.#value;\n }\n\n private constructor(value: URL, secret: string | undefined) {\n super();\n this.#value = value;\n this.#password = SecureString.from(value.password || null, secret);\n }\n\n static factory(secret: string | undefined): (value: URL) => SecureURL {\n return (value: URL) => SecureURL.from(value, secret);\n }\n\n public static from<T extends URL | null | undefined>(value: T, secret?: string): T extends URL ? SecureURL : T {\n if (value === null) {\n return null as T extends URL ? SecureURL : T;\n }\n if (value === undefined) {\n return undefined as T extends URL ? SecureURL : T;\n }\n return new SecureURL(value, secret) as T extends URL ? SecureURL : T;\n }\n\n override toString(): string {\n const newUrl = new URL(this.#value.href);\n if (this.#password !== null) {\n newUrl.password = this.#password.toString();\n }\n return newUrl.href;\n }\n\n override toJSON(): UrlObject {\n const newUrl = new URL(this.#value.href);\n newUrl.password = '';\n\n const searchParams = new URLSearchParams(newUrl.searchParams);\n newUrl.search = '';\n\n let password: string | undefined;\n if (this.#password !== null) {\n password = this.#password.toString();\n }\n\n const result: UrlObject = {\n href: newUrl.href,\n };\n if (password !== undefined) {\n result.password = password;\n }\n if (searchParams.size > 0) {\n result.searchParams = Object.fromEntries(searchParams);\n }\n return result;\n }\n override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureURL]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import { SecureConnectionString } from './SecureConnectionString';\nimport { SecureString } from './SecureString';\nimport { SecureURL } from './SecureURL';\nimport type { SecureFactory } from './types';\n\nexport const createFactory = (secret?: string): SecureFactory => {\n return {\n string: SecureString.factory(secret),\n connectionString: SecureConnectionString.factory(secret),\n url: SecureURL.factory(secret),\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/hash.ts","../src/types.ts","../src/SecureString.ts","../src/defaults.ts","../src/SecureConnectionString.ts","../src/SecureURL.ts","../src/createFactory.ts"],"names":["hash","value","util"],"mappings":"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","file":"index.js","sourcesContent":["import { createHash, createHmac } from 'node:crypto';\n\ntype HashAlgorithm = {\n hash: (x: string) => string;\n prefix: string;\n};\n\nconst algorithms = {\n sha256: () => ({\n hash: (x: string) => createHash('sha256').update(x).digest('hex'),\n prefix: 'sha256',\n }),\n hs256: (secret: string) => ({\n hash: (x: string) => createHmac('sha256', secret).update(x).digest('hex'),\n prefix: 'hs256',\n }),\n} as const;\n\nconst getAlgorithm = (secret?: string): HashAlgorithm => {\n return secret === undefined ? algorithms.sha256() : algorithms.hs256(secret);\n};\n\nexport const hash = (input: string, secret?: string) => {\n const alg = getAlgorithm(secret);\n const hash = alg.hash(input);\n return `${alg.prefix}:${hash}`;\n};\n","import util, { type InspectOptions } from 'node:util';\nimport type { SecureConnectionString } from './SecureConnectionString';\nimport type { SecureString } from './SecureString';\nimport type { SecureURL } from './SecureURL';\n\nexport type InspectFunction = typeof util.inspect;\n\nexport abstract class BaseObject {\n public abstract toString(): string;\n public abstract toJSON(): string | object;\n public abstract [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string;\n}\n\nexport type SecureFactory = {\n string: (value: string) => SecureString;\n connectionString: (value: string, secretKeys?: readonly string[]) => SecureConnectionString;\n url: (value: URL) => SecureURL;\n};\n\nexport type SecureKeys = readonly string[];\n","import util, { type InspectOptions } from 'node:util';\nimport { hash } from './hash';\nimport { BaseObject, type InspectFunction } from './types';\n\nexport class SecureString extends BaseObject {\n readonly #value: string;\n readonly #hash: string;\n\n public get secretValue(): string {\n return this.#value;\n }\n\n private constructor(value: string, secret?: string) {\n super();\n this.#value = value;\n this.#hash = hash(value, secret);\n }\n\n static factory(secret: string | undefined): (value: string) => SecureString {\n return (value: string) => SecureString.from(value, secret);\n }\n\n public static from<T extends string | null | undefined>(value: T, secret?: string): T extends string ? SecureString : T {\n if (value === null) {\n return null as T extends string ? SecureString : T;\n }\n if (value === undefined) {\n return undefined as T extends string ? SecureString : T;\n }\n return new SecureString(value, secret) as T extends string ? SecureString : T;\n }\n\n public override toString() {\n return this.#hash;\n }\n public override toJSON() {\n return this.toString();\n }\n override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureString]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import type { SecureKeys } from './types';\n\nexport const defaultSecureKeys = ['AccessKey', 'SharedAccessKey', 'Password', 'AccountKey', 'Secret', 'SecretKey', 'ApiKey', 'Token', 'Key', 'MasterKey', 'PrimaryKey', 'SecondaryKey'] as const satisfies SecureKeys;\n","import util, { type InspectOptions } from 'node:util';\nimport { SecureString } from './SecureString';\nimport { defaultSecureKeys } from './defaults';\nimport { BaseObject, type InspectFunction, type SecureKeys } from './types';\n\nexport class SecureConnectionString extends BaseObject {\n readonly #value: string;\n readonly #data: [string, string | SecureString][];\n\n public get secretValue(): string {\n return this.#value;\n }\n\n private constructor(value: string, secretKeys: SecureKeys, secret: string | undefined) {\n super();\n this.#value = value;\n this.#data = this.parseConnectionString(\n value,\n secretKeys.map((x) => x.toLocaleLowerCase()),\n secret,\n );\n }\n\n private parseConnectionString(value: string, secretKeys: SecureKeys, secret: string | undefined): [string, string | SecureString][] {\n return value\n .split(';')\n .filter(Boolean)\n .map((pair) => {\n const [key, value] = pair.split('=');\n const v = value ?? '';\n const val = secretKeys.includes(key.toLocaleLowerCase()) ? SecureString.from(v, secret) : v;\n return [key, val];\n });\n }\n\n static factory(secret: string | undefined, secretKeys?: SecureKeys): (value: string) => SecureConnectionString {\n return (value: string) => SecureConnectionString.from(value, secretKeys, secret);\n }\n\n public static from<T extends string | null | undefined>(value: T, secretKeys?: SecureKeys, secret?: string): T extends string ? SecureConnectionString : T {\n if (value === null) {\n return null as T extends string ? SecureConnectionString : T;\n }\n if (value === undefined) {\n return undefined as T extends string ? SecureConnectionString : T;\n }\n return new SecureConnectionString(value, secretKeys ?? defaultSecureKeys, secret) as T extends string ? SecureConnectionString : T;\n }\n\n public override toString(): string {\n return this.#data.map(([key, value]) => `${key}=${value}`).join(';');\n }\n\n public override toJSON(): object {\n return Object.fromEntries(this.#data);\n }\n\n public override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureConnectionString]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import util, { type InspectOptions } from 'node:util';\nimport { SecureString } from './SecureString';\nimport { BaseObject, type InspectFunction } from './types';\n\ntype UrlObject = {\n href: string;\n password?: string;\n searchParams?: Record<string, string>;\n};\n\n/**\n * SecureURL obfuscates the password from the URL.\n */\nexport class SecureURL extends BaseObject {\n readonly #value: URL;\n readonly #password: SecureString | null;\n\n public get secretValue(): URL {\n return this.#value;\n }\n\n private constructor(value: URL, secret: string | undefined) {\n super();\n this.#value = value;\n this.#password = SecureString.from(value.password || null, secret);\n }\n\n static factory(secret: string | undefined): (value: URL) => SecureURL {\n return (value: URL) => SecureURL.from(value, secret);\n }\n\n public static from<T extends URL | null | undefined>(value: T, secret?: string): T extends URL ? SecureURL : T {\n if (value === null) {\n return null as T extends URL ? SecureURL : T;\n }\n if (value === undefined) {\n return undefined as T extends URL ? SecureURL : T;\n }\n return new SecureURL(value, secret) as T extends URL ? SecureURL : T;\n }\n\n override toString(): string {\n const newUrl = new URL(this.#value.href);\n if (this.#password !== null) {\n newUrl.password = this.#password.toString();\n }\n return newUrl.href;\n }\n\n override toJSON(): UrlObject {\n const newUrl = new URL(this.#value.href);\n newUrl.password = '';\n\n const searchParams = new URLSearchParams(newUrl.searchParams);\n newUrl.search = '';\n\n let password: string | undefined;\n if (this.#password !== null) {\n password = this.#password.toString();\n }\n\n const result: UrlObject = {\n href: newUrl.href,\n };\n if (password !== undefined) {\n result.password = password;\n }\n if (searchParams.size > 0) {\n result.searchParams = Object.fromEntries(searchParams);\n }\n return result;\n }\n override [util.inspect.custom](depth: number, options: InspectOptions, inspect: InspectFunction): string {\n if (depth < 0) {\n return '[SecureURL]';\n }\n const newOptions = Object.assign({}, options, {\n depth: options.depth == null ? null : options.depth - 1,\n });\n return inspect(this.toJSON(), newOptions);\n }\n}\n","import { SecureConnectionString } from './SecureConnectionString';\nimport { SecureString } from './SecureString';\nimport { SecureURL } from './SecureURL';\nimport type { SecureFactory } from './types';\n\nexport const createFactory = (secret?: string): SecureFactory => {\n return {\n string: SecureString.factory(secret),\n connectionString: SecureConnectionString.factory(secret),\n url: SecureURL.factory(secret),\n };\n};\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shellicar/core-config",
3
3
  "type": "module",
4
- "version": "1.0.0",
4
+ "version": "1.0.1",
5
5
  "description": "A library for securely handling sensitive configuration values like connection strings, URLs, and secrets.",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/shellicar/core-config#readme",
@@ -55,7 +55,7 @@
55
55
  },
56
56
  "scripts": {
57
57
  "build": "tsup-node",
58
- "dev": "tsup-node --watch src",
58
+ "dev": "tsup-node --watch",
59
59
  "test": "vitest run",
60
60
  "type-check": "tsc -p tsconfig.check.json"
61
61
  }