@buildplease/core 1.0.2 → 1.1.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/README.md +30 -2
- package/bin/buildplease.mjs +9 -0
- package/dist/cli/index.mjs +1 -0
- package/dist/src-node/index.cjs +2 -2
- package/dist/src-node/index.d.cts +201 -79
- package/dist/src-node/index.d.mts +201 -79
- package/dist/src-node/index.mjs +2 -2
- package/dist/src-test/index.cjs +1 -0
- package/dist/src-test/index.d.cts +5 -0
- package/dist/src-test/index.d.mts +5 -0
- package/dist/src-test/index.mjs +1 -0
- package/package.json +12 -6
- package/dist/src-node-test/index.cjs +0 -2
- package/dist/src-node-test/index.d.cts +0 -99
- package/dist/src-node-test/index.d.mts +0 -99
- package/dist/src-node-test/index.mjs +0 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @buildplease/core
|
|
2
2
|
|
|
3
|
-
Core
|
|
3
|
+
Core provides shared application primitives for BuildPlease kits.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -18,6 +18,34 @@ const assemblies = coreAssembly();
|
|
|
18
18
|
|
|
19
19
|
Node.js-specific APIs are available from `@buildplease/core/node`.
|
|
20
20
|
|
|
21
|
+
### Environment configuration
|
|
22
|
+
|
|
23
|
+
Define application environment configuration in `environment.config.ts`:
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { defineConfig, defineEnvironments, defineSource } from '@buildplease/core/node';
|
|
27
|
+
|
|
28
|
+
const environments = defineEnvironments({
|
|
29
|
+
test: { file: '.env.test' },
|
|
30
|
+
production: { file: '.env.production' },
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const from = defineSource(environments);
|
|
34
|
+
|
|
35
|
+
export default defineConfig(environments, {
|
|
36
|
+
origin: from.env('API_ORIGIN').default('http://localhost:30000'),
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Environment files are optional dotenv hookups. If a configured file is missing, BuildPlease continues with the existing process environment. Existing `process.env` values keep priority over dotenv values.
|
|
41
|
+
|
|
42
|
+
Select the BuildPlease environment when running a command:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
buildplease --env test -- <command>
|
|
46
|
+
buildplease --env production -- <command>
|
|
47
|
+
```
|
|
48
|
+
|
|
21
49
|
## Features
|
|
22
50
|
|
|
23
51
|
- dependency injection and application assemblies
|
|
@@ -25,7 +53,7 @@ Node.js-specific APIs are available from `@buildplease/core/node`.
|
|
|
25
53
|
- errors, validation, and normalization primitives
|
|
26
54
|
- L10n resources and localization helpers
|
|
27
55
|
- security, synchronization, and general utilities
|
|
28
|
-
- Node.js infrastructure helpers
|
|
56
|
+
- Node.js environment configuration and infrastructure helpers
|
|
29
57
|
|
|
30
58
|
## License
|
|
31
59
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runMain } from '../dist/cli/index.mjs';
|
|
3
|
+
|
|
4
|
+
try {
|
|
5
|
+
process.exitCode = runMain(process.argv.slice(2));
|
|
6
|
+
} catch (error) {
|
|
7
|
+
process.stderr.write(`[BuildPlease] ${error instanceof Error ? error.message : String(error)}\n`);
|
|
8
|
+
process.exitCode = 1;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{spawnSync as e}from"node:child_process";import{constants as t}from"node:os";const n=`Usage: buildplease --env <environment> -- <command> [arguments...]`;function r(r){let a=r.indexOf(`--`);if(a<0){if(r.length===1&&(r[0]===`--help`||r[0]===`-h`))return process.stdout.write(`${n}\n`),0;throw Error(`${n}\nMissing "--" command separator.`)}let o=r.slice(0,a);if(o.includes(`--help`)||o.includes(`-h`))return process.stdout.write(`${n}\n`),0;let s=r.slice(a+1),c=i(o),l=s[0];if(!l)throw Error(`${n}\nMissing command.`);let u=e(l,s.slice(1),{env:{...process.env,BUILDPLEASE_ENVIRONMENT:c},shell:process.platform===`win32`,stdio:`inherit`});if(u.error)throw u.error;return u.signal?128+(t.signals[u.signal]??0):u.status??1}function i(e){if(e.length!==2||e[0]!==`--env`)throw Error(`${n}\nExpected exactly one BuildPlease option: --env <environment>.`);let t=e[1]?.trim();if(!t)throw Error(`${n}\nEnvironment must not be empty.`);return t}export{r as runMain};
|
package/dist/src-node/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,
|
|
2
|
-
`)}formatPanelTop(e,t){let n=Math.max(1,t-this.visibleLength(e)-5);return`${f.colors.dim(`╭─`)} ${e} ${f.colors.dim(`─`.repeat(n))}${f.colors.dim(`╮`)}`}formatPanelBottom(e){return`${f.colors.dim(`╰`)}${f.colors.dim(`─`.repeat(e-2))}${f.colors.dim(`╯`)}`}formatPanelRow(e,t,n){let r=e.label.padEnd(14,` `),i=String(e.value),a=this.visibleLength(r)+this.visibleLength(i)+4,o=Math.max(0,t-a);return`${f.colors.dim(`│`)} ${f.colors.blue(r)}${n(i)}${` `.repeat(o)} ${f.colors.dim(`│`)}`}getPanelWidth(e){return Math.max(48,this.getTitleWidth(e),this.getRowsWidth(e.rows))}getTitleWidth(e){return this.visibleLength(e.title)+6}getRowsWidth(e){return Math.max(0,...e.map(e=>this.getRowWidth(e)))}getRowWidth(e){return 14+this.visibleLength(String(e.value))+4}visibleLength(e){return e.replace(ce,``).length}};const k=`${{name:`buildplease`,displayName:`BuildPlease`,scope:`@buildplease`}.name}.Core.DI`,A={DI:{Formatter:{UnitController:Symbol.for(`${k}.Formatter.UnitController`)},Logger:Symbol.for(`${k}.Logger`)}};function ue(e){return e instanceof Error}function j(e,t={}){if(e==null)return{};let{filterNull:n=!0,filterUndefined:r=!0,filterEmptyString:i=!1,filterEmptyObject:a=!1,filterEmptyArray:o=!1}=t;return Object.keys(e).reduce((s,c)=>{let l=e[c];return M(l)&&Object.getPrototypeOf(l)===null&&(l=void 0),de(l)&&(l=j(l,t)),n&&l===null||r&&l===void 0||i&&l===``||a&&N(l)||o&&Array.isArray(l)&&l.length===0||(s[c]=l),s},{})}function M(e){return typeof e==`object`&&!!e}function N(e){return M(e)&&Object.keys(e).length===0}function de(e){return M(e)&&Object.getPrototypeOf(e)===Object.prototype}function P(e){return e==null||[`string`,`number`,`boolean`,`bigint`,`symbol`].includes(typeof e)}Array.prototype.isEmpty=function(){return this==null||this.length===0},String.prototype.capitalized=function(){let e=this==null?``:this.toString();return e.trim()?e.charAt(0).toUpperCase()+e.slice(1):``};var F=class{streetLine1;streetLine2;postalCode;state;city;country;countryCode;constructor(e){this.streetLine1=e.streetLine1,this.streetLine2=e.streetLine2,this.postalCode=e.postalCode,this.state=e.state,this.city=e.city,this.country=e.country,this.countryCode=e.countryCode}toJSON(){return j({streetLine1:this.streetLine1,streetLine2:this.streetLine2,postalCode:this.postalCode,city:this.city,state:this.state,country:this.country,countryCode:this.countryCode},{filterNull:!0,filterUndefined:!0,filterEmptyString:!0})}formatted(){let e=(e,t)=>e.map(e=>e?.trim()).filter(e=>e&&e.length>0).join(t).trim(),t=this.streetLine1;return e([t,e([this.postalCode,this.city],` `),e([this.country],`, `)],`, `)}},I=class{email;fb;ig;phone;web;constructor({email:e,fb:t,ig:n,phone:r,web:i}){this.email=e,this.fb=t,this.ig=n,this.phone=r,this.web=i}toJSON(){return j({email:this.email,fb:this.fb,ig:this.ig,phone:this.phone,web:this.web},{filterNull:!0,filterUndefined:!0,filterEmptyString:!0})}},L=o({DateFormat:()=>z,DateTime:()=>R});c(L,require("date-fns"));var R=class e{date;constructor(e){if(!e){this.date=new Date;return}if(e instanceof Date){if(!(0,m.isValid)(e))throw Error(`Invalid date object`);this.date=e;return}let t=(0,m.parseISO)(e);if(!(0,m.isValid)(t))throw Error(`Invalid date string`);this.date=t}static fromUnixTimestamp(t,n){return new e((0,m.fromUnixTime)(t,n))}static now(){return new e(new Date)}toJSON(){return this.toISOString()}toDate(){return this.date}toUnixTimestamp(){return(0,m.getUnixTime)(this.date)}getTime(){return this.date.getTime()}toISOString(){return(0,m.formatISO)(this.date)}format(e,t){return(0,m.format)(this.date,e,t)}addingDuration(t){return new e((0,m.add)(this.date,t))}addingMilliseconds(t){return new e((0,m.addMilliseconds)(this.date,t))}addingSeconds(t){return new e((0,m.addSeconds)(this.date,t))}addingMinutes(t){return new e((0,m.addMinutes)(this.date,t))}addingHours(t){return new e((0,m.addHours)(this.date,t))}addingDays(t){return new e((0,m.addDays)(this.date,t))}addingWeeks(t){return new e((0,m.addWeeks)(this.date,t))}addingMonths(t){return new e((0,m.addMonths)(this.date,t))}addingYears(t){return new e((0,m.addYears)(this.date,t))}subtractingDuration(t){return new e((0,m.sub)(this.date,t))}subtractingMilliseconds(t){return new e((0,m.subMilliseconds)(this.date,t))}subtractingSeconds(t){return new e((0,m.subSeconds)(this.date,t))}subtractingMinutes(t){return new e((0,m.subMinutes)(this.date,t))}subtractingHours(t){return new e((0,m.subHours)(this.date,t))}subtractingDays(t){return new e((0,m.subDays)(this.date,t))}subtractingWeeks(t){return new e((0,m.subWeeks)(this.date,t))}subtractingMonths(t){return new e((0,m.subMonths)(this.date,t))}subtractingYears(t){return new e((0,m.subYears)(this.date,t))}differenceInMilliseconds(e){return(0,m.differenceInMilliseconds)(this.date,e.date)}differenceInSeconds(e){return(0,m.differenceInSeconds)(this.date,e.date)}differenceInMinutes(e){return(0,m.differenceInMinutes)(this.date,e.date)}differenceInHours(e){return(0,m.differenceInHours)(this.date,e.date)}differenceInDays(e){return(0,m.differenceInDays)(this.date,e.date)}differenceInWeeks(e){return(0,m.differenceInWeeks)(this.date,e.date)}differenceInMonths(e){return(0,m.differenceInMonths)(this.date,e.date)}differenceInYears(e){return(0,m.differenceInYears)(this.date,e.date)}isEqualTo(e){return(0,m.isEqual)(this.date,e.date)}isBefore(e){return(0,m.isBefore)(this.date,e.date)}isAfter(e){return(0,m.isAfter)(this.date,e.date)}compareTo(e){return(0,m.compareAsc)(this.date,e.date)}isSameDayAs(e){return(0,m.isSameDay)(this.date,e.date)}startOfDay(){return new e((0,m.startOfDay)(this.date))}endOfDay(){return new e((0,m.endOfDay)(this.date))}startOfWeek(){return new e((0,m.startOfWeek)(this.date))}endOfWeek(){return new e((0,m.endOfWeek)(this.date))}startOfMonth(){return new e((0,m.startOfMonth)(this.date))}endOfMonth(){return new e((0,m.endOfMonth)(this.date))}startOfYear(){return new e((0,m.startOfYear)(this.date))}endOfYear(){return new e((0,m.endOfYear)(this.date))}get dayOfMonth(){return(0,m.getDate)(this.date)}get dayOfWeek(){return(0,m.getDay)(this.date)}get month(){return(0,m.getMonth)(this.date)}get year(){return(0,m.getYear)(this.date)}get hours(){return(0,m.getHours)(this.date)}get minutes(){return(0,m.getMinutes)(this.date)}get seconds(){return(0,m.getSeconds)(this.date)}settingDayOfMonth(t){return new e((0,m.setDate)(this.date,t))}settingDayOfWeek(t){return new e((0,m.setDay)(this.date,t))}settingMonth(t){return new e((0,m.setMonth)(this.date,t))}settingYear(t){return new e((0,m.setYear)(this.date,t))}settingHours(t){return new e((0,m.setHours)(this.date,t))}settingMinutes(t){return new e((0,m.setMinutes)(this.date,t))}settingSeconds(t){return new e((0,m.setSeconds)(this.date,t))}};let z=function(e){return e.ISO_DATE=`yyyy-MM-dd`,e.ISO_DATETIME=`yyyy-MM-dd'T'HH:mm:ssXXX`,e.MM_DD_YYYY=`MM/dd/yyyy`,e.FULL_MONTH_DAY_YEAR=`MMMM d, yyyy`,e.ABBR_MONTH_DAY_YEAR=`MMM d, yyyy`,e.RFC_3339=`yyyy-MM-dd'T'HH:mm:ss.SSSxxx`,e.ALT_RSS=`d MMM yyyy HH:mm:ss ZZZ`,e.RSS=`EEE, d MMM yyyy HH:mm:ss ZZZ`,e.HTTP_HEADER=`EEE, dd MMM yyyy HH:mm:ss zzz`,e.STANDARD=`EEE MMM dd HH:mm:ss Z yyyy`,e.EXTENDED=`eee dd-MMM-yyyy GG HH:mm:ss.SSS zzz`,e}({});var B=class e{utc;timeZone;constructor(e,t){this.timeZone=e,this.utc=t??new Date}static fromUtc(t,n){return new e(n,t)}static fromLocalIso(t,n){let r=(0,h.fromZonedTime)(t,n);return new e(n,r)}format(e,t){return(0,h.formatInTimeZone)(this.utc,this.timeZone,e,t)}toLocalIsoMinutes(e){return this.format(`yyyy-MM-dd'T'HH:mm`,e)}toLocalIsoSeconds(e){return this.format(`yyyy-MM-dd'T'HH:mm:ss`,e)}toISOString(){return this.utc.toISOString()}toUnixTimestamp(){return Math.floor(this.utc.getTime()/1e3)}toZonedDate(){return(0,h.toZonedTime)(this.utc,this.timeZone)}timezoneOffsetMs(e){return(0,h.getTimezoneOffset)(this.timeZone,e??this.utc)}},V=class{value;constructor([e,t]){if(e<-180||e>180)throw Error(`Longitude must be between -180 and 180.`);if(t<-90||t>90)throw Error(`Latitude must be between -90 and 90.`);this.value=[e,t]}get longitude(){return this.value[0]}get latitude(){return this.value[1]}toJSON(){return this.value}},H=class{type=`Point`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.toJSON(),...this.bbox&&{bbox:this.bbox}}}},fe=class{type=`MultiPoint`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.map(e=>e.toJSON()),...this.bbox&&{bbox:this.bbox}}}},pe=class{type=`LineString`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.map(e=>e.toJSON()),...this.bbox&&{bbox:this.bbox}}}},me=class{type=`MultiLineString`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.map(e=>e.map(e=>e.toJSON())),...this.bbox&&{bbox:this.bbox}}}},he=class{type=`Polygon`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.map(e=>e.map(e=>e.toJSON())),...this.bbox&&{bbox:this.bbox}}}},ge=class{type=`MultiPolygon`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.map(e=>e.map(e=>e.map(e=>e.toJSON()))),...this.bbox&&{bbox:this.bbox}}}};let _e=function(e){return e.Point=`Point`,e.MultiPoint=`MultiPoint`,e.LineString=`LineString`,e.MultiLineString=`MultiLineString`,e.Polygon=`Polygon`,e.MultiPolygon=`MultiPolygon`,e}({});function U(e){return Error(`Invalid ObjectId value: ${String(e)}`)}var ve=class e{value;constructor(e){if(e==null)throw U(e);let t=e.trim();if(t.length===0)throw U(e);this.value=t,Object.freeze(this)}get asString(){return this.value}equals(t){return this.value===e.from(t).value}compare(t){let n=e.from(t).value;return this.value===n?0:this.value<n?-1:1}hash(){return this.value}toJSON(){return this.value}toString(){return this.value}[Symbol.toPrimitive](){return this.value}static from(t){return t instanceof e?t:new e(t)}static isValid(e){return typeof e==`string`&&e.trim().length>0}static toValueSet(t){let n=new Set;for(let r of t)n.add(e.from(r).value);return n}},ye=class{day;intervals;constructor(e,t){this.day=e,this.intervals=t}toJSON(){return j({day:this.day,intervals:this.intervals},{filterNull:!0,filterUndefined:!0,filterEmptyString:!0})}},be=class{_milliseconds;_long;constructor(e,t){if(this._long=t?.long===!0,e==null)throw Error(`Invalid interval format: ${e}`);if(typeof e==`number`)this._milliseconds=e;else{let t=(0,g.default)(e);if(t===void 0)throw Error(`Invalid interval format: ${e}`);this._milliseconds=t}}get milliseconds(){return this._milliseconds}get seconds(){return Math.floor(this._milliseconds/1e3)}get minutes(){return Math.floor(this._milliseconds/6e4)}get hours(){return Math.floor(this._milliseconds/36e5)}get days(){return Math.floor(this._milliseconds/864e5)}get weeks(){return Math.floor(this._milliseconds/6048e5)}get formatted(){return(0,g.default)(this._milliseconds,{long:this._long})}toString(){return(0,g.default)(this._milliseconds,{long:this._long})}toObject(){return{milliseconds:this._milliseconds,seconds:this.seconds,minutes:this.minutes,hours:this.hours,days:this.days,weeks:this.weeks}}};let xe=function(e){return e.Byte=`B`,e.Kilobyte=`KB`,e.Megabyte=`MB`,e.Gigabyte=`GB`,e.Terabyte=`TB`,e}({}),Se=function(e){return e.Millimeter=`mm`,e.Centimeter=`cm`,e.Meter=`m`,e.Kilometer=`km`,e}({}),Ce=function(e){return e.Milligram=`mg`,e.Gram=`g`,e.Kilogram=`kg`,e.Tonne=`t`,e}({});c(o({Address:()=>F,ByteUnit:()=>xe,Contacts:()=>I,Coordinates:()=>V,DateFormat:()=>z,DateTime:()=>R,DistanceUnit:()=>Se,GeoJsonType:()=>_e,LineString:()=>pe,MultiLineString:()=>me,MultiPoint:()=>fe,MultiPolygon:()=>ge,ObjectId:()=>ve,OpeningHour:()=>ye,Point:()=>H,Polygon:()=>he,TimeInterval:()=>be,WeightUnit:()=>Ce,ZonedDateTime:()=>B}),L);function we(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}let W=class{formatBytes(e,t){let{inputUnit:n=`B`,outputUnit:r=`auto`,decimals:i=1}=t??{},a=e=>e===`B`?1:e===`KB`?1024:e===`MB`?1048576:e===`GB`?1073741824:1099511627776,o=e*a(n),s=r===`auto`?(()=>{for(let e of[`TB`,`GB`,`MB`,`KB`])if(o/a(e)>=1)return e;return`B`})():r,c=o/a(s),l=10**i;return{value:Math.round(c*l)/l,unit:s,bytes:o}}};W=we([(0,p.injectable)()],W);var Te=class{assemble(e){e.bind(A.DI.Formatter.UnitController).to(W)}};function Ee(){return[new Te]}let De=function(e){return e.Critical=`CRITICAL`,e.Serious=`SERIOUS`,e.Important=`IMPORTANT`,e.Notice=`NOTICE`,e.Routine=`ROUTINE`,e}({});function G(e,t){if(_.default.isAbsolute(t))return _.default.normalize(t);let n;try{let t=new URL(e);if(t.protocol!==`file:`)throw Error(`Unsupported URL protocol "${t.protocol}"`);n=_.default.dirname((0,ee.fileURLToPath)(t))}catch{n=e}return _.default.resolve(n,t)}function Oe(e,t={}){let n=G(process.cwd(),e);if(!v.default.existsSync(n))return;let r=v.default.statSync(n),{recursive:i=!0,force:a=!0,cleanOnly:o=!1}=t;if(o&&r.isDirectory()){for(let e of v.default.readdirSync(n))v.default.rmSync(_.default.join(n,e),{recursive:i,force:a});return}if(o&&r.isFile()){v.default.truncateSync(n,0);return}v.default.rmSync(n,{recursive:r.isDirectory()?i:!1,force:a,maxRetries:3,retryDelay:100})}function K(e){let t=G(process.cwd(),e),n=v.default.existsSync(t)&&v.default.statSync(t).isDirectory()?t:_.default.dirname(t);if(!v.default.existsSync(n))throw Error(`Directory "${n}" does not exist.`);return t}function ke(e){let t=G(process.cwd(),e);_.default.extname(e)&&console.warn(`[createDirectory] Warning: "${e}" looks like a file path.`);try{if(!v.default.existsSync(t))v.default.mkdirSync(t,{recursive:!0});else if(!v.default.statSync(t).isDirectory())throw Error(`"${t}" exists but is not a directory.`);return t}catch(e){throw Error(`Failed to create directory "${t}": ${e.message}`)}}function Ae(e,t=``){let n=G(process.cwd(),e);K(_.default.dirname(n));let r=je(n);if(!r)v.default.writeFileSync(n,t,{encoding:`utf8`,flag:`w`});else{if(!r.isFile())throw Error(`"${n}" exists but is not a file.`);t&&v.default.writeFileSync(n,t,{encoding:`utf8`,flag:`a`})}return n}function je(e){try{return v.default.statSync(e)}catch{return}}async function Me(e,t={}){let n=G(process.cwd(),e),r;try{r=await v.promises.stat(n)}catch(e){if((t.force??!0)&&e.code===`ENOENT`)return;throw e}let{recursive:i=!0,force:a=!0,cleanOnly:o=!1}=t;if(o&&r.isDirectory()){let e=await v.promises.readdir(n);for(let t of e)await v.promises.rm(_.default.join(n,t),{recursive:i,force:a});return}if(o&&r.isFile()){await v.promises.truncate(n,0);return}await v.promises.rm(n,{recursive:r.isDirectory()?i:!1,force:a,maxRetries:3,retryDelay:100})}async function q(e){let t=G(process.cwd(),e),n;try{n=await v.promises.stat(t)}catch{}let r=n?.isDirectory()?t:_.default.dirname(t);try{if(!(await v.promises.stat(r)).isDirectory())throw Error(`"${r}" exists but is not a directory.`)}catch(e){throw e.code===`ENOENT`?Error(`Directory "${r}" does not exist.`):e}return t}async function Ne(e){let t=G(process.cwd(),e);_.default.extname(e)&&console.warn(`[createDirectory] Warning: "${e}" looks like a file path (has extension).`);try{let e;try{e=await v.promises.stat(t)}catch{}if(!e)await v.promises.mkdir(t,{recursive:!0});else if(!e.isDirectory())throw Error(`"${t}" exists but is not a directory.`);return t}catch(e){throw Error(`Failed to create directory "${t}": ${e.message}`)}}async function Pe(e,t=``){let n=G(process.cwd(),e);await q(_.default.dirname(n));try{let e=await Fe(n);if(!e)await v.promises.writeFile(n,t,{encoding:`utf8`,flag:`w`});else{if(!e.isFile())throw Error(`"${n}" exists but is not a file.`);t&&await v.promises.writeFile(n,t,{encoding:`utf8`,flag:`a`})}return n}catch(e){throw Error(`Failed to create file "${n}": ${e.message}`)}}async function Fe(e){try{return await v.promises.stat(e)}catch(e){if(e.code===`ENOENT`)return;throw e}}var J=class{options;instance;constructor(e){this.options=e,this.instance=this.makeInstance()}info(e,t){this.log(`info`,e,t)}debug(e,t){this.log(`debug`,e,t)}trace(e,t){this.log(`trace`,e,t)}warn(e,t){this.log(`warn`,e,t)}error(e,t){this.log(`error`,e,t)}fatal(e,t){this.log(`fatal`,e,t)}child(e){return this.instance.child(e)}log(e,t,n){this.instance[e]({msg:t,...this.formatLogOptions(n)})}formatLogOptions(e){return e?this.normalizeObject({flag:e.flag,details:this.formatUnknown(e.details),error:this.formatUnknown(e.error),metadata:this.formatUnknown(e.metadata)}):{}}formatUnknown(e){if(ue(e)){let t={type:e.constructor.name,message:e.message};this.options.debug&&e.stack&&(t.stack=e.stack);for(let[n,r]of Object.entries(e))n in t||(t[n]=r);let n=this.normalizeObject(t);return N(n)?void 0:n}if(Buffer.isBuffer(e))return`[Buffer]`;if(e&&typeof e.pipe==`function`)return`[Stream]`;if(M(e))try{let t=JSON.stringify(e);if(t===void 0)return;let n=JSON.parse(t);if(Array.isArray(n))return n.length>0?n:void 0;if(M(n)){let e=this.normalizeObject(n);return N(e)?void 0:e}return n}catch{return{type:`NonSerializableObject`}}return P(e)?e:String(e)}normalizeObject(e){return j(Object.fromEntries(Object.entries(e)),{filterNull:!0,filterUndefined:!0,filterEmptyString:!0,filterEmptyArray:!0,filterEmptyObject:!0})}makeInstance(){if(!this.options.enabled)return(0,y.default)({enabled:!1,timestamp:!0});let e=this.options.transports,t={level:this.makeGlobalLogLevel(e),enabled:!0,timestamp:!0,transport:{targets:this.makeTransportTargets(e)}};return(0,y.default)(t)}makeTransportTargets(e){if(e.filter(e=>e.type===`console`).length>1)throw Error(`[Logger] Multiple console transports are not supported.`);return e.map(e=>{switch(e.type){case`console`:return this.makeConsoleTransportTarget(e);case`file`:return this.makeFileTransportTarget(e)}})}makeConsoleTransportTarget(e){return{target:`pino-pretty`,level:this.makeTransportLevel(e.level),options:e.pretty}}makeFileTransportTarget(e){let t=this.makeTransportLevel(e.level),n=_.default.isAbsolute(e.path)?_.default.normalize(e.path):G(process.cwd(),e.path);return K(_.default.dirname(n)),{target:`pino/file`,level:t,options:{destination:n}}}makeTransportLevel(e){return this.options.debug?`trace`:e??`info`}makeGlobalLogLevel(e){if(this.options.debug)return`trace`;let t=e.at(0);if(!t)return`info`;let n={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},r=this.makeTransportLevel(t.level);for(let t of e.slice(1)){let e=this.makeTransportLevel(t.level);n[e]<n[r]&&(r=e)}return r}},Ie=class{options;constructor(e){this.options=e}assemble(e){e.bind(A.DI.Logger).toConstantValue(new J(this.options))}};function Le(e={}){let t=e.logger??{enabled:!1};return[...Ee(),new Ie(t)]}function Y(e){return process.env[e]?.trim()||void 0}function Re(e){let t=Y(e);if(!t)throw Error(`Missing required environment variable: ${e}`);return t}const X=b.default.string().trim().min(1).transform(e=>{let{prefix:t,base:n}=Q(e),r=ze(n);return{original:e,prefix:t,base:n,kebab:Be(r),snake:Ve(r),camel:He(r),pascal:Ue(r)}}),Z=b.default.looseObject({name:X,version:b.default.string().trim().min(1),private:b.default.boolean().optional(),type:b.default.enum([`module`,`commonjs`]).optional(),dependencies:b.default.record(b.default.string(),b.default.string()).default({}),peerDependencies:b.default.record(b.default.string(),b.default.string()).default({}),devDependencies:b.default.record(b.default.string(),b.default.string()).default({})});function Q(e){let t=/^@([^/]+)\/(.+)$/.exec(e);return t&&t[2]?{prefix:t[1],base:t[2]}:{base:e}}function ze(e){let t=e.replace(/([a-z0-9])([A-Z])/g,`$1 $2`).replace(/[^a-zA-Z0-9]+/g,` `).trim().toLowerCase();return t?t.split(/\s+/):[]}function Be(e){return e.join(`-`)}function Ve(e){return e.join(`_`)}function He(e){if(e.length===0)return``;let[t,...n]=e;return t+n.map($).join(``)}function Ue(e){return e.map($).join(``)}function $(e){return e.length===0?``:e.charAt(0).toUpperCase()+e.slice(1)}function We(e){let t,n;try{t=v.default.readFileSync(e,`utf8`)}catch(t){throw Error(`Failed to read package.json at ${e}`,{cause:t})}try{n=JSON.parse(t)}catch(t){throw Error(`Failed to parse package.json at ${e}`,{cause:t})}try{return Z.parse(n)}catch(t){throw Error(`Invalid package.json at ${e}`,{cause:t})}}exports.Console=le,exports.LogFlag=De,exports.LoggerImpl=J,exports.PackageJSONSchema=Z,exports.PackageNameSchema=X,exports.coreNodeAssembly=Le,exports.createDirectory=ke,exports.createDirectoryAsync=Ne,exports.createFile=Ae,exports.createFileAsync=Pe,exports.ensureDirectory=K,exports.ensureDirectoryAsync=q,exports.loadPackageJSON=We,exports.makeDependencyBundlingPolicy=te,exports.optionalEnvironmentVariable=Y,exports.removePath=Oe,exports.removePathAsync=Me,exports.requiredEnvironmentVariable=Re,exports.resolvePath=G;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));let c=require("node:module"),l=require("consola"),u=require("consola/utils"),d=require("node:fs");d=s(d,1);let f=require("node:path");f=s(f,1);let p=require("node:url"),m=require("@dotenvx/dotenvx");m=s(m,1);let ee=require("jiti"),h=require("pino");h=s(h,1);let g=require("zod");g=s(g,1);function te(e,t={}){let n=t.includePeers??!0,r=t.includeDependencies??!0,i=t.includeSubpaths??!0,a=t.includeNodeBuiltins??!0,o=t.allowPeerBundling??!1,s=Object.keys(e.peerDependencies??{}),c=Object.keys(e.dependencies??{}),l=v(t.bundle??[]),u=v(t.external??[]);se(u,l),le(l),o||ce(s,l);let d=new Set(l.map(b)),f=n?s.filter(e=>!d.has(e)):[],p=r?c.filter(e=>!d.has(e)):[];return{external:y([...a?ne():[],..._([...f,...p,...u],i)]),bundle:y(_(l,i))}}function ne(){let e=v(c.builtinModules.map(x)),t=e.map(e=>`node:${e}`);return y([...e,...t,/^node:/])}function _(e,t){return t?e.map(e=>re(e)):[...e]}function re(e){return ae(e)?e:RegExp(`^${oe(e)}(?:/.*)?$`)}function v(e){return Array.from(new Set(e))}function y(e){let t=new Set,n=[];for(let r of e){let e=ie(r);t.has(e)||(t.add(e),n.push(r))}return n}function ie(e){return typeof e==`string`?`string:${e}`:`regexp:${e.source}/${e.flags}`}function b(e){if(e.startsWith(`@`)){let[t,n]=e.split(`/`);return t&&n?`${t}/${n}`:e}let[t]=e.split(`/`);return t??e}function x(e){return e.startsWith(`node:`)?e.slice(5):e}function ae(e){return e.includes(`*`)||e.startsWith(`^`)||e.endsWith(`$`)}function oe(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function se(e,t){let n=new Set(e.map(b)),r=t.filter(e=>n.has(b(e)));if(r.length!==0)throw Error(`Packages cannot be both external and bundled: ${r.join(`, `)}`)}function ce(e,t){let n=new Set(e),r=t.filter(e=>n.has(b(e)));if(r.length!==0)throw Error(`Peer dependencies must stay external and cannot be bundled by default: ${r.join(`, `)}`)}function le(e){let t=new Set(c.builtinModules.map(x)),n=e.filter(e=>ue(e,t));if(n.length!==0)throw Error(`Node.js built-in modules cannot be bundled: ${n.join(`, `)}`)}function ue(e,t){let n=x(e),[r]=n.split(`/`);return r?t.has(r):t.has(n)}const de=/\u001B\[[0-9;]*m/g;var fe=class{instance;constructor(e={}){this.instance=(0,l.createConsola)({level:e.enabled===!1?-999:999,formatOptions:{colors:!0,date:!1}})}title(e,t,n=[]){this.printPanel({title:`${e} ${t}`.trim(),renderedTitle:`${u.colors.cyan(u.colors.bold(e))}${t?` ${u.colors.dim(t)}`:``}`,rows:n,formatValue:u.colors.green})}panel(e,t,n){this.printPanel({title:n===void 0?e:`${e} ${n}`,renderedTitle:`${u.colors.cyan(u.colors.bold(e))}${n===void 0?``:` ${u.colors.green(String(n))}`}`,rows:t,formatValue:u.colors.dim})}step(e,t){return`${u.colors.cyan(e.padEnd(10,` `))}${t}`}duration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(2)}s`}emptyLine(){this.instance.log(``)}log(e,...t){this.instance.log(e,...t)}info(e,...t){this.instance.info(e,...t)}start(e,...t){this.instance.start(e,...t)}success(e,...t){this.instance.success(e,...t)}warn(e,...t){this.instance.warn(e,...t)}error(e,...t){this.instance.error(e,...t)}debug(e,...t){this.instance.debug(e,...t)}printPanel(e){this.instance.log(this.formatPanel(e))}formatPanel(e){let t=this.getPanelWidth(e);return[this.formatPanelTop(e.renderedTitle,t),...e.rows.map(n=>this.formatPanelRow(n,t,e.formatValue)),this.formatPanelBottom(t)].join(`
|
|
2
|
+
`)}formatPanelTop(e,t){let n=Math.max(1,t-this.visibleLength(e)-5);return`${u.colors.dim(`╭─`)} ${e} ${u.colors.dim(`─`.repeat(n))}${u.colors.dim(`╮`)}`}formatPanelBottom(e){return`${u.colors.dim(`╰`)}${u.colors.dim(`─`.repeat(e-2))}${u.colors.dim(`╯`)}`}formatPanelRow(e,t,n){let r=e.label.padEnd(14,` `),i=String(e.value),a=this.visibleLength(r)+this.visibleLength(i)+4,o=Math.max(0,t-a);return`${u.colors.dim(`│`)} ${u.colors.blue(r)}${n(i)}${` `.repeat(o)} ${u.colors.dim(`│`)}`}getPanelWidth(e){return Math.max(48,this.getTitleWidth(e),this.getRowsWidth(e.rows))}getTitleWidth(e){return this.visibleLength(e.title)+6}getRowsWidth(e){return Math.max(0,...e.map(e=>this.getRowWidth(e)))}getRowWidth(e){return 14+this.visibleLength(String(e.value))+4}visibleLength(e){return e.replace(de,``).length}};function S(e,t){if(f.default.isAbsolute(t))return f.default.normalize(t);let n;try{let t=new URL(e);if(t.protocol!==`file:`)throw Error(`Unsupported URL protocol "${t.protocol}"`);n=f.default.dirname((0,p.fileURLToPath)(t))}catch{n=e}return f.default.resolve(n,t)}function pe(e,t={}){let n=S(process.cwd(),e);if(!d.default.existsSync(n))return;let r=d.default.statSync(n),{recursive:i=!0,force:a=!0,cleanOnly:o=!1}=t;if(o&&r.isDirectory()){for(let e of d.default.readdirSync(n))d.default.rmSync(f.default.join(n,e),{recursive:i,force:a});return}if(o&&r.isFile()){d.default.truncateSync(n,0);return}d.default.rmSync(n,{recursive:r.isDirectory()?i:!1,force:a,maxRetries:3,retryDelay:100})}function C(e){let t=S(process.cwd(),e),n=d.default.existsSync(t)&&d.default.statSync(t).isDirectory()?t:f.default.dirname(t);if(!d.default.existsSync(n))throw Error(`Directory "${n}" does not exist.`);return t}function me(e){let t=S(process.cwd(),e);f.default.extname(e)&&console.warn(`[createDirectory] Warning: "${e}" looks like a file path.`);try{if(!d.default.existsSync(t))d.default.mkdirSync(t,{recursive:!0});else if(!d.default.statSync(t).isDirectory())throw Error(`"${t}" exists but is not a directory.`);return t}catch(e){throw Error(`Failed to create directory "${t}": ${e.message}`)}}function he(e,t=``){let n=S(process.cwd(),e);C(f.default.dirname(n));let r=ge(n);if(!r)d.default.writeFileSync(n,t,{encoding:`utf8`,flag:`w`});else{if(!r.isFile())throw Error(`"${n}" exists but is not a file.`);t&&d.default.writeFileSync(n,t,{encoding:`utf8`,flag:`a`})}return n}function ge(e){try{return d.default.statSync(e)}catch{return}}async function _e(e,t={}){let n=S(process.cwd(),e),r;try{r=await d.promises.stat(n)}catch(e){if((t.force??!0)&&e.code===`ENOENT`)return;throw e}let{recursive:i=!0,force:a=!0,cleanOnly:o=!1}=t;if(o&&r.isDirectory()){let e=await d.promises.readdir(n);for(let t of e)await d.promises.rm(f.default.join(n,t),{recursive:i,force:a});return}if(o&&r.isFile()){await d.promises.truncate(n,0);return}await d.promises.rm(n,{recursive:r.isDirectory()?i:!1,force:a,maxRetries:3,retryDelay:100})}async function w(e){let t=S(process.cwd(),e),n;try{n=await d.promises.stat(t)}catch{}let r=n?.isDirectory()?t:f.default.dirname(t);try{if(!(await d.promises.stat(r)).isDirectory())throw Error(`"${r}" exists but is not a directory.`)}catch(e){throw e.code===`ENOENT`?Error(`Directory "${r}" does not exist.`):e}return t}async function ve(e){let t=S(process.cwd(),e);f.default.extname(e)&&console.warn(`[createDirectory] Warning: "${e}" looks like a file path (has extension).`);try{let e;try{e=await d.promises.stat(t)}catch{}if(!e)await d.promises.mkdir(t,{recursive:!0});else if(!e.isDirectory())throw Error(`"${t}" exists but is not a directory.`);return t}catch(e){throw Error(`Failed to create directory "${t}": ${e.message}`)}}async function ye(e,t=``){let n=S(process.cwd(),e);await w(f.default.dirname(n));try{let e=await be(n);if(!e)await d.promises.writeFile(n,t,{encoding:`utf8`,flag:`w`});else{if(!e.isFile())throw Error(`"${n}" exists but is not a file.`);t&&await d.promises.writeFile(n,t,{encoding:`utf8`,flag:`a`})}return n}catch(e){throw Error(`Failed to create file "${n}": ${e.message}`)}}async function be(e){try{return await d.promises.stat(e)}catch(e){if(e.code===`ENOENT`)return;throw e}}function T(e){if(!D(e))throw Error(`Environment registry must be an object.`);let t=Object.entries(e);if(!t.length)throw Error(`At least one environment must be defined.`);for(let[e,n]of t)xe(e,n);return e}function E(e,t,n={}){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`Environment "${t}" is not defined.`);let r=e[t];if(!r)throw Error(`Environment "${t}" is not defined.`);let i=S(n.baseDir?.trim()||process.cwd(),r.fileDir?.trim()||`.`);return{name:t,file:r.file?.trim()||void 0,fileDir:i}}function xe(e,t){if(!e.trim())throw Error(`Environment name must not be empty.`);if(!D(t))throw Error(`Environment definition must be an object for "${e}".`);if(t.file!==void 0&&(typeof t.file!=`string`||!t.file.trim()))throw Error(`Environment file must not be empty for "${e}".`);if(t.fileDir!==void 0&&(typeof t.fileDir!=`string`||!t.fileDir.trim()))throw Error(`Environment file directory must not be empty for "${e}".`)}function D(e){if(!e||typeof e!=`object`)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}const O=Symbol.for(`buildplease.environment-configuration.field`),k=Symbol.for(`buildplease.environment-configuration.contract`),A=Symbol.for(`buildplease.environment-configuration.binding`),j=Symbol.for(`buildplease.environment-configuration.config`),Se={string(){return F((e,t)=>{if(typeof e!=`string`)throw Error(`${t} must be string.`);let n=e.trim();if(!n)throw Error(`${t} must not be empty.`);return n},{required:!0})},number(){return F((e,t)=>{let n=typeof e==`number`?e:Number(e);if(!Number.isFinite(n))throw Error(`${t} must be number.`);return n},{required:!0})},boolean(){return F((e,t)=>{if(typeof e==`boolean`)return e;if(typeof e==`string`){let t=e.trim().toLowerCase();if(t===`true`)return!0;if(t===`false`)return!1}throw Error(`${t} must be boolean.`)},{required:!0})},array(e){return F((t,n)=>{if(!Array.isArray(t))throw Error(`${n} must be array.`);return t.map((t,r)=>e.parse(t,`${n}[${r}]`))},{required:!0})},custom(){return F(e=>e,{required:!0})}};function Ce(e,t){let n=e.trim();if(!n)throw Error(`Configuration key must not be empty.`);let r=(e=>{let t={contract:r,input:e};return Object.defineProperty(t,A,{value:!0}),t});return Object.defineProperties(r,{[k]:{value:!0},key:{value:n},schema:{value:t}}),r}function we(e,t){let n={environments:T(e),input:t};return Object.defineProperty(n,j,{value:!0}),n}function M(e){return!!(e&&typeof e==`object`&&e[j]===!0)}function N(e){return!!(e&&typeof e==`object`&&e[O]===!0)}function Te(e){return typeof e==`function`&&e[k]===!0}function P(e){return!!(e&&typeof e==`object`&&e[A]===!0)}function F(e,t){let n={required:t.required,hasDefault:t.hasDefault??!1,defaultValue:t.defaultValue,parse:e,optional(){return F((t,n)=>{if(t!=null)return e(t,n)},{required:!1})},default(t){return F(e,{required:!1,hasDefault:!0,defaultValue:t})},map(n){let r=t.hasDefault&&t.defaultValue!==void 0?n(t.defaultValue):void 0;return F((t,r)=>n(e(t,r)),{required:t.required,hasDefault:t.hasDefault,defaultValue:r})}};return Object.defineProperty(n,O,{value:!0}),n}function I(e){return process.env[e]?.trim()||void 0}function Ee(){let e=I(`BUILDPLEASE_ENVIRONMENT`);if(!e)throw Error(`BuildPlease environment is not selected.`);return e}const L=Symbol.for(`buildplease.environment-configuration.source`);function De(e){return{env(e){return z(`env`,{name:e})},byEnvironment(e){return z(`by-environment`,{cases:e})},compute(e){return z(`compute`,{compute:e})},static(e){return z(`static`,{value:e})}}}function R(e){return!!(e&&typeof e==`object`&&e[L]===!0)}function z(e,t,n=[]){let r={kind:e,options:t,transforms:n,default(e){return z(`default`,{source:r,value:e})},map(r){return z(e,t,[...n,r])}};return Object.defineProperty(r,L,{value:!0}),r}async function Oe(e={}){return H(e)}async function ke(e={}){let t=Ee(),n=await H(e);try{let e=E(n.config.environments,t,{baseDir:(0,f.dirname)(n.configFilePath)});return Ne(e),{...n,environment:e}}catch(e){throw U(e)}}async function Ae(e,t){let n=q(t,`config`);return G(e.input,n,`config`)}async function B(e,t,n={}){let r=Pe(n);return W(e.schema,t,r,e.key)}async function V(e,t={}){return B(e.contract,e.input,t)}async function H(e){let t=je(e.dir);try{let e=S(t,`environment.config.ts`);if(!d.default.existsSync(e))throw Error(`Config file "${e}" does not exist.`);let n=await Me(t,e);if(!M(n))throw Error(`Environment config must be defined with defineConfig() (${e}).`);return{config:n,configFilePath:e,rootDir:t}}catch(e){throw U(e)}}function je(e){let t=e?S(process.cwd(),e):process.cwd();return C(t),t}async function Me(e,t){return(0,ee.createJiti)(e,{interopDefault:!0,extensions:[`.ts`],tsconfigPaths:!0}).import(t,{default:!0})}function Ne(e){if(!e.file)return;let t=S(e.fileDir,e.file);d.default.existsSync(t)&&m.default.config({path:t,overload:!1,quiet:!0})}function U(e){return Error(`Failed to load environment config: ${e instanceof Error?e.message:String(e)}`,{cause:e})}function Pe(e){return{buildMetadata:e.buildMetadata,environment:e.environment}}async function W(e,t,n,r){if(N(e))return Fe(e,t,n,r);let i=await G(t,n,r)??{};if(!Y(i))throw Error(`${r} must be object.`);let a={};for(let[t,o]of Object.entries(e))a[t]=await W(o,i[t],n,`${r}.${t}`);return a}async function Fe(e,t,n,r){let i=await G(t,n,r);if(i==null){if(e.hasDefault)return J(e.defaultValue);if(!e.required)return;throw Error(`Missing required configuration: ${r}`)}return e.parse(i,r)}async function G(e,t,n){if(R(e))return K(e,t,n);if(P(e))return V(e,t);if(Array.isArray(e))return Promise.all(e.map((e,r)=>G(e,t,`${n}[${r}]`)));if(Y(e)){let r={};for(let[i,a]of Object.entries(e))r[i]=await G(a,t,`${n}.${i}`);return r}return e}async function K(e,t,n){let r;switch(e.kind){case`env`:{let{name:t}=e.options;r=I(t);break}case`by-environment`:{let i=Ie(t,n),{cases:a}=e.options;if(!Object.prototype.hasOwnProperty.call(a,i.name))throw Error(`${n} has no value for environment "${i.name}".`);r=await G(a[i.name],t,n);break}case`compute`:{let i=q(t,n),{compute:a}=e.options;r=await a(i);break}case`static`:{let{value:t}=e.options;r=t;break}case`default`:{let{source:i,value:a}=e.options;r=await K(i,t,n)??J(a);break}}for(let t of e.transforms)r=await t(r);return r}function Ie(e,t){if(!e?.environment)throw Error(`${t} requires runtime environment.`);return e.environment}function q(e,t){if(!e?.environment)throw Error(`${t} requires runtime environment.`);if(!e.buildMetadata)throw Error(`${t} requires build metadata.`);return e}function J(e){if(Array.isArray(e))return e.map(e=>J(e));if(Y(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=J(r);return t}return e}function Y(e){if(!e||typeof e!=`object`||Object.prototype.toString.call(e)!==`[object Object]`)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}let Le=function(e){return e.Critical=`CRITICAL`,e.Serious=`SERIOUS`,e.Important=`IMPORTANT`,e.Notice=`NOTICE`,e.Routine=`ROUTINE`,e}({});function Re(e){return e instanceof Error}function ze(e,t={}){if(e==null)return{};let{filterNull:n=!0,filterUndefined:r=!0,filterEmptyString:i=!1,filterEmptyObject:a=!1,filterEmptyArray:o=!1}=t;return Object.keys(e).reduce((s,c)=>{let l=e[c];return X(l)&&Object.getPrototypeOf(l)===null&&(l=void 0),Be(l)&&(l=ze(l,t)),n&&l===null||r&&l===void 0||i&&l===``||a&&Z(l)||o&&Array.isArray(l)&&l.length===0||(s[c]=l),s},{})}function X(e){return typeof e==`object`&&!!e}function Z(e){return X(e)&&Object.keys(e).length===0}function Be(e){return X(e)&&Object.getPrototypeOf(e)===Object.prototype}function Ve(e){return e==null||[`string`,`number`,`boolean`,`bigint`,`symbol`].includes(typeof e)}Array.prototype.isEmpty=function(){return this==null||this.length===0},String.prototype.capitalized=function(){let e=this==null?``:this.toString();return e.trim()?e.charAt(0).toUpperCase()+e.slice(1):``};var He=class{options;instance;constructor(e){this.options=e,this.instance=this.makeInstance()}info(e,t){this.log(`info`,e,t)}debug(e,t){this.log(`debug`,e,t)}trace(e,t){this.log(`trace`,e,t)}warn(e,t){this.log(`warn`,e,t)}error(e,t){this.log(`error`,e,t)}fatal(e,t){this.log(`fatal`,e,t)}child(e){return this.instance.child(e)}log(e,t,n){this.instance[e]({msg:t,...this.formatLogOptions(n)})}formatLogOptions(e){return e?this.normalizeObject({flag:e.flag,details:this.formatUnknown(e.details),error:this.formatUnknown(e.error),metadata:this.formatUnknown(e.metadata)}):{}}formatUnknown(e){if(Re(e)){let t={type:e.constructor.name,message:e.message};this.options.debug&&e.stack&&(t.stack=e.stack);for(let[n,r]of Object.entries(e))n in t||(t[n]=r);let n=this.normalizeObject(t);return Z(n)?void 0:n}if(Buffer.isBuffer(e))return`[Buffer]`;if(e&&typeof e.pipe==`function`)return`[Stream]`;if(X(e))try{let t=JSON.stringify(e);if(t===void 0)return;let n=JSON.parse(t);if(Array.isArray(n))return n.length>0?n:void 0;if(X(n)){let e=this.normalizeObject(n);return Z(e)?void 0:e}return n}catch{return{type:`NonSerializableObject`}}return Ve(e)?e:String(e)}normalizeObject(e){return ze(Object.fromEntries(Object.entries(e)),{filterNull:!0,filterUndefined:!0,filterEmptyString:!0,filterEmptyArray:!0,filterEmptyObject:!0})}makeInstance(){if(!this.options.enabled)return(0,h.default)({enabled:!1,timestamp:!0});let e=this.options.transports,t={level:this.makeGlobalLogLevel(e),enabled:!0,timestamp:!0,transport:{targets:this.makeTransportTargets(e)}};return(0,h.default)(t)}makeTransportTargets(e){if(e.filter(e=>e.type===`console`).length>1)throw Error(`[Logger] Multiple console transports are not supported.`);return e.map(e=>{switch(e.type){case`console`:return this.makeConsoleTransportTarget(e);case`file`:return this.makeFileTransportTarget(e)}})}makeConsoleTransportTarget(e){return{target:`pino-pretty`,level:this.makeTransportLevel(e.level),options:e.pretty}}makeFileTransportTarget(e){let t=this.makeTransportLevel(e.level),n=f.default.isAbsolute(e.path)?f.default.normalize(e.path):S(process.cwd(),e.path);return C(f.default.dirname(n)),{target:`pino/file`,level:t,options:{destination:n}}}makeTransportLevel(e){return this.options.debug?`trace`:e??`info`}makeGlobalLogLevel(e){if(this.options.debug)return`trace`;let t=e.at(0);if(!t)return`info`;let n={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},r=this.makeTransportLevel(t.level);for(let t of e.slice(1)){let e=this.makeTransportLevel(t.level);n[e]<n[r]&&(r=e)}return r}};const Q=g.default.string().trim().min(1).transform(e=>{let{prefix:t,base:n}=We(e),r=Ge(n);return{original:e,prefix:t,base:n,kebab:Ke(r),snake:qe(r),camel:Je(r),pascal:Ye(r)}}),Ue=g.default.looseObject({name:Q,version:g.default.string().trim().min(1),private:g.default.boolean().optional(),type:g.default.enum([`module`,`commonjs`]).optional(),dependencies:g.default.record(g.default.string(),g.default.string()).default({}),peerDependencies:g.default.record(g.default.string(),g.default.string()).default({}),devDependencies:g.default.record(g.default.string(),g.default.string()).default({})});function We(e){let t=/^@([^/]+)\/(.+)$/.exec(e);return t&&t[2]?{prefix:t[1],base:t[2]}:{base:e}}function Ge(e){let t=e.replace(/([a-z0-9])([A-Z])/g,`$1 $2`).replace(/[^a-zA-Z0-9]+/g,` `).trim().toLowerCase();return t?t.split(/\s+/):[]}function Ke(e){return e.join(`-`)}function qe(e){return e.join(`_`)}function Je(e){if(e.length===0)return``;let[t,...n]=e;return t+n.map($).join(``)}function Ye(e){return e.map($).join(``)}function $(e){return e.length===0?``:e.charAt(0).toUpperCase()+e.slice(1)}function Xe(e){let t,n;try{t=d.default.readFileSync(e,`utf8`)}catch(t){throw Error(`Failed to read package.json at ${e}`,{cause:t})}try{n=JSON.parse(t)}catch(t){throw Error(`Failed to parse package.json at ${e}`,{cause:t})}try{return Ue.parse(n)}catch(t){throw Error(`Invalid package.json at ${e}`,{cause:t})}}exports.Console=fe,exports.LogFlag=Le,exports.LoggerImpl=He,exports.PackageJSONSchema=Ue,exports.PackageNameSchema=Q,exports.createDirectory=me,exports.createDirectoryAsync=ve,exports.createFile=he,exports.createFileAsync=ye,exports.defineConfig=we,exports.defineConfiguration=Ce,exports.defineEnvironments=T,exports.defineSource=De,exports.ensureDirectory=C,exports.ensureDirectoryAsync=w,exports.field=Se,exports.isConfigDefinition=M,exports.isConfigurationBinding=P,exports.isConfigurationContract=Te,exports.isConfigurationField=N,exports.isConfigurationSource=R,exports.loadEnvironmentConfig=Oe,exports.loadPackageJSON=Xe,exports.loadSelectedEnvironmentConfig=ke,exports.makeDependencyBundlingPolicy=te,exports.removePath=pe,exports.removePathAsync=_e,exports.resolveConfig=Ae,exports.resolveConfiguration=B,exports.resolveConfigurationBinding=V,exports.resolveEnvironment=E,exports.resolvePath=S;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Bindings, Level, Logger as Logger$1 } from "pino";
|
|
2
2
|
import { PrettyOptions } from "pino-pretty";
|
|
3
|
-
import { Container } from "inversify";
|
|
4
3
|
import z from "zod";
|
|
5
4
|
//#region src-node/bundling/dependency-bundling-policy.d.ts
|
|
6
5
|
/**
|
|
@@ -195,96 +194,144 @@ declare class Console {
|
|
|
195
194
|
private visibleLength;
|
|
196
195
|
}
|
|
197
196
|
//#endregion
|
|
198
|
-
//#region src-node/
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
197
|
+
//#region src-node/environment-configuration/environment.d.ts
|
|
198
|
+
interface EnvironmentDefinition {
|
|
199
|
+
/**
|
|
200
|
+
* Optional dotenv file associated with this environment.
|
|
201
|
+
*
|
|
202
|
+
* When the environment is selected, BuildPlease loads this file if it exists.
|
|
203
|
+
* Missing files are ignored, values already present in `process.env` keep
|
|
204
|
+
* priority. Configuration resolution and defaults decide how missing values are handled.
|
|
205
|
+
*/
|
|
206
|
+
readonly file?: string;
|
|
207
|
+
/** Directory containing `file`, resolved relative to `environment.config.ts`. */
|
|
208
|
+
readonly fileDir?: string;
|
|
205
209
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
readonly
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
interface EnvironmentConfig<Name extends string = string> {
|
|
211
|
+
readonly name: Name;
|
|
212
|
+
readonly file?: string;
|
|
213
|
+
readonly fileDir: string;
|
|
214
|
+
}
|
|
215
|
+
type EnvironmentRegistry = Record<string, EnvironmentDefinition>;
|
|
216
|
+
type EnvironmentName<Environments extends EnvironmentRegistry> = keyof Environments & string;
|
|
217
|
+
type EnvironmentConfigFromRegistry<Environments extends EnvironmentRegistry> = EnvironmentConfig<EnvironmentName<Environments>>;
|
|
218
|
+
interface ResolveEnvironmentOptions {
|
|
219
|
+
readonly baseDir?: string;
|
|
213
220
|
}
|
|
221
|
+
declare function defineEnvironments<const Environments extends EnvironmentRegistry>(environments: Environments): Environments;
|
|
222
|
+
declare function resolveEnvironment<Environments extends EnvironmentRegistry>(environments: Environments, name: string, options?: ResolveEnvironmentOptions): EnvironmentConfigFromRegistry<Environments>;
|
|
214
223
|
//#endregion
|
|
215
|
-
//#region src-node/
|
|
216
|
-
interface
|
|
217
|
-
readonly
|
|
224
|
+
//#region src-node/build-metadata.d.ts
|
|
225
|
+
interface BuildMetadata {
|
|
226
|
+
readonly name: {
|
|
227
|
+
readonly original: string;
|
|
228
|
+
readonly base: string;
|
|
229
|
+
};
|
|
230
|
+
readonly version: string;
|
|
231
|
+
readonly id: string;
|
|
232
|
+
readonly createdAt: string;
|
|
218
233
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
234
|
+
//#endregion
|
|
235
|
+
//#region src-node/environment-configuration/source.d.ts
|
|
236
|
+
type ConfigurationSourceKind = 'env' | 'by-environment' | 'compute' | 'static' | 'default';
|
|
237
|
+
interface ConfigurationResolveContext<EnvironmentName extends string = string> {
|
|
238
|
+
readonly environment: EnvironmentConfig<EnvironmentName>;
|
|
239
|
+
readonly buildMetadata: BuildMetadata;
|
|
223
240
|
}
|
|
224
|
-
interface
|
|
225
|
-
readonly
|
|
226
|
-
readonly
|
|
241
|
+
interface ConfigurationSource<Output = unknown> {
|
|
242
|
+
readonly kind: ConfigurationSourceKind;
|
|
243
|
+
readonly options: unknown;
|
|
244
|
+
readonly transforms: readonly ConfigurationSourceTransform[];
|
|
245
|
+
default<Default>(value: Default): ConfigurationSource<Exclude<Output, null | undefined> | Default>;
|
|
246
|
+
map<NextOutput>(transform: (value: Output) => NextOutput | Promise<NextOutput>): ConfigurationSource<NextOutput>;
|
|
227
247
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
readonly
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
} | {
|
|
234
|
-
readonly enabled: true;
|
|
235
|
-
readonly debug?: boolean;
|
|
236
|
-
readonly transports: readonly [LoggerTransportOptions, ...LoggerTransportOptions[]];
|
|
248
|
+
declare function defineSource<const Environments extends EnvironmentRegistry>(_environments: Environments): {
|
|
249
|
+
env(name: string): ConfigurationSource<string | undefined>;
|
|
250
|
+
byEnvironment<const Cases extends { readonly [Key in keyof Environments & string]: unknown; }>(cases: Cases): ConfigurationSource<InferSourceOutput<Cases[keyof Environments & string]>>;
|
|
251
|
+
compute<Output>(compute: (context: ConfigurationResolveContext<keyof Environments & string>) => Output | Promise<Output>): ConfigurationSource<Output>;
|
|
252
|
+
static<Output>(value: Output): ConfigurationSource<Output>;
|
|
237
253
|
};
|
|
254
|
+
declare function isConfigurationSource(input: unknown): input is ConfigurationSource;
|
|
255
|
+
type ConfigurationSourceTransform = (value: unknown) => unknown | Promise<unknown>;
|
|
256
|
+
type InferSourceOutput<T> = T extends ConfigurationSource<infer Output> ? Output : T extends ((...args: any[]) => any) ? T : T extends readonly [unknown, ...unknown[]] ? { readonly [Key in keyof T]: InferSourceOutput<T[Key]>; } : T extends readonly (infer Item)[] ? readonly InferSourceOutput<Item>[] : T extends object ? { readonly [Key in keyof T]: InferSourceOutput<T[Key]>; } : T;
|
|
238
257
|
//#endregion
|
|
239
|
-
//#region src-node/
|
|
240
|
-
interface
|
|
241
|
-
readonly
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
child(bindings: Bindings): Logger$1;
|
|
258
|
+
//#region src-node/environment-configuration/configuration.d.ts
|
|
259
|
+
interface ConfigurationField<Output, Required extends boolean = true, Input = Output> {
|
|
260
|
+
readonly required: Required;
|
|
261
|
+
readonly hasDefault: boolean;
|
|
262
|
+
readonly defaultValue?: Output;
|
|
263
|
+
parse(value: unknown, path: string): Output;
|
|
264
|
+
optional(): ConfigurationField<Output | undefined, false, Input | undefined | null>;
|
|
265
|
+
default(value: Output): ConfigurationField<Output, false, Input>;
|
|
266
|
+
map<NextOutput>(transform: (value: Output) => NextOutput): ConfigurationField<NextOutput, Required, Input>;
|
|
249
267
|
}
|
|
250
|
-
declare
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
private makeFileTransportTarget;
|
|
269
|
-
private makeTransportLevel;
|
|
270
|
-
private makeGlobalLogLevel;
|
|
268
|
+
declare const field: {
|
|
269
|
+
string(): ConfigurationField<string, true, string>;
|
|
270
|
+
number(): ConfigurationField<number, true, string | number>;
|
|
271
|
+
boolean(): ConfigurationField<boolean, true, string | boolean>;
|
|
272
|
+
array<Item, ItemInput>(item: ConfigurationField<Item, boolean, ItemInput>): ConfigurationField<readonly Item[], true, readonly ItemInput[]>;
|
|
273
|
+
custom<T>(): ConfigurationField<T, true, T>;
|
|
274
|
+
};
|
|
275
|
+
type ConfigurationSchema = ConfigurationField<any, boolean, any> | {
|
|
276
|
+
readonly [key: string]: ConfigurationSchema;
|
|
277
|
+
};
|
|
278
|
+
type InferSchemaOutput<Schema> = Schema extends ConfigurationField<infer Output, any, any> ? Output : Schema extends object ? { readonly [Key in keyof Schema]: InferSchemaOutput<Schema[Key]>; } : never;
|
|
279
|
+
type InferSchemaInput<Schema> = Schema extends ConfigurationField<any, any, infer Input> ? Input : Schema extends object ? { readonly [Key in RequiredSchemaKeys<Schema>]: InferSchemaInput<Schema[Key]>; } & { readonly [Key in OptionalSchemaKeys<Schema>]?: InferSchemaInput<Schema[Key]>; } : never;
|
|
280
|
+
type ConfigurationValueInput<T> = ConfigurationSource<T | undefined> | (T extends unknown ? ConfigurationValueInputValue<T> : never);
|
|
281
|
+
type ConfigurationInputFromSchema<Schema> = ConfigurationSource<InferSchemaInput<Schema> | undefined> | (Schema extends ConfigurationField<any, any, infer Input> ? ConfigurationValueInput<Input> : Schema extends object ? { readonly [Key in RequiredSchemaKeys<Schema>]: ConfigurationInputFromSchema<Schema[Key]>; } & { readonly [Key in OptionalSchemaKeys<Schema>]?: ConfigurationInputFromSchema<Schema[Key]>; } : never);
|
|
282
|
+
interface ConfigurationContract<Output, Schema extends ConfigurationSchema = ConfigurationSchema> {
|
|
283
|
+
readonly key: string;
|
|
284
|
+
readonly schema: Schema;
|
|
285
|
+
(input: ConfigurationInputFromSchema<Schema>): ConfigurationBinding<Output, Schema>;
|
|
271
286
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
interface Assembly {
|
|
276
|
-
assemble(container: AssemblyContainer): void;
|
|
287
|
+
interface ConfigurationBinding<Output = unknown, Schema extends ConfigurationSchema = ConfigurationSchema> {
|
|
288
|
+
readonly contract: ConfigurationContract<Output, Schema>;
|
|
289
|
+
readonly input: ConfigurationInputFromSchema<Schema>;
|
|
277
290
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
interface
|
|
281
|
-
readonly
|
|
291
|
+
type InferConfiguration<Contract> = Contract extends ConfigurationContract<infer Output, any> ? Output : never;
|
|
292
|
+
declare function defineConfiguration<const Schema extends ConfigurationSchema>(key: string, schema: Schema): ConfigurationContract<InferSchemaOutput<Schema>, Schema>;
|
|
293
|
+
interface ConfigDefinition<Environments extends EnvironmentRegistry = EnvironmentRegistry, Input = unknown> {
|
|
294
|
+
readonly environments: Environments;
|
|
295
|
+
readonly input: Input;
|
|
282
296
|
}
|
|
283
|
-
|
|
297
|
+
type InferConfig<Config> = Config extends ConfigDefinition<any, infer Input> ? InferConfigValue<Input> : never;
|
|
298
|
+
type InferConfigValue<Input> = Input extends ConfigurationSource<infer Output> ? Output : Input extends ConfigurationBinding<infer Output> ? Output : Input extends ((...args: any[]) => any) ? Input : Input extends readonly [unknown, ...unknown[]] ? { readonly [Key in keyof Input]: InferConfigValue<Input[Key]>; } : Input extends readonly (infer Item)[] ? readonly InferConfigValue<Item>[] : Input extends object ? { readonly [Key in keyof Input]: InferConfigValue<Input[Key]>; } : Input;
|
|
299
|
+
declare function defineConfig<const Environments extends EnvironmentRegistry, const Input>(environments: Environments, input: Input): ConfigDefinition<Environments, Input>;
|
|
300
|
+
declare function isConfigDefinition(input: unknown): input is ConfigDefinition;
|
|
301
|
+
declare function isConfigurationField(input: unknown): input is ConfigurationField<unknown, boolean, unknown>;
|
|
302
|
+
declare function isConfigurationContract(input: unknown): input is ConfigurationContract<unknown>;
|
|
303
|
+
declare function isConfigurationBinding(input: unknown): input is ConfigurationBinding;
|
|
304
|
+
type ConfigurationValueInputValue<T> = T extends ((...args: any[]) => any) ? T : T extends readonly [unknown, ...unknown[]] ? { readonly [Key in keyof T]: ConfigurationValueInput<T[Key]>; } : T extends readonly (infer Item)[] ? readonly ConfigurationValueInput<Item>[] : T extends object ? { readonly [Key in keyof T]: ConfigurationValueInput<T[Key]>; } : T;
|
|
305
|
+
type IsSchemaInputRequired<Schema> = Schema extends ConfigurationField<any, infer Required, any> ? Required : Schema extends object ? RequiredSchemaKeys<Schema> extends never ? false : true : true;
|
|
306
|
+
type RequiredSchemaKeys<Schema extends object> = { [Key in keyof Schema]-?: IsSchemaInputRequired<Schema[Key]> extends true ? Key : never; }[keyof Schema];
|
|
307
|
+
type OptionalSchemaKeys<Schema extends object> = { [Key in keyof Schema]-?: IsSchemaInputRequired<Schema[Key]> extends true ? never : Key; }[keyof Schema];
|
|
284
308
|
//#endregion
|
|
285
|
-
//#region src-node/environment/
|
|
286
|
-
|
|
287
|
-
|
|
309
|
+
//#region src-node/environment-configuration/engine.d.ts
|
|
310
|
+
interface LoadEnvironmentConfigOptions {
|
|
311
|
+
readonly dir?: string;
|
|
312
|
+
}
|
|
313
|
+
interface LoadedConfig<Config extends ConfigDefinition = ConfigDefinition> {
|
|
314
|
+
readonly config: Config;
|
|
315
|
+
readonly configFilePath: string;
|
|
316
|
+
readonly rootDir: string;
|
|
317
|
+
}
|
|
318
|
+
interface LoadedEnvironmentConfig<Config extends ConfigDefinition = ConfigDefinition> extends LoadedConfig<Config> {
|
|
319
|
+
readonly environment: EnvironmentConfigFromRegistry<Config['environments']>;
|
|
320
|
+
}
|
|
321
|
+
/** Load the conventional environment.config.ts definition without selecting an environment. */
|
|
322
|
+
declare function loadEnvironmentConfig<Config extends ConfigDefinition = ConfigDefinition>(options?: LoadEnvironmentConfigOptions): Promise<LoadedConfig<Config>>;
|
|
323
|
+
/**
|
|
324
|
+
* Load environment.config.ts and resolve the environment selected for the
|
|
325
|
+
* current BuildPlease process tree.
|
|
326
|
+
*/
|
|
327
|
+
declare function loadSelectedEnvironmentConfig<Config extends ConfigDefinition = ConfigDefinition>(options?: LoadEnvironmentConfigOptions): Promise<LoadedEnvironmentConfig<Config>>;
|
|
328
|
+
interface ResolveConfigurationOptions {
|
|
329
|
+
readonly buildMetadata?: BuildMetadata;
|
|
330
|
+
readonly environment?: EnvironmentConfig;
|
|
331
|
+
}
|
|
332
|
+
declare function resolveConfig<Config extends ConfigDefinition<any>>(config: Config, context: ConfigurationResolveContext<keyof Config['environments'] & string>): Promise<InferConfig<Config>>;
|
|
333
|
+
declare function resolveConfiguration<Output, Schema extends ConfigurationSchema>(contract: ConfigurationContract<Output, Schema>, input: ConfigurationInputFromSchema<Schema> | undefined, options?: ResolveConfigurationOptions): Promise<Output>;
|
|
334
|
+
declare function resolveConfigurationBinding<Output>(binding: ConfigurationBinding<Output>, options?: ResolveConfigurationOptions): Promise<Output>;
|
|
288
335
|
//#endregion
|
|
289
336
|
//#region src-node/file/file-sync.d.ts
|
|
290
337
|
/**
|
|
@@ -408,6 +455,81 @@ declare function createDirectoryAsync(dirPath: string): Promise<string>;
|
|
|
408
455
|
*/
|
|
409
456
|
declare function createFileAsync(filePath: string, content?: string): Promise<string>;
|
|
410
457
|
//#endregion
|
|
458
|
+
//#region src-node/logger/log-flag.d.ts
|
|
459
|
+
declare enum LogFlag {
|
|
460
|
+
Critical = "CRITICAL",
|
|
461
|
+
Serious = "SERIOUS",
|
|
462
|
+
Important = "IMPORTANT",
|
|
463
|
+
Notice = "NOTICE",
|
|
464
|
+
Routine = "ROUTINE"
|
|
465
|
+
}
|
|
466
|
+
//#endregion
|
|
467
|
+
//#region src-node/logger/log-options.d.ts
|
|
468
|
+
interface LogOptions {
|
|
469
|
+
readonly flag?: LogFlag;
|
|
470
|
+
readonly details?: unknown;
|
|
471
|
+
readonly error?: unknown;
|
|
472
|
+
readonly metadata?: unknown;
|
|
473
|
+
}
|
|
474
|
+
//#endregion
|
|
475
|
+
//#region src-node/logger/logger-options.d.ts
|
|
476
|
+
interface BaseLoggerTransportOptions {
|
|
477
|
+
readonly level?: Level;
|
|
478
|
+
}
|
|
479
|
+
interface LoggerConsoleTransportOptions extends BaseLoggerTransportOptions {
|
|
480
|
+
readonly type: 'console';
|
|
481
|
+
readonly target: 'pino-pretty';
|
|
482
|
+
readonly pretty?: PrettyOptions;
|
|
483
|
+
}
|
|
484
|
+
interface LoggerFileTransportOptions extends BaseLoggerTransportOptions {
|
|
485
|
+
readonly type: 'file';
|
|
486
|
+
readonly path: string;
|
|
487
|
+
}
|
|
488
|
+
type LoggerTransportOptions = LoggerConsoleTransportOptions | LoggerFileTransportOptions;
|
|
489
|
+
type LoggerOptions = {
|
|
490
|
+
readonly enabled: false;
|
|
491
|
+
readonly debug?: boolean;
|
|
492
|
+
readonly transports?: never;
|
|
493
|
+
} | {
|
|
494
|
+
readonly enabled: true;
|
|
495
|
+
readonly debug?: boolean;
|
|
496
|
+
readonly transports: readonly [LoggerTransportOptions, ...LoggerTransportOptions[]];
|
|
497
|
+
};
|
|
498
|
+
//#endregion
|
|
499
|
+
//#region src-node/logger/logger.d.ts
|
|
500
|
+
interface Logger {
|
|
501
|
+
readonly instance: Logger$1;
|
|
502
|
+
info(title: string, options?: LogOptions): void;
|
|
503
|
+
debug(title: string, options?: LogOptions): void;
|
|
504
|
+
trace(title: string, options?: LogOptions): void;
|
|
505
|
+
warn(title: string, options?: LogOptions): void;
|
|
506
|
+
error(title: string, options?: LogOptions): void;
|
|
507
|
+
fatal(title: string, options?: LogOptions): void;
|
|
508
|
+
child(bindings: Bindings): Logger$1;
|
|
509
|
+
}
|
|
510
|
+
declare class LoggerImpl implements Logger {
|
|
511
|
+
private readonly options;
|
|
512
|
+
readonly instance: Logger$1;
|
|
513
|
+
constructor(options: LoggerOptions);
|
|
514
|
+
info(title: string, options?: LogOptions): void;
|
|
515
|
+
debug(title: string, options?: LogOptions): void;
|
|
516
|
+
trace(title: string, options?: LogOptions): void;
|
|
517
|
+
warn(title: string, options?: LogOptions): void;
|
|
518
|
+
error(title: string, options?: LogOptions): void;
|
|
519
|
+
fatal(title: string, options?: LogOptions): void;
|
|
520
|
+
child(bindings: Bindings): Logger$1;
|
|
521
|
+
private log;
|
|
522
|
+
private formatLogOptions;
|
|
523
|
+
private formatUnknown;
|
|
524
|
+
private normalizeObject;
|
|
525
|
+
private makeInstance;
|
|
526
|
+
private makeTransportTargets;
|
|
527
|
+
private makeConsoleTransportTarget;
|
|
528
|
+
private makeFileTransportTarget;
|
|
529
|
+
private makeTransportLevel;
|
|
530
|
+
private makeGlobalLogLevel;
|
|
531
|
+
}
|
|
532
|
+
//#endregion
|
|
411
533
|
//#region src-node/package-json/package-json.d.ts
|
|
412
534
|
interface PackageNameModel {
|
|
413
535
|
readonly original: string;
|
|
@@ -452,4 +574,4 @@ declare const PackageJSONSchema: z.ZodObject<{
|
|
|
452
574
|
*/
|
|
453
575
|
declare function loadPackageJSON(path: string): PackageJSONModel;
|
|
454
576
|
//#endregion
|
|
455
|
-
export { BaseLoggerTransportOptions, Console, ConsoleOptions, ConsolePanelRow,
|
|
577
|
+
export { BaseLoggerTransportOptions, type BuildMetadata, type ConfigDefinition, type ConfigurationBinding, type ConfigurationContract, type ConfigurationField, type ConfigurationInputFromSchema, type ConfigurationResolveContext, type ConfigurationSchema, type ConfigurationSource, type ConfigurationSourceKind, type ConfigurationValueInput, Console, ConsoleOptions, ConsolePanelRow, DependencyBundlingMatcher, DependencyBundlingPackageJSON, DependencyBundlingPolicy, type EnvironmentConfig, type EnvironmentConfigFromRegistry, type EnvironmentDefinition, type EnvironmentName, type EnvironmentRegistry, type InferConfig, type InferConfigValue, type InferConfiguration, type InferSchemaInput, type InferSchemaOutput, type LoadEnvironmentConfigOptions, type LoadedConfig, type LoadedEnvironmentConfig, LogFlag, LogOptions, Logger, LoggerConsoleTransportOptions, LoggerFileTransportOptions, LoggerImpl, LoggerOptions, LoggerTransportOptions, MakeDependencyBundlingPolicyOptions, PackageJSONModel, PackageJSONSchema, PackageNameModel, PackageNameSchema, type ResolveConfigurationOptions, type ResolveEnvironmentOptions, createDirectory, createDirectoryAsync, createFile, createFileAsync, defineConfig, defineConfiguration, defineEnvironments, defineSource, ensureDirectory, ensureDirectoryAsync, field, isConfigDefinition, isConfigurationBinding, isConfigurationContract, isConfigurationField, isConfigurationSource, loadEnvironmentConfig, loadPackageJSON, loadSelectedEnvironmentConfig, makeDependencyBundlingPolicy, removePath, removePathAsync, resolveConfig, resolveConfiguration, resolveConfigurationBinding, resolveEnvironment, resolvePath };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Container } from "inversify";
|
|
2
1
|
import { Bindings, Level, Logger as Logger$1 } from "pino";
|
|
3
2
|
import z from "zod";
|
|
4
3
|
import { PrettyOptions } from "pino-pretty";
|
|
@@ -195,96 +194,144 @@ declare class Console {
|
|
|
195
194
|
private visibleLength;
|
|
196
195
|
}
|
|
197
196
|
//#endregion
|
|
198
|
-
//#region src-node/
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
197
|
+
//#region src-node/environment-configuration/environment.d.ts
|
|
198
|
+
interface EnvironmentDefinition {
|
|
199
|
+
/**
|
|
200
|
+
* Optional dotenv file associated with this environment.
|
|
201
|
+
*
|
|
202
|
+
* When the environment is selected, BuildPlease loads this file if it exists.
|
|
203
|
+
* Missing files are ignored, values already present in `process.env` keep
|
|
204
|
+
* priority. Configuration resolution and defaults decide how missing values are handled.
|
|
205
|
+
*/
|
|
206
|
+
readonly file?: string;
|
|
207
|
+
/** Directory containing `file`, resolved relative to `environment.config.ts`. */
|
|
208
|
+
readonly fileDir?: string;
|
|
205
209
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
readonly
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
interface EnvironmentConfig<Name extends string = string> {
|
|
211
|
+
readonly name: Name;
|
|
212
|
+
readonly file?: string;
|
|
213
|
+
readonly fileDir: string;
|
|
214
|
+
}
|
|
215
|
+
type EnvironmentRegistry = Record<string, EnvironmentDefinition>;
|
|
216
|
+
type EnvironmentName<Environments extends EnvironmentRegistry> = keyof Environments & string;
|
|
217
|
+
type EnvironmentConfigFromRegistry<Environments extends EnvironmentRegistry> = EnvironmentConfig<EnvironmentName<Environments>>;
|
|
218
|
+
interface ResolveEnvironmentOptions {
|
|
219
|
+
readonly baseDir?: string;
|
|
213
220
|
}
|
|
221
|
+
declare function defineEnvironments<const Environments extends EnvironmentRegistry>(environments: Environments): Environments;
|
|
222
|
+
declare function resolveEnvironment<Environments extends EnvironmentRegistry>(environments: Environments, name: string, options?: ResolveEnvironmentOptions): EnvironmentConfigFromRegistry<Environments>;
|
|
214
223
|
//#endregion
|
|
215
|
-
//#region src-node/
|
|
216
|
-
interface
|
|
217
|
-
readonly
|
|
224
|
+
//#region src-node/build-metadata.d.ts
|
|
225
|
+
interface BuildMetadata {
|
|
226
|
+
readonly name: {
|
|
227
|
+
readonly original: string;
|
|
228
|
+
readonly base: string;
|
|
229
|
+
};
|
|
230
|
+
readonly version: string;
|
|
231
|
+
readonly id: string;
|
|
232
|
+
readonly createdAt: string;
|
|
218
233
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
234
|
+
//#endregion
|
|
235
|
+
//#region src-node/environment-configuration/source.d.ts
|
|
236
|
+
type ConfigurationSourceKind = 'env' | 'by-environment' | 'compute' | 'static' | 'default';
|
|
237
|
+
interface ConfigurationResolveContext<EnvironmentName extends string = string> {
|
|
238
|
+
readonly environment: EnvironmentConfig<EnvironmentName>;
|
|
239
|
+
readonly buildMetadata: BuildMetadata;
|
|
223
240
|
}
|
|
224
|
-
interface
|
|
225
|
-
readonly
|
|
226
|
-
readonly
|
|
241
|
+
interface ConfigurationSource<Output = unknown> {
|
|
242
|
+
readonly kind: ConfigurationSourceKind;
|
|
243
|
+
readonly options: unknown;
|
|
244
|
+
readonly transforms: readonly ConfigurationSourceTransform[];
|
|
245
|
+
default<Default>(value: Default): ConfigurationSource<Exclude<Output, null | undefined> | Default>;
|
|
246
|
+
map<NextOutput>(transform: (value: Output) => NextOutput | Promise<NextOutput>): ConfigurationSource<NextOutput>;
|
|
227
247
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
readonly
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
} | {
|
|
234
|
-
readonly enabled: true;
|
|
235
|
-
readonly debug?: boolean;
|
|
236
|
-
readonly transports: readonly [LoggerTransportOptions, ...LoggerTransportOptions[]];
|
|
248
|
+
declare function defineSource<const Environments extends EnvironmentRegistry>(_environments: Environments): {
|
|
249
|
+
env(name: string): ConfigurationSource<string | undefined>;
|
|
250
|
+
byEnvironment<const Cases extends { readonly [Key in keyof Environments & string]: unknown; }>(cases: Cases): ConfigurationSource<InferSourceOutput<Cases[keyof Environments & string]>>;
|
|
251
|
+
compute<Output>(compute: (context: ConfigurationResolveContext<keyof Environments & string>) => Output | Promise<Output>): ConfigurationSource<Output>;
|
|
252
|
+
static<Output>(value: Output): ConfigurationSource<Output>;
|
|
237
253
|
};
|
|
254
|
+
declare function isConfigurationSource(input: unknown): input is ConfigurationSource;
|
|
255
|
+
type ConfigurationSourceTransform = (value: unknown) => unknown | Promise<unknown>;
|
|
256
|
+
type InferSourceOutput<T> = T extends ConfigurationSource<infer Output> ? Output : T extends ((...args: any[]) => any) ? T : T extends readonly [unknown, ...unknown[]] ? { readonly [Key in keyof T]: InferSourceOutput<T[Key]>; } : T extends readonly (infer Item)[] ? readonly InferSourceOutput<Item>[] : T extends object ? { readonly [Key in keyof T]: InferSourceOutput<T[Key]>; } : T;
|
|
238
257
|
//#endregion
|
|
239
|
-
//#region src-node/
|
|
240
|
-
interface
|
|
241
|
-
readonly
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
child(bindings: Bindings): Logger$1;
|
|
258
|
+
//#region src-node/environment-configuration/configuration.d.ts
|
|
259
|
+
interface ConfigurationField<Output, Required extends boolean = true, Input = Output> {
|
|
260
|
+
readonly required: Required;
|
|
261
|
+
readonly hasDefault: boolean;
|
|
262
|
+
readonly defaultValue?: Output;
|
|
263
|
+
parse(value: unknown, path: string): Output;
|
|
264
|
+
optional(): ConfigurationField<Output | undefined, false, Input | undefined | null>;
|
|
265
|
+
default(value: Output): ConfigurationField<Output, false, Input>;
|
|
266
|
+
map<NextOutput>(transform: (value: Output) => NextOutput): ConfigurationField<NextOutput, Required, Input>;
|
|
249
267
|
}
|
|
250
|
-
declare
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
private makeFileTransportTarget;
|
|
269
|
-
private makeTransportLevel;
|
|
270
|
-
private makeGlobalLogLevel;
|
|
268
|
+
declare const field: {
|
|
269
|
+
string(): ConfigurationField<string, true, string>;
|
|
270
|
+
number(): ConfigurationField<number, true, string | number>;
|
|
271
|
+
boolean(): ConfigurationField<boolean, true, string | boolean>;
|
|
272
|
+
array<Item, ItemInput>(item: ConfigurationField<Item, boolean, ItemInput>): ConfigurationField<readonly Item[], true, readonly ItemInput[]>;
|
|
273
|
+
custom<T>(): ConfigurationField<T, true, T>;
|
|
274
|
+
};
|
|
275
|
+
type ConfigurationSchema = ConfigurationField<any, boolean, any> | {
|
|
276
|
+
readonly [key: string]: ConfigurationSchema;
|
|
277
|
+
};
|
|
278
|
+
type InferSchemaOutput<Schema> = Schema extends ConfigurationField<infer Output, any, any> ? Output : Schema extends object ? { readonly [Key in keyof Schema]: InferSchemaOutput<Schema[Key]>; } : never;
|
|
279
|
+
type InferSchemaInput<Schema> = Schema extends ConfigurationField<any, any, infer Input> ? Input : Schema extends object ? { readonly [Key in RequiredSchemaKeys<Schema>]: InferSchemaInput<Schema[Key]>; } & { readonly [Key in OptionalSchemaKeys<Schema>]?: InferSchemaInput<Schema[Key]>; } : never;
|
|
280
|
+
type ConfigurationValueInput<T> = ConfigurationSource<T | undefined> | (T extends unknown ? ConfigurationValueInputValue<T> : never);
|
|
281
|
+
type ConfigurationInputFromSchema<Schema> = ConfigurationSource<InferSchemaInput<Schema> | undefined> | (Schema extends ConfigurationField<any, any, infer Input> ? ConfigurationValueInput<Input> : Schema extends object ? { readonly [Key in RequiredSchemaKeys<Schema>]: ConfigurationInputFromSchema<Schema[Key]>; } & { readonly [Key in OptionalSchemaKeys<Schema>]?: ConfigurationInputFromSchema<Schema[Key]>; } : never);
|
|
282
|
+
interface ConfigurationContract<Output, Schema extends ConfigurationSchema = ConfigurationSchema> {
|
|
283
|
+
readonly key: string;
|
|
284
|
+
readonly schema: Schema;
|
|
285
|
+
(input: ConfigurationInputFromSchema<Schema>): ConfigurationBinding<Output, Schema>;
|
|
271
286
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
interface Assembly {
|
|
276
|
-
assemble(container: AssemblyContainer): void;
|
|
287
|
+
interface ConfigurationBinding<Output = unknown, Schema extends ConfigurationSchema = ConfigurationSchema> {
|
|
288
|
+
readonly contract: ConfigurationContract<Output, Schema>;
|
|
289
|
+
readonly input: ConfigurationInputFromSchema<Schema>;
|
|
277
290
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
interface
|
|
281
|
-
readonly
|
|
291
|
+
type InferConfiguration<Contract> = Contract extends ConfigurationContract<infer Output, any> ? Output : never;
|
|
292
|
+
declare function defineConfiguration<const Schema extends ConfigurationSchema>(key: string, schema: Schema): ConfigurationContract<InferSchemaOutput<Schema>, Schema>;
|
|
293
|
+
interface ConfigDefinition<Environments extends EnvironmentRegistry = EnvironmentRegistry, Input = unknown> {
|
|
294
|
+
readonly environments: Environments;
|
|
295
|
+
readonly input: Input;
|
|
282
296
|
}
|
|
283
|
-
|
|
297
|
+
type InferConfig<Config> = Config extends ConfigDefinition<any, infer Input> ? InferConfigValue<Input> : never;
|
|
298
|
+
type InferConfigValue<Input> = Input extends ConfigurationSource<infer Output> ? Output : Input extends ConfigurationBinding<infer Output> ? Output : Input extends ((...args: any[]) => any) ? Input : Input extends readonly [unknown, ...unknown[]] ? { readonly [Key in keyof Input]: InferConfigValue<Input[Key]>; } : Input extends readonly (infer Item)[] ? readonly InferConfigValue<Item>[] : Input extends object ? { readonly [Key in keyof Input]: InferConfigValue<Input[Key]>; } : Input;
|
|
299
|
+
declare function defineConfig<const Environments extends EnvironmentRegistry, const Input>(environments: Environments, input: Input): ConfigDefinition<Environments, Input>;
|
|
300
|
+
declare function isConfigDefinition(input: unknown): input is ConfigDefinition;
|
|
301
|
+
declare function isConfigurationField(input: unknown): input is ConfigurationField<unknown, boolean, unknown>;
|
|
302
|
+
declare function isConfigurationContract(input: unknown): input is ConfigurationContract<unknown>;
|
|
303
|
+
declare function isConfigurationBinding(input: unknown): input is ConfigurationBinding;
|
|
304
|
+
type ConfigurationValueInputValue<T> = T extends ((...args: any[]) => any) ? T : T extends readonly [unknown, ...unknown[]] ? { readonly [Key in keyof T]: ConfigurationValueInput<T[Key]>; } : T extends readonly (infer Item)[] ? readonly ConfigurationValueInput<Item>[] : T extends object ? { readonly [Key in keyof T]: ConfigurationValueInput<T[Key]>; } : T;
|
|
305
|
+
type IsSchemaInputRequired<Schema> = Schema extends ConfigurationField<any, infer Required, any> ? Required : Schema extends object ? RequiredSchemaKeys<Schema> extends never ? false : true : true;
|
|
306
|
+
type RequiredSchemaKeys<Schema extends object> = { [Key in keyof Schema]-?: IsSchemaInputRequired<Schema[Key]> extends true ? Key : never; }[keyof Schema];
|
|
307
|
+
type OptionalSchemaKeys<Schema extends object> = { [Key in keyof Schema]-?: IsSchemaInputRequired<Schema[Key]> extends true ? never : Key; }[keyof Schema];
|
|
284
308
|
//#endregion
|
|
285
|
-
//#region src-node/environment/
|
|
286
|
-
|
|
287
|
-
|
|
309
|
+
//#region src-node/environment-configuration/engine.d.ts
|
|
310
|
+
interface LoadEnvironmentConfigOptions {
|
|
311
|
+
readonly dir?: string;
|
|
312
|
+
}
|
|
313
|
+
interface LoadedConfig<Config extends ConfigDefinition = ConfigDefinition> {
|
|
314
|
+
readonly config: Config;
|
|
315
|
+
readonly configFilePath: string;
|
|
316
|
+
readonly rootDir: string;
|
|
317
|
+
}
|
|
318
|
+
interface LoadedEnvironmentConfig<Config extends ConfigDefinition = ConfigDefinition> extends LoadedConfig<Config> {
|
|
319
|
+
readonly environment: EnvironmentConfigFromRegistry<Config['environments']>;
|
|
320
|
+
}
|
|
321
|
+
/** Load the conventional environment.config.ts definition without selecting an environment. */
|
|
322
|
+
declare function loadEnvironmentConfig<Config extends ConfigDefinition = ConfigDefinition>(options?: LoadEnvironmentConfigOptions): Promise<LoadedConfig<Config>>;
|
|
323
|
+
/**
|
|
324
|
+
* Load environment.config.ts and resolve the environment selected for the
|
|
325
|
+
* current BuildPlease process tree.
|
|
326
|
+
*/
|
|
327
|
+
declare function loadSelectedEnvironmentConfig<Config extends ConfigDefinition = ConfigDefinition>(options?: LoadEnvironmentConfigOptions): Promise<LoadedEnvironmentConfig<Config>>;
|
|
328
|
+
interface ResolveConfigurationOptions {
|
|
329
|
+
readonly buildMetadata?: BuildMetadata;
|
|
330
|
+
readonly environment?: EnvironmentConfig;
|
|
331
|
+
}
|
|
332
|
+
declare function resolveConfig<Config extends ConfigDefinition<any>>(config: Config, context: ConfigurationResolveContext<keyof Config['environments'] & string>): Promise<InferConfig<Config>>;
|
|
333
|
+
declare function resolveConfiguration<Output, Schema extends ConfigurationSchema>(contract: ConfigurationContract<Output, Schema>, input: ConfigurationInputFromSchema<Schema> | undefined, options?: ResolveConfigurationOptions): Promise<Output>;
|
|
334
|
+
declare function resolveConfigurationBinding<Output>(binding: ConfigurationBinding<Output>, options?: ResolveConfigurationOptions): Promise<Output>;
|
|
288
335
|
//#endregion
|
|
289
336
|
//#region src-node/file/file-sync.d.ts
|
|
290
337
|
/**
|
|
@@ -408,6 +455,81 @@ declare function createDirectoryAsync(dirPath: string): Promise<string>;
|
|
|
408
455
|
*/
|
|
409
456
|
declare function createFileAsync(filePath: string, content?: string): Promise<string>;
|
|
410
457
|
//#endregion
|
|
458
|
+
//#region src-node/logger/log-flag.d.ts
|
|
459
|
+
declare enum LogFlag {
|
|
460
|
+
Critical = "CRITICAL",
|
|
461
|
+
Serious = "SERIOUS",
|
|
462
|
+
Important = "IMPORTANT",
|
|
463
|
+
Notice = "NOTICE",
|
|
464
|
+
Routine = "ROUTINE"
|
|
465
|
+
}
|
|
466
|
+
//#endregion
|
|
467
|
+
//#region src-node/logger/log-options.d.ts
|
|
468
|
+
interface LogOptions {
|
|
469
|
+
readonly flag?: LogFlag;
|
|
470
|
+
readonly details?: unknown;
|
|
471
|
+
readonly error?: unknown;
|
|
472
|
+
readonly metadata?: unknown;
|
|
473
|
+
}
|
|
474
|
+
//#endregion
|
|
475
|
+
//#region src-node/logger/logger-options.d.ts
|
|
476
|
+
interface BaseLoggerTransportOptions {
|
|
477
|
+
readonly level?: Level;
|
|
478
|
+
}
|
|
479
|
+
interface LoggerConsoleTransportOptions extends BaseLoggerTransportOptions {
|
|
480
|
+
readonly type: 'console';
|
|
481
|
+
readonly target: 'pino-pretty';
|
|
482
|
+
readonly pretty?: PrettyOptions;
|
|
483
|
+
}
|
|
484
|
+
interface LoggerFileTransportOptions extends BaseLoggerTransportOptions {
|
|
485
|
+
readonly type: 'file';
|
|
486
|
+
readonly path: string;
|
|
487
|
+
}
|
|
488
|
+
type LoggerTransportOptions = LoggerConsoleTransportOptions | LoggerFileTransportOptions;
|
|
489
|
+
type LoggerOptions = {
|
|
490
|
+
readonly enabled: false;
|
|
491
|
+
readonly debug?: boolean;
|
|
492
|
+
readonly transports?: never;
|
|
493
|
+
} | {
|
|
494
|
+
readonly enabled: true;
|
|
495
|
+
readonly debug?: boolean;
|
|
496
|
+
readonly transports: readonly [LoggerTransportOptions, ...LoggerTransportOptions[]];
|
|
497
|
+
};
|
|
498
|
+
//#endregion
|
|
499
|
+
//#region src-node/logger/logger.d.ts
|
|
500
|
+
interface Logger {
|
|
501
|
+
readonly instance: Logger$1;
|
|
502
|
+
info(title: string, options?: LogOptions): void;
|
|
503
|
+
debug(title: string, options?: LogOptions): void;
|
|
504
|
+
trace(title: string, options?: LogOptions): void;
|
|
505
|
+
warn(title: string, options?: LogOptions): void;
|
|
506
|
+
error(title: string, options?: LogOptions): void;
|
|
507
|
+
fatal(title: string, options?: LogOptions): void;
|
|
508
|
+
child(bindings: Bindings): Logger$1;
|
|
509
|
+
}
|
|
510
|
+
declare class LoggerImpl implements Logger {
|
|
511
|
+
private readonly options;
|
|
512
|
+
readonly instance: Logger$1;
|
|
513
|
+
constructor(options: LoggerOptions);
|
|
514
|
+
info(title: string, options?: LogOptions): void;
|
|
515
|
+
debug(title: string, options?: LogOptions): void;
|
|
516
|
+
trace(title: string, options?: LogOptions): void;
|
|
517
|
+
warn(title: string, options?: LogOptions): void;
|
|
518
|
+
error(title: string, options?: LogOptions): void;
|
|
519
|
+
fatal(title: string, options?: LogOptions): void;
|
|
520
|
+
child(bindings: Bindings): Logger$1;
|
|
521
|
+
private log;
|
|
522
|
+
private formatLogOptions;
|
|
523
|
+
private formatUnknown;
|
|
524
|
+
private normalizeObject;
|
|
525
|
+
private makeInstance;
|
|
526
|
+
private makeTransportTargets;
|
|
527
|
+
private makeConsoleTransportTarget;
|
|
528
|
+
private makeFileTransportTarget;
|
|
529
|
+
private makeTransportLevel;
|
|
530
|
+
private makeGlobalLogLevel;
|
|
531
|
+
}
|
|
532
|
+
//#endregion
|
|
411
533
|
//#region src-node/package-json/package-json.d.ts
|
|
412
534
|
interface PackageNameModel {
|
|
413
535
|
readonly original: string;
|
|
@@ -452,4 +574,4 @@ declare const PackageJSONSchema: z.ZodObject<{
|
|
|
452
574
|
*/
|
|
453
575
|
declare function loadPackageJSON(path: string): PackageJSONModel;
|
|
454
576
|
//#endregion
|
|
455
|
-
export { BaseLoggerTransportOptions, Console, ConsoleOptions, ConsolePanelRow,
|
|
577
|
+
export { BaseLoggerTransportOptions, type BuildMetadata, type ConfigDefinition, type ConfigurationBinding, type ConfigurationContract, type ConfigurationField, type ConfigurationInputFromSchema, type ConfigurationResolveContext, type ConfigurationSchema, type ConfigurationSource, type ConfigurationSourceKind, type ConfigurationValueInput, Console, ConsoleOptions, ConsolePanelRow, DependencyBundlingMatcher, DependencyBundlingPackageJSON, DependencyBundlingPolicy, type EnvironmentConfig, type EnvironmentConfigFromRegistry, type EnvironmentDefinition, type EnvironmentName, type EnvironmentRegistry, type InferConfig, type InferConfigValue, type InferConfiguration, type InferSchemaInput, type InferSchemaOutput, type LoadEnvironmentConfigOptions, type LoadedConfig, type LoadedEnvironmentConfig, LogFlag, LogOptions, Logger, LoggerConsoleTransportOptions, LoggerFileTransportOptions, LoggerImpl, LoggerOptions, LoggerTransportOptions, MakeDependencyBundlingPolicyOptions, PackageJSONModel, PackageJSONSchema, PackageNameModel, PackageNameSchema, type ResolveConfigurationOptions, type ResolveEnvironmentOptions, createDirectory, createDirectoryAsync, createFile, createFileAsync, defineConfig, defineConfiguration, defineEnvironments, defineSource, ensureDirectory, ensureDirectoryAsync, field, isConfigDefinition, isConfigurationBinding, isConfigurationContract, isConfigurationField, isConfigurationSource, loadEnvironmentConfig, loadPackageJSON, loadSelectedEnvironmentConfig, makeDependencyBundlingPolicy, removePath, removePathAsync, resolveConfig, resolveConfiguration, resolveConfigurationBinding, resolveEnvironment, resolvePath };
|
package/dist/src-node/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{builtinModules as e}from"node:module";import{createConsola as t}from"consola";import{colors as n}from"consola/utils";import{
|
|
2
|
-
`)}formatPanelTop(e,t){let r=Math.max(1,t-this.visibleLength(e)-5);return`${n.dim(`╭─`)} ${e} ${n.dim(`─`.repeat(r))}${n.dim(`╮`)}`}formatPanelBottom(e){return`${n.dim(`╰`)}${n.dim(`─`.repeat(e-2))}${n.dim(`╯`)}`}formatPanelRow(e,t,r){let i=e.label.padEnd(14,` `),a=String(e.value),o=this.visibleLength(i)+this.visibleLength(a)+4,s=Math.max(0,t-o);return`${n.dim(`│`)} ${n.blue(i)}${r(a)}${` `.repeat(s)} ${n.dim(`│`)}`}getPanelWidth(e){return Math.max(48,this.getTitleWidth(e),this.getRowsWidth(e.rows))}getTitleWidth(e){return this.visibleLength(e.title)+6}getRowsWidth(e){return Math.max(0,...e.map(e=>this.getRowWidth(e)))}getRowWidth(e){return 14+this.visibleLength(String(e.value))+4}visibleLength(e){return e.replace(ot,``).length}};const I=`${{name:`buildplease`,displayName:`BuildPlease`,scope:`@buildplease`}.name}.Core.DI`,L={DI:{Formatter:{UnitController:Symbol.for(`${I}.Formatter.UnitController`)},Logger:Symbol.for(`${I}.Logger`)}};function ct(e){return e instanceof Error}function R(e,t={}){if(e==null)return{};let{filterNull:n=!0,filterUndefined:r=!0,filterEmptyString:i=!1,filterEmptyObject:a=!1,filterEmptyArray:o=!1}=t;return Object.keys(e).reduce((s,c)=>{let l=e[c];return z(l)&&Object.getPrototypeOf(l)===null&&(l=void 0),lt(l)&&(l=R(l,t)),n&&l===null||r&&l===void 0||i&&l===``||a&&B(l)||o&&Array.isArray(l)&&l.length===0||(s[c]=l),s},{})}function z(e){return typeof e==`object`&&!!e}function B(e){return z(e)&&Object.keys(e).length===0}function lt(e){return z(e)&&Object.getPrototypeOf(e)===Object.prototype}function ut(e){return e==null||[`string`,`number`,`boolean`,`bigint`,`symbol`].includes(typeof e)}Array.prototype.isEmpty=function(){return this==null||this.length===0},String.prototype.capitalized=function(){let e=this==null?``:this.toString();return e.trim()?e.charAt(0).toUpperCase()+e.slice(1):``};var dt=class{streetLine1;streetLine2;postalCode;state;city;country;countryCode;constructor(e){this.streetLine1=e.streetLine1,this.streetLine2=e.streetLine2,this.postalCode=e.postalCode,this.state=e.state,this.city=e.city,this.country=e.country,this.countryCode=e.countryCode}toJSON(){return R({streetLine1:this.streetLine1,streetLine2:this.streetLine2,postalCode:this.postalCode,city:this.city,state:this.state,country:this.country,countryCode:this.countryCode},{filterNull:!0,filterUndefined:!0,filterEmptyString:!0})}formatted(){let e=(e,t)=>e.map(e=>e?.trim()).filter(e=>e&&e.length>0).join(t).trim(),t=this.streetLine1;return e([t,e([this.postalCode,this.city],` `),e([this.country],`, `)],`, `)}},ft=class{email;fb;ig;phone;web;constructor({email:e,fb:t,ig:n,phone:r,web:i}){this.email=e,this.fb=t,this.ig=n,this.phone=r,this.web=i}toJSON(){return R({email:this.email,fb:this.fb,ig:this.ig,phone:this.phone,web:this.web},{filterNull:!0,filterUndefined:!0,filterEmptyString:!0})}},V=O({DateFormat:()=>U,DateTime:()=>H});import*as pt from"date-fns";A(V,pt);var H=class e{date;constructor(e){if(!e){this.date=new Date;return}if(e instanceof Date){if(!h(e))throw Error(`Invalid date object`);this.date=e;return}let t=Ee(e);if(!h(t))throw Error(`Invalid date string`);this.date=t}static fromUnixTimestamp(t,n){return new e(pe(t,n))}static now(){return new e(new Date)}toJSON(){return this.toISOString()}toDate(){return this.date}toUnixTimestamp(){return be(this.date)}getTime(){return this.date.getTime()}toISOString(){return fe(this.date)}format(e,t){return de(this.date,e,t)}addingDuration(t){return new e(i(this.date,t))}addingMilliseconds(t){return new e(s(this.date,t))}addingSeconds(t){return new e(u(this.date,t))}addingMinutes(t){return new e(c(this.date,t))}addingHours(t){return new e(o(this.date,t))}addingDays(t){return new e(a(this.date,t))}addingWeeks(t){return new e(d(this.date,t))}addingMonths(t){return new e(l(this.date,t))}addingYears(t){return new e(f(this.date,t))}subtractingDuration(t){return new e(b(this.date,t))}subtractingMilliseconds(t){return new e(Ie(this.date,t))}subtractingSeconds(t){return new e(ze(this.date,t))}subtractingMinutes(t){return new e(Le(this.date,t))}subtractingHours(t){return new e(Fe(this.date,t))}subtractingDays(t){return new e(Pe(this.date,t))}subtractingWeeks(t){return new e(Be(this.date,t))}subtractingMonths(t){return new e(Re(this.date,t))}subtractingYears(t){return new e(Ve(this.date,t))}differenceInMilliseconds(e){return ne(this.date,e.date)}differenceInSeconds(e){return ae(this.date,e.date)}differenceInMinutes(e){return re(this.date,e.date)}differenceInHours(e){return te(this.date,e.date)}differenceInDays(e){return ee(this.date,e.date)}differenceInWeeks(e){return oe(this.date,e.date)}differenceInMonths(e){return ie(this.date,e.date)}differenceInYears(e){return se(this.date,e.date)}isEqualTo(e){return we(this.date,e.date)}isBefore(e){return Ce(this.date,e.date)}isAfter(e){return Se(this.date,e.date)}compareTo(e){return p(this.date,e.date)}isSameDayAs(e){return Te(this.date,e.date)}startOfDay(){return new e(g(this.date))}endOfDay(){return new e(m(this.date))}startOfWeek(){return new e(v(this.date))}endOfWeek(){return new e(le(this.date))}startOfMonth(){return new e(_(this.date))}endOfMonth(){return new e(ce(this.date))}startOfYear(){return new e(y(this.date))}endOfYear(){return new e(ue(this.date))}get dayOfMonth(){return me(this.date)}get dayOfWeek(){return he(this.date)}get month(){return ve(this.date)}get year(){return xe(this.date)}get hours(){return ge(this.date)}get minutes(){return _e(this.date)}get seconds(){return ye(this.date)}settingDayOfMonth(t){return new e(De(this.date,t))}settingDayOfWeek(t){return new e(Oe(this.date,t))}settingMonth(t){return new e(je(this.date,t))}settingYear(t){return new e(Ne(this.date,t))}settingHours(t){return new e(ke(this.date,t))}settingMinutes(t){return new e(Ae(this.date,t))}settingSeconds(t){return new e(Me(this.date,t))}};let U=function(e){return e.ISO_DATE=`yyyy-MM-dd`,e.ISO_DATETIME=`yyyy-MM-dd'T'HH:mm:ssXXX`,e.MM_DD_YYYY=`MM/dd/yyyy`,e.FULL_MONTH_DAY_YEAR=`MMMM d, yyyy`,e.ABBR_MONTH_DAY_YEAR=`MMM d, yyyy`,e.RFC_3339=`yyyy-MM-dd'T'HH:mm:ss.SSSxxx`,e.ALT_RSS=`d MMM yyyy HH:mm:ss ZZZ`,e.RSS=`EEE, d MMM yyyy HH:mm:ss ZZZ`,e.HTTP_HEADER=`EEE, dd MMM yyyy HH:mm:ss zzz`,e.STANDARD=`EEE MMM dd HH:mm:ss Z yyyy`,e.EXTENDED=`eee dd-MMM-yyyy GG HH:mm:ss.SSS zzz`,e}({});var mt=class e{utc;timeZone;constructor(e,t){this.timeZone=e,this.utc=t??new Date}static fromUtc(t,n){return new e(n,t)}static fromLocalIso(t,n){let r=Ue(t,n);return new e(n,r)}format(e,t){return He(this.utc,this.timeZone,e,t)}toLocalIsoMinutes(e){return this.format(`yyyy-MM-dd'T'HH:mm`,e)}toLocalIsoSeconds(e){return this.format(`yyyy-MM-dd'T'HH:mm:ss`,e)}toISOString(){return this.utc.toISOString()}toUnixTimestamp(){return Math.floor(this.utc.getTime()/1e3)}toZonedDate(){return Ge(this.utc,this.timeZone)}timezoneOffsetMs(e){return We(this.timeZone,e??this.utc)}},ht=class{value;constructor([e,t]){if(e<-180||e>180)throw Error(`Longitude must be between -180 and 180.`);if(t<-90||t>90)throw Error(`Latitude must be between -90 and 90.`);this.value=[e,t]}get longitude(){return this.value[0]}get latitude(){return this.value[1]}toJSON(){return this.value}},gt=class{type=`Point`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.toJSON(),...this.bbox&&{bbox:this.bbox}}}},_t=class{type=`MultiPoint`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.map(e=>e.toJSON()),...this.bbox&&{bbox:this.bbox}}}},vt=class{type=`LineString`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.map(e=>e.toJSON()),...this.bbox&&{bbox:this.bbox}}}},yt=class{type=`MultiLineString`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.map(e=>e.map(e=>e.toJSON())),...this.bbox&&{bbox:this.bbox}}}},bt=class{type=`Polygon`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.map(e=>e.map(e=>e.toJSON())),...this.bbox&&{bbox:this.bbox}}}},xt=class{type=`MultiPolygon`;coordinates;bbox;constructor(e,t){this.coordinates=e,this.bbox=t}toJSON(){return{type:this.type,coordinates:this.coordinates.map(e=>e.map(e=>e.map(e=>e.toJSON()))),...this.bbox&&{bbox:this.bbox}}}};let St=function(e){return e.Point=`Point`,e.MultiPoint=`MultiPoint`,e.LineString=`LineString`,e.MultiLineString=`MultiLineString`,e.Polygon=`Polygon`,e.MultiPolygon=`MultiPolygon`,e}({});function W(e){return Error(`Invalid ObjectId value: ${String(e)}`)}var Ct=class e{value;constructor(e){if(e==null)throw W(e);let t=e.trim();if(t.length===0)throw W(e);this.value=t,Object.freeze(this)}get asString(){return this.value}equals(t){return this.value===e.from(t).value}compare(t){let n=e.from(t).value;return this.value===n?0:this.value<n?-1:1}hash(){return this.value}toJSON(){return this.value}toString(){return this.value}[Symbol.toPrimitive](){return this.value}static from(t){return t instanceof e?t:new e(t)}static isValid(e){return typeof e==`string`&&e.trim().length>0}static toValueSet(t){let n=new Set;for(let r of t)n.add(e.from(r).value);return n}},wt=class{day;intervals;constructor(e,t){this.day=e,this.intervals=t}toJSON(){return R({day:this.day,intervals:this.intervals},{filterNull:!0,filterUndefined:!0,filterEmptyString:!0})}},Tt=class{_milliseconds;_long;constructor(e,t){if(this._long=t?.long===!0,e==null)throw Error(`Invalid interval format: ${e}`);if(typeof e==`number`)this._milliseconds=e;else{let t=x(e);if(t===void 0)throw Error(`Invalid interval format: ${e}`);this._milliseconds=t}}get milliseconds(){return this._milliseconds}get seconds(){return Math.floor(this._milliseconds/1e3)}get minutes(){return Math.floor(this._milliseconds/6e4)}get hours(){return Math.floor(this._milliseconds/36e5)}get days(){return Math.floor(this._milliseconds/864e5)}get weeks(){return Math.floor(this._milliseconds/6048e5)}get formatted(){return x(this._milliseconds,{long:this._long})}toString(){return x(this._milliseconds,{long:this._long})}toObject(){return{milliseconds:this._milliseconds,seconds:this.seconds,minutes:this.minutes,hours:this.hours,days:this.days,weeks:this.weeks}}};let Et=function(e){return e.Byte=`B`,e.Kilobyte=`KB`,e.Megabyte=`MB`,e.Gigabyte=`GB`,e.Terabyte=`TB`,e}({}),Dt=function(e){return e.Millimeter=`mm`,e.Centimeter=`cm`,e.Meter=`m`,e.Kilometer=`km`,e}({}),Ot=function(e){return e.Milligram=`mg`,e.Gram=`g`,e.Kilogram=`kg`,e.Tonne=`t`,e}({});A(O({Address:()=>dt,ByteUnit:()=>Et,Contacts:()=>ft,Coordinates:()=>ht,DateFormat:()=>U,DateTime:()=>H,DistanceUnit:()=>Dt,GeoJsonType:()=>St,LineString:()=>vt,MultiLineString:()=>yt,MultiPoint:()=>_t,MultiPolygon:()=>xt,ObjectId:()=>Ct,OpeningHour:()=>wt,Point:()=>gt,Polygon:()=>bt,TimeInterval:()=>Tt,WeightUnit:()=>Ot,ZonedDateTime:()=>mt}),V);function kt(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}let G=class{formatBytes(e,t){let{inputUnit:n=`B`,outputUnit:r=`auto`,decimals:i=1}=t??{},a=e=>e===`B`?1:e===`KB`?1024:e===`MB`?1048576:e===`GB`?1073741824:1099511627776,o=e*a(n),s=r===`auto`?(()=>{for(let e of[`TB`,`GB`,`MB`,`KB`])if(o/a(e)>=1)return e;return`B`})():r,c=o/a(s),l=10**i;return{value:Math.round(c*l)/l,unit:s,bytes:o}}};G=kt([r()],G);var At=class{assemble(e){e.bind(L.DI.Formatter.UnitController).to(G)}};function jt(){return[new At]}let Mt=function(e){return e.Critical=`CRITICAL`,e.Serious=`SERIOUS`,e.Important=`IMPORTANT`,e.Notice=`NOTICE`,e.Routine=`ROUTINE`,e}({});function K(e,t){if(S.isAbsolute(t))return S.normalize(t);let n;try{let t=new URL(e);if(t.protocol!==`file:`)throw Error(`Unsupported URL protocol "${t.protocol}"`);n=S.dirname(Ke(t))}catch{n=e}return S.resolve(n,t)}function Nt(e,t={}){let n=K(process.cwd(),e);if(!C.existsSync(n))return;let r=C.statSync(n),{recursive:i=!0,force:a=!0,cleanOnly:o=!1}=t;if(o&&r.isDirectory()){for(let e of C.readdirSync(n))C.rmSync(S.join(n,e),{recursive:i,force:a});return}if(o&&r.isFile()){C.truncateSync(n,0);return}C.rmSync(n,{recursive:r.isDirectory()?i:!1,force:a,maxRetries:3,retryDelay:100})}function q(e){let t=K(process.cwd(),e),n=C.existsSync(t)&&C.statSync(t).isDirectory()?t:S.dirname(t);if(!C.existsSync(n))throw Error(`Directory "${n}" does not exist.`);return t}function Pt(e){let t=K(process.cwd(),e);S.extname(e)&&console.warn(`[createDirectory] Warning: "${e}" looks like a file path.`);try{if(!C.existsSync(t))C.mkdirSync(t,{recursive:!0});else if(!C.statSync(t).isDirectory())throw Error(`"${t}" exists but is not a directory.`);return t}catch(e){throw Error(`Failed to create directory "${t}": ${e.message}`)}}function Ft(e,t=``){let n=K(process.cwd(),e);q(S.dirname(n));let r=It(n);if(!r)C.writeFileSync(n,t,{encoding:`utf8`,flag:`w`});else{if(!r.isFile())throw Error(`"${n}" exists but is not a file.`);t&&C.writeFileSync(n,t,{encoding:`utf8`,flag:`a`})}return n}function It(e){try{return C.statSync(e)}catch{return}}async function Lt(e,t={}){let n=K(process.cwd(),e),r;try{r=await w.stat(n)}catch(e){if((t.force??!0)&&e.code===`ENOENT`)return;throw e}let{recursive:i=!0,force:a=!0,cleanOnly:o=!1}=t;if(o&&r.isDirectory()){let e=await w.readdir(n);for(let t of e)await w.rm(S.join(n,t),{recursive:i,force:a});return}if(o&&r.isFile()){await w.truncate(n,0);return}await w.rm(n,{recursive:r.isDirectory()?i:!1,force:a,maxRetries:3,retryDelay:100})}async function J(e){let t=K(process.cwd(),e),n;try{n=await w.stat(t)}catch{}let r=n?.isDirectory()?t:S.dirname(t);try{if(!(await w.stat(r)).isDirectory())throw Error(`"${r}" exists but is not a directory.`)}catch(e){throw e.code===`ENOENT`?Error(`Directory "${r}" does not exist.`):e}return t}async function Rt(e){let t=K(process.cwd(),e);S.extname(e)&&console.warn(`[createDirectory] Warning: "${e}" looks like a file path (has extension).`);try{let e;try{e=await w.stat(t)}catch{}if(!e)await w.mkdir(t,{recursive:!0});else if(!e.isDirectory())throw Error(`"${t}" exists but is not a directory.`);return t}catch(e){throw Error(`Failed to create directory "${t}": ${e.message}`)}}async function zt(e,t=``){let n=K(process.cwd(),e);await J(S.dirname(n));try{let e=await Bt(n);if(!e)await w.writeFile(n,t,{encoding:`utf8`,flag:`w`});else{if(!e.isFile())throw Error(`"${n}" exists but is not a file.`);t&&await w.writeFile(n,t,{encoding:`utf8`,flag:`a`})}return n}catch(e){throw Error(`Failed to create file "${n}": ${e.message}`)}}async function Bt(e){try{return await w.stat(e)}catch(e){if(e.code===`ENOENT`)return;throw e}}var Y=class{options;instance;constructor(e){this.options=e,this.instance=this.makeInstance()}info(e,t){this.log(`info`,e,t)}debug(e,t){this.log(`debug`,e,t)}trace(e,t){this.log(`trace`,e,t)}warn(e,t){this.log(`warn`,e,t)}error(e,t){this.log(`error`,e,t)}fatal(e,t){this.log(`fatal`,e,t)}child(e){return this.instance.child(e)}log(e,t,n){this.instance[e]({msg:t,...this.formatLogOptions(n)})}formatLogOptions(e){return e?this.normalizeObject({flag:e.flag,details:this.formatUnknown(e.details),error:this.formatUnknown(e.error),metadata:this.formatUnknown(e.metadata)}):{}}formatUnknown(e){if(ct(e)){let t={type:e.constructor.name,message:e.message};this.options.debug&&e.stack&&(t.stack=e.stack);for(let[n,r]of Object.entries(e))n in t||(t[n]=r);let n=this.normalizeObject(t);return B(n)?void 0:n}if(Buffer.isBuffer(e))return`[Buffer]`;if(e&&typeof e.pipe==`function`)return`[Stream]`;if(z(e))try{let t=JSON.stringify(e);if(t===void 0)return;let n=JSON.parse(t);if(Array.isArray(n))return n.length>0?n:void 0;if(z(n)){let e=this.normalizeObject(n);return B(e)?void 0:e}return n}catch{return{type:`NonSerializableObject`}}return ut(e)?e:String(e)}normalizeObject(e){return R(Object.fromEntries(Object.entries(e)),{filterNull:!0,filterUndefined:!0,filterEmptyString:!0,filterEmptyArray:!0,filterEmptyObject:!0})}makeInstance(){if(!this.options.enabled)return T({enabled:!1,timestamp:!0});let e=this.options.transports,t={level:this.makeGlobalLogLevel(e),enabled:!0,timestamp:!0,transport:{targets:this.makeTransportTargets(e)}};return T(t)}makeTransportTargets(e){if(e.filter(e=>e.type===`console`).length>1)throw Error(`[Logger] Multiple console transports are not supported.`);return e.map(e=>{switch(e.type){case`console`:return this.makeConsoleTransportTarget(e);case`file`:return this.makeFileTransportTarget(e)}})}makeConsoleTransportTarget(e){return{target:`pino-pretty`,level:this.makeTransportLevel(e.level),options:e.pretty}}makeFileTransportTarget(e){let t=this.makeTransportLevel(e.level),n=S.isAbsolute(e.path)?S.normalize(e.path):K(process.cwd(),e.path);return q(S.dirname(n)),{target:`pino/file`,level:t,options:{destination:n}}}makeTransportLevel(e){return this.options.debug?`trace`:e??`info`}makeGlobalLogLevel(e){if(this.options.debug)return`trace`;let t=e.at(0);if(!t)return`info`;let n={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},r=this.makeTransportLevel(t.level);for(let t of e.slice(1)){let e=this.makeTransportLevel(t.level);n[e]<n[r]&&(r=e)}return r}},Vt=class{options;constructor(e){this.options=e}assemble(e){e.bind(L.DI.Logger).toConstantValue(new Y(this.options))}};function Ht(e={}){let t=e.logger??{enabled:!1};return[...jt(),new Vt(t)]}function X(e){return process.env[e]?.trim()||void 0}function Ut(e){let t=X(e);if(!t)throw Error(`Missing required environment variable: ${e}`);return t}const Z=E.string().trim().min(1).transform(e=>{let{prefix:t,base:n}=Wt(e),r=Gt(n);return{original:e,prefix:t,base:n,kebab:Kt(r),snake:qt(r),camel:Jt(r),pascal:Yt(r)}}),Q=E.looseObject({name:Z,version:E.string().trim().min(1),private:E.boolean().optional(),type:E.enum([`module`,`commonjs`]).optional(),dependencies:E.record(E.string(),E.string()).default({}),peerDependencies:E.record(E.string(),E.string()).default({}),devDependencies:E.record(E.string(),E.string()).default({})});function Wt(e){let t=/^@([^/]+)\/(.+)$/.exec(e);return t&&t[2]?{prefix:t[1],base:t[2]}:{base:e}}function Gt(e){let t=e.replace(/([a-z0-9])([A-Z])/g,`$1 $2`).replace(/[^a-zA-Z0-9]+/g,` `).trim().toLowerCase();return t?t.split(/\s+/):[]}function Kt(e){return e.join(`-`)}function qt(e){return e.join(`_`)}function Jt(e){if(e.length===0)return``;let[t,...n]=e;return t+n.map($).join(``)}function Yt(e){return e.map($).join(``)}function $(e){return e.length===0?``:e.charAt(0).toUpperCase()+e.slice(1)}function Xt(e){let t,n;try{t=C.readFileSync(e,`utf8`)}catch(t){throw Error(`Failed to read package.json at ${e}`,{cause:t})}try{n=JSON.parse(t)}catch(t){throw Error(`Failed to parse package.json at ${e}`,{cause:t})}try{return Q.parse(n)}catch(t){throw Error(`Invalid package.json at ${e}`,{cause:t})}}export{st as Console,Mt as LogFlag,Y as LoggerImpl,Q as PackageJSONSchema,Z as PackageNameSchema,Ht as coreNodeAssembly,Pt as createDirectory,Rt as createDirectoryAsync,Ft as createFile,zt as createFileAsync,q as ensureDirectory,J as ensureDirectoryAsync,Xt as loadPackageJSON,Xe as makeDependencyBundlingPolicy,X as optionalEnvironmentVariable,Nt as removePath,Lt as removePathAsync,Ut as requiredEnvironmentVariable,K as resolvePath};
|
|
1
|
+
import{builtinModules as e}from"node:module";import{createConsola as t}from"consola";import{colors as n}from"consola/utils";import r,{promises as i}from"node:fs";import a,{dirname as o}from"node:path";import{fileURLToPath as s}from"node:url";import c from"@dotenvx/dotenvx";import{createJiti as l}from"jiti";import u from"pino";import d from"zod";function f(e,t={}){let n=t.includePeers??!0,r=t.includeDependencies??!0,i=t.includeSubpaths??!0,a=t.includeNodeBuiltins??!0,o=t.allowPeerBundling??!1,s=Object.keys(e.peerDependencies??{}),c=Object.keys(e.dependencies??{}),l=h(t.bundle??[]),u=h(t.external??[]);ie(u,l),oe(l),o||ae(s,l);let d=new Set(l.map(_)),f=n?s.filter(e=>!d.has(e)):[],m=r?c.filter(e=>!d.has(e)):[];return{external:g([...a?ee():[],...p([...f,...m,...u],i)]),bundle:g(p(l,i))}}function ee(){let t=h(e.map(v)),n=t.map(e=>`node:${e}`);return g([...t,...n,/^node:/])}function p(e,t){return t?e.map(e=>m(e)):[...e]}function m(e){return ne(e)?e:RegExp(`^${re(e)}(?:/.*)?$`)}function h(e){return Array.from(new Set(e))}function g(e){let t=new Set,n=[];for(let r of e){let e=te(r);t.has(e)||(t.add(e),n.push(r))}return n}function te(e){return typeof e==`string`?`string:${e}`:`regexp:${e.source}/${e.flags}`}function _(e){if(e.startsWith(`@`)){let[t,n]=e.split(`/`);return t&&n?`${t}/${n}`:e}let[t]=e.split(`/`);return t??e}function v(e){return e.startsWith(`node:`)?e.slice(5):e}function ne(e){return e.includes(`*`)||e.startsWith(`^`)||e.endsWith(`$`)}function re(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ie(e,t){let n=new Set(e.map(_)),r=t.filter(e=>n.has(_(e)));if(r.length!==0)throw Error(`Packages cannot be both external and bundled: ${r.join(`, `)}`)}function ae(e,t){let n=new Set(e),r=t.filter(e=>n.has(_(e)));if(r.length!==0)throw Error(`Peer dependencies must stay external and cannot be bundled by default: ${r.join(`, `)}`)}function oe(t){let n=new Set(e.map(v)),r=t.filter(e=>se(e,n));if(r.length!==0)throw Error(`Node.js built-in modules cannot be bundled: ${r.join(`, `)}`)}function se(e,t){let n=v(e),[r]=n.split(`/`);return r?t.has(r):t.has(n)}const ce=/\u001B\[[0-9;]*m/g;var le=class{instance;constructor(e={}){this.instance=t({level:e.enabled===!1?-999:999,formatOptions:{colors:!0,date:!1}})}title(e,t,r=[]){this.printPanel({title:`${e} ${t}`.trim(),renderedTitle:`${n.cyan(n.bold(e))}${t?` ${n.dim(t)}`:``}`,rows:r,formatValue:n.green})}panel(e,t,r){this.printPanel({title:r===void 0?e:`${e} ${r}`,renderedTitle:`${n.cyan(n.bold(e))}${r===void 0?``:` ${n.green(String(r))}`}`,rows:t,formatValue:n.dim})}step(e,t){return`${n.cyan(e.padEnd(10,` `))}${t}`}duration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(2)}s`}emptyLine(){this.instance.log(``)}log(e,...t){this.instance.log(e,...t)}info(e,...t){this.instance.info(e,...t)}start(e,...t){this.instance.start(e,...t)}success(e,...t){this.instance.success(e,...t)}warn(e,...t){this.instance.warn(e,...t)}error(e,...t){this.instance.error(e,...t)}debug(e,...t){this.instance.debug(e,...t)}printPanel(e){this.instance.log(this.formatPanel(e))}formatPanel(e){let t=this.getPanelWidth(e);return[this.formatPanelTop(e.renderedTitle,t),...e.rows.map(n=>this.formatPanelRow(n,t,e.formatValue)),this.formatPanelBottom(t)].join(`
|
|
2
|
+
`)}formatPanelTop(e,t){let r=Math.max(1,t-this.visibleLength(e)-5);return`${n.dim(`╭─`)} ${e} ${n.dim(`─`.repeat(r))}${n.dim(`╮`)}`}formatPanelBottom(e){return`${n.dim(`╰`)}${n.dim(`─`.repeat(e-2))}${n.dim(`╯`)}`}formatPanelRow(e,t,r){let i=e.label.padEnd(14,` `),a=String(e.value),o=this.visibleLength(i)+this.visibleLength(a)+4,s=Math.max(0,t-o);return`${n.dim(`│`)} ${n.blue(i)}${r(a)}${` `.repeat(s)} ${n.dim(`│`)}`}getPanelWidth(e){return Math.max(48,this.getTitleWidth(e),this.getRowsWidth(e.rows))}getTitleWidth(e){return this.visibleLength(e.title)+6}getRowsWidth(e){return Math.max(0,...e.map(e=>this.getRowWidth(e)))}getRowWidth(e){return 14+this.visibleLength(String(e.value))+4}visibleLength(e){return e.replace(ce,``).length}};function y(e,t){if(a.isAbsolute(t))return a.normalize(t);let n;try{let t=new URL(e);if(t.protocol!==`file:`)throw Error(`Unsupported URL protocol "${t.protocol}"`);n=a.dirname(s(t))}catch{n=e}return a.resolve(n,t)}function ue(e,t={}){let n=y(process.cwd(),e);if(!r.existsSync(n))return;let i=r.statSync(n),{recursive:o=!0,force:s=!0,cleanOnly:c=!1}=t;if(c&&i.isDirectory()){for(let e of r.readdirSync(n))r.rmSync(a.join(n,e),{recursive:o,force:s});return}if(c&&i.isFile()){r.truncateSync(n,0);return}r.rmSync(n,{recursive:i.isDirectory()?o:!1,force:s,maxRetries:3,retryDelay:100})}function b(e){let t=y(process.cwd(),e),n=r.existsSync(t)&&r.statSync(t).isDirectory()?t:a.dirname(t);if(!r.existsSync(n))throw Error(`Directory "${n}" does not exist.`);return t}function de(e){let t=y(process.cwd(),e);a.extname(e)&&console.warn(`[createDirectory] Warning: "${e}" looks like a file path.`);try{if(!r.existsSync(t))r.mkdirSync(t,{recursive:!0});else if(!r.statSync(t).isDirectory())throw Error(`"${t}" exists but is not a directory.`);return t}catch(e){throw Error(`Failed to create directory "${t}": ${e.message}`)}}function fe(e,t=``){let n=y(process.cwd(),e);b(a.dirname(n));let i=pe(n);if(!i)r.writeFileSync(n,t,{encoding:`utf8`,flag:`w`});else{if(!i.isFile())throw Error(`"${n}" exists but is not a file.`);t&&r.writeFileSync(n,t,{encoding:`utf8`,flag:`a`})}return n}function pe(e){try{return r.statSync(e)}catch{return}}async function me(e,t={}){let n=y(process.cwd(),e),r;try{r=await i.stat(n)}catch(e){if((t.force??!0)&&e.code===`ENOENT`)return;throw e}let{recursive:o=!0,force:s=!0,cleanOnly:c=!1}=t;if(c&&r.isDirectory()){let e=await i.readdir(n);for(let t of e)await i.rm(a.join(n,t),{recursive:o,force:s});return}if(c&&r.isFile()){await i.truncate(n,0);return}await i.rm(n,{recursive:r.isDirectory()?o:!1,force:s,maxRetries:3,retryDelay:100})}async function x(e){let t=y(process.cwd(),e),n;try{n=await i.stat(t)}catch{}let r=n?.isDirectory()?t:a.dirname(t);try{if(!(await i.stat(r)).isDirectory())throw Error(`"${r}" exists but is not a directory.`)}catch(e){throw e.code===`ENOENT`?Error(`Directory "${r}" does not exist.`):e}return t}async function he(e){let t=y(process.cwd(),e);a.extname(e)&&console.warn(`[createDirectory] Warning: "${e}" looks like a file path (has extension).`);try{let e;try{e=await i.stat(t)}catch{}if(!e)await i.mkdir(t,{recursive:!0});else if(!e.isDirectory())throw Error(`"${t}" exists but is not a directory.`);return t}catch(e){throw Error(`Failed to create directory "${t}": ${e.message}`)}}async function ge(e,t=``){let n=y(process.cwd(),e);await x(a.dirname(n));try{let e=await _e(n);if(!e)await i.writeFile(n,t,{encoding:`utf8`,flag:`w`});else{if(!e.isFile())throw Error(`"${n}" exists but is not a file.`);t&&await i.writeFile(n,t,{encoding:`utf8`,flag:`a`})}return n}catch(e){throw Error(`Failed to create file "${n}": ${e.message}`)}}async function _e(e){try{return await i.stat(e)}catch(e){if(e.code===`ENOENT`)return;throw e}}function S(e){if(!w(e))throw Error(`Environment registry must be an object.`);let t=Object.entries(e);if(!t.length)throw Error(`At least one environment must be defined.`);for(let[e,n]of t)ve(e,n);return e}function C(e,t,n={}){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`Environment "${t}" is not defined.`);let r=e[t];if(!r)throw Error(`Environment "${t}" is not defined.`);let i=y(n.baseDir?.trim()||process.cwd(),r.fileDir?.trim()||`.`);return{name:t,file:r.file?.trim()||void 0,fileDir:i}}function ve(e,t){if(!e.trim())throw Error(`Environment name must not be empty.`);if(!w(t))throw Error(`Environment definition must be an object for "${e}".`);if(t.file!==void 0&&(typeof t.file!=`string`||!t.file.trim()))throw Error(`Environment file must not be empty for "${e}".`);if(t.fileDir!==void 0&&(typeof t.fileDir!=`string`||!t.fileDir.trim()))throw Error(`Environment file directory must not be empty for "${e}".`)}function w(e){if(!e||typeof e!=`object`)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}const T=Symbol.for(`buildplease.environment-configuration.field`),E=Symbol.for(`buildplease.environment-configuration.contract`),D=Symbol.for(`buildplease.environment-configuration.binding`),O=Symbol.for(`buildplease.environment-configuration.config`),ye={string(){return M((e,t)=>{if(typeof e!=`string`)throw Error(`${t} must be string.`);let n=e.trim();if(!n)throw Error(`${t} must not be empty.`);return n},{required:!0})},number(){return M((e,t)=>{let n=typeof e==`number`?e:Number(e);if(!Number.isFinite(n))throw Error(`${t} must be number.`);return n},{required:!0})},boolean(){return M((e,t)=>{if(typeof e==`boolean`)return e;if(typeof e==`string`){let t=e.trim().toLowerCase();if(t===`true`)return!0;if(t===`false`)return!1}throw Error(`${t} must be boolean.`)},{required:!0})},array(e){return M((t,n)=>{if(!Array.isArray(t))throw Error(`${n} must be array.`);return t.map((t,r)=>e.parse(t,`${n}[${r}]`))},{required:!0})},custom(){return M(e=>e,{required:!0})}};function be(e,t){let n=e.trim();if(!n)throw Error(`Configuration key must not be empty.`);let r=(e=>{let t={contract:r,input:e};return Object.defineProperty(t,D,{value:!0}),t});return Object.defineProperties(r,{[E]:{value:!0},key:{value:n},schema:{value:t}}),r}function xe(e,t){let n={environments:S(e),input:t};return Object.defineProperty(n,O,{value:!0}),n}function k(e){return!!(e&&typeof e==`object`&&e[O]===!0)}function A(e){return!!(e&&typeof e==`object`&&e[T]===!0)}function Se(e){return typeof e==`function`&&e[E]===!0}function j(e){return!!(e&&typeof e==`object`&&e[D]===!0)}function M(e,t){let n={required:t.required,hasDefault:t.hasDefault??!1,defaultValue:t.defaultValue,parse:e,optional(){return M((t,n)=>{if(t!=null)return e(t,n)},{required:!1})},default(t){return M(e,{required:!1,hasDefault:!0,defaultValue:t})},map(n){let r=t.hasDefault&&t.defaultValue!==void 0?n(t.defaultValue):void 0;return M((t,r)=>n(e(t,r)),{required:t.required,hasDefault:t.hasDefault,defaultValue:r})}};return Object.defineProperty(n,T,{value:!0}),n}function N(e){return process.env[e]?.trim()||void 0}function Ce(){let e=N(`BUILDPLEASE_ENVIRONMENT`);if(!e)throw Error(`BuildPlease environment is not selected.`);return e}const P=Symbol.for(`buildplease.environment-configuration.source`);function we(e){return{env(e){return I(`env`,{name:e})},byEnvironment(e){return I(`by-environment`,{cases:e})},compute(e){return I(`compute`,{compute:e})},static(e){return I(`static`,{value:e})}}}function F(e){return!!(e&&typeof e==`object`&&e[P]===!0)}function I(e,t,n=[]){let r={kind:e,options:t,transforms:n,default(e){return I(`default`,{source:r,value:e})},map(r){return I(e,t,[...n,r])}};return Object.defineProperty(r,P,{value:!0}),r}async function Te(e={}){return z(e)}async function Ee(e={}){let t=Ce(),n=await z(e);try{let e=C(n.config.environments,t,{baseDir:o(n.configFilePath)});return ke(e),{...n,environment:e}}catch(e){throw V(e)}}async function De(e,t){let n=G(t,`config`);return U(e.input,n,`config`)}async function L(e,t,n={}){let r=Ae(n);return H(e.schema,t,r,e.key)}async function R(e,t={}){return L(e.contract,e.input,t)}async function z(e){let t=Oe(e.dir);try{let e=y(t,`environment.config.ts`);if(!r.existsSync(e))throw Error(`Config file "${e}" does not exist.`);let n=await B(t,e);if(!k(n))throw Error(`Environment config must be defined with defineConfig() (${e}).`);return{config:n,configFilePath:e,rootDir:t}}catch(e){throw V(e)}}function Oe(e){let t=e?y(process.cwd(),e):process.cwd();return b(t),t}async function B(e,t){return l(e,{interopDefault:!0,extensions:[`.ts`],tsconfigPaths:!0}).import(t,{default:!0})}function ke(e){if(!e.file)return;let t=y(e.fileDir,e.file);r.existsSync(t)&&c.config({path:t,overload:!1,quiet:!0})}function V(e){return Error(`Failed to load environment config: ${e instanceof Error?e.message:String(e)}`,{cause:e})}function Ae(e){return{buildMetadata:e.buildMetadata,environment:e.environment}}async function H(e,t,n,r){if(A(e))return je(e,t,n,r);let i=await U(t,n,r)??{};if(!q(i))throw Error(`${r} must be object.`);let a={};for(let[t,o]of Object.entries(e))a[t]=await H(o,i[t],n,`${r}.${t}`);return a}async function je(e,t,n,r){let i=await U(t,n,r);if(i==null){if(e.hasDefault)return K(e.defaultValue);if(!e.required)return;throw Error(`Missing required configuration: ${r}`)}return e.parse(i,r)}async function U(e,t,n){if(F(e))return W(e,t,n);if(j(e))return R(e,t);if(Array.isArray(e))return Promise.all(e.map((e,r)=>U(e,t,`${n}[${r}]`)));if(q(e)){let r={};for(let[i,a]of Object.entries(e))r[i]=await U(a,t,`${n}.${i}`);return r}return e}async function W(e,t,n){let r;switch(e.kind){case`env`:{let{name:t}=e.options;r=N(t);break}case`by-environment`:{let i=Me(t,n),{cases:a}=e.options;if(!Object.prototype.hasOwnProperty.call(a,i.name))throw Error(`${n} has no value for environment "${i.name}".`);r=await U(a[i.name],t,n);break}case`compute`:{let i=G(t,n),{compute:a}=e.options;r=await a(i);break}case`static`:{let{value:t}=e.options;r=t;break}case`default`:{let{source:i,value:a}=e.options;r=await W(i,t,n)??K(a);break}}for(let t of e.transforms)r=await t(r);return r}function Me(e,t){if(!e?.environment)throw Error(`${t} requires runtime environment.`);return e.environment}function G(e,t){if(!e?.environment)throw Error(`${t} requires runtime environment.`);if(!e.buildMetadata)throw Error(`${t} requires build metadata.`);return e}function K(e){if(Array.isArray(e))return e.map(e=>K(e));if(q(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=K(r);return t}return e}function q(e){if(!e||typeof e!=`object`||Object.prototype.toString.call(e)!==`[object Object]`)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}let Ne=function(e){return e.Critical=`CRITICAL`,e.Serious=`SERIOUS`,e.Important=`IMPORTANT`,e.Notice=`NOTICE`,e.Routine=`ROUTINE`,e}({});function Pe(e){return e instanceof Error}function J(e,t={}){if(e==null)return{};let{filterNull:n=!0,filterUndefined:r=!0,filterEmptyString:i=!1,filterEmptyObject:a=!1,filterEmptyArray:o=!1}=t;return Object.keys(e).reduce((s,c)=>{let l=e[c];return Y(l)&&Object.getPrototypeOf(l)===null&&(l=void 0),Fe(l)&&(l=J(l,t)),n&&l===null||r&&l===void 0||i&&l===``||a&&X(l)||o&&Array.isArray(l)&&l.length===0||(s[c]=l),s},{})}function Y(e){return typeof e==`object`&&!!e}function X(e){return Y(e)&&Object.keys(e).length===0}function Fe(e){return Y(e)&&Object.getPrototypeOf(e)===Object.prototype}function Ie(e){return e==null||[`string`,`number`,`boolean`,`bigint`,`symbol`].includes(typeof e)}Array.prototype.isEmpty=function(){return this==null||this.length===0},String.prototype.capitalized=function(){let e=this==null?``:this.toString();return e.trim()?e.charAt(0).toUpperCase()+e.slice(1):``};var Le=class{options;instance;constructor(e){this.options=e,this.instance=this.makeInstance()}info(e,t){this.log(`info`,e,t)}debug(e,t){this.log(`debug`,e,t)}trace(e,t){this.log(`trace`,e,t)}warn(e,t){this.log(`warn`,e,t)}error(e,t){this.log(`error`,e,t)}fatal(e,t){this.log(`fatal`,e,t)}child(e){return this.instance.child(e)}log(e,t,n){this.instance[e]({msg:t,...this.formatLogOptions(n)})}formatLogOptions(e){return e?this.normalizeObject({flag:e.flag,details:this.formatUnknown(e.details),error:this.formatUnknown(e.error),metadata:this.formatUnknown(e.metadata)}):{}}formatUnknown(e){if(Pe(e)){let t={type:e.constructor.name,message:e.message};this.options.debug&&e.stack&&(t.stack=e.stack);for(let[n,r]of Object.entries(e))n in t||(t[n]=r);let n=this.normalizeObject(t);return X(n)?void 0:n}if(Buffer.isBuffer(e))return`[Buffer]`;if(e&&typeof e.pipe==`function`)return`[Stream]`;if(Y(e))try{let t=JSON.stringify(e);if(t===void 0)return;let n=JSON.parse(t);if(Array.isArray(n))return n.length>0?n:void 0;if(Y(n)){let e=this.normalizeObject(n);return X(e)?void 0:e}return n}catch{return{type:`NonSerializableObject`}}return Ie(e)?e:String(e)}normalizeObject(e){return J(Object.fromEntries(Object.entries(e)),{filterNull:!0,filterUndefined:!0,filterEmptyString:!0,filterEmptyArray:!0,filterEmptyObject:!0})}makeInstance(){if(!this.options.enabled)return u({enabled:!1,timestamp:!0});let e=this.options.transports,t={level:this.makeGlobalLogLevel(e),enabled:!0,timestamp:!0,transport:{targets:this.makeTransportTargets(e)}};return u(t)}makeTransportTargets(e){if(e.filter(e=>e.type===`console`).length>1)throw Error(`[Logger] Multiple console transports are not supported.`);return e.map(e=>{switch(e.type){case`console`:return this.makeConsoleTransportTarget(e);case`file`:return this.makeFileTransportTarget(e)}})}makeConsoleTransportTarget(e){return{target:`pino-pretty`,level:this.makeTransportLevel(e.level),options:e.pretty}}makeFileTransportTarget(e){let t=this.makeTransportLevel(e.level),n=a.isAbsolute(e.path)?a.normalize(e.path):y(process.cwd(),e.path);return b(a.dirname(n)),{target:`pino/file`,level:t,options:{destination:n}}}makeTransportLevel(e){return this.options.debug?`trace`:e??`info`}makeGlobalLogLevel(e){if(this.options.debug)return`trace`;let t=e.at(0);if(!t)return`info`;let n={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},r=this.makeTransportLevel(t.level);for(let t of e.slice(1)){let e=this.makeTransportLevel(t.level);n[e]<n[r]&&(r=e)}return r}};const Z=d.string().trim().min(1).transform(e=>{let{prefix:t,base:n}=Re(e),r=ze(n);return{original:e,prefix:t,base:n,kebab:Be(r),snake:Ve(r),camel:He(r),pascal:Ue(r)}}),Q=d.looseObject({name:Z,version:d.string().trim().min(1),private:d.boolean().optional(),type:d.enum([`module`,`commonjs`]).optional(),dependencies:d.record(d.string(),d.string()).default({}),peerDependencies:d.record(d.string(),d.string()).default({}),devDependencies:d.record(d.string(),d.string()).default({})});function Re(e){let t=/^@([^/]+)\/(.+)$/.exec(e);return t&&t[2]?{prefix:t[1],base:t[2]}:{base:e}}function ze(e){let t=e.replace(/([a-z0-9])([A-Z])/g,`$1 $2`).replace(/[^a-zA-Z0-9]+/g,` `).trim().toLowerCase();return t?t.split(/\s+/):[]}function Be(e){return e.join(`-`)}function Ve(e){return e.join(`_`)}function He(e){if(e.length===0)return``;let[t,...n]=e;return t+n.map($).join(``)}function Ue(e){return e.map($).join(``)}function $(e){return e.length===0?``:e.charAt(0).toUpperCase()+e.slice(1)}function We(e){let t,n;try{t=r.readFileSync(e,`utf8`)}catch(t){throw Error(`Failed to read package.json at ${e}`,{cause:t})}try{n=JSON.parse(t)}catch(t){throw Error(`Failed to parse package.json at ${e}`,{cause:t})}try{return Q.parse(n)}catch(t){throw Error(`Invalid package.json at ${e}`,{cause:t})}}export{le as Console,Ne as LogFlag,Le as LoggerImpl,Q as PackageJSONSchema,Z as PackageNameSchema,de as createDirectory,he as createDirectoryAsync,fe as createFile,ge as createFileAsync,xe as defineConfig,be as defineConfiguration,S as defineEnvironments,we as defineSource,b as ensureDirectory,x as ensureDirectoryAsync,ye as field,k as isConfigDefinition,j as isConfigurationBinding,Se as isConfigurationContract,A as isConfigurationField,F as isConfigurationSource,Te as loadEnvironmentConfig,We as loadPackageJSON,Ee as loadSelectedEnvironmentConfig,f as makeDependencyBundlingPolicy,ue as removePath,me as removePathAsync,De as resolveConfig,L as resolveConfiguration,R as resolveConfigurationBinding,C as resolveEnvironment,y as resolvePath};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=`BUILDPLEASE_ENVIRONMENT`;function t(t,n){let r=process.env[e];process.env[e]=t;let i=()=>{r===void 0?delete process.env[e]:process.env[e]=r};try{let e=n();return e instanceof Promise?e.finally(i):(i(),e)}catch(e){throw i(),e}}exports.withSelectedEnvironment=t;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
//#region src-test/selected-environment.d.ts
|
|
2
|
+
declare function withSelectedEnvironment<T>(environment: string, run: () => Promise<T>): Promise<T>;
|
|
3
|
+
declare function withSelectedEnvironment<T>(environment: string, run: () => T): T;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { withSelectedEnvironment };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
//#region src-test/selected-environment.d.ts
|
|
2
|
+
declare function withSelectedEnvironment<T>(environment: string, run: () => Promise<T>): Promise<T>;
|
|
3
|
+
declare function withSelectedEnvironment<T>(environment: string, run: () => T): T;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { withSelectedEnvironment };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=`BUILDPLEASE_ENVIRONMENT`;function t(t,n){let r=process.env[e];process.env[e]=t;let i=()=>{r===void 0?delete process.env[e]:process.env[e]=r};try{let e=n();return e instanceof Promise?e.finally(i):(i(),e)}catch(e){throw i(),e}}export{t as withSelectedEnvironment};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buildplease/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"keywords": [],
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -31,27 +31,33 @@
|
|
|
31
31
|
"default": "./dist/src-node/index.cjs"
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
|
-
"./
|
|
34
|
+
"./test": {
|
|
35
35
|
"import": {
|
|
36
|
-
"types": "./dist/src-
|
|
37
|
-
"default": "./dist/src-
|
|
36
|
+
"types": "./dist/src-test/index.d.mts",
|
|
37
|
+
"default": "./dist/src-test/index.mjs"
|
|
38
38
|
},
|
|
39
39
|
"require": {
|
|
40
|
-
"types": "./dist/src-
|
|
41
|
-
"default": "./dist/src-
|
|
40
|
+
"types": "./dist/src-test/index.d.cts",
|
|
41
|
+
"default": "./dist/src-test/index.cjs"
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
|
+
"bin": {
|
|
46
|
+
"buildplease": "./bin/buildplease.mjs"
|
|
47
|
+
},
|
|
45
48
|
"files": [
|
|
49
|
+
"bin",
|
|
46
50
|
"dist",
|
|
47
51
|
"resources"
|
|
48
52
|
],
|
|
49
53
|
"dependencies": {
|
|
54
|
+
"@dotenvx/dotenvx": "2.21.0",
|
|
50
55
|
"async-mutex": "0.5.0",
|
|
51
56
|
"bcryptjs": "3.0.3",
|
|
52
57
|
"consola": "3.4.2",
|
|
53
58
|
"date-fns": "4.4.0",
|
|
54
59
|
"date-fns-tz": "3.2.0",
|
|
60
|
+
"jiti": "2.7.0",
|
|
55
61
|
"ms": "2.1.3",
|
|
56
62
|
"pino": "10.3.1",
|
|
57
63
|
"pino-pretty": "13.1.3"
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));let c=require("consola"),l=require("consola/utils"),u=require("node:path");u=s(u,1);let d=require("node:fs");d=s(d,1);let f=require("node:url"),p=require("pino");p=s(p,1);const m=/\u001B\[[0-9;]*m/g;var h=class{instance;constructor(e={}){this.instance=(0,c.createConsola)({level:e.enabled===!1?-999:999,formatOptions:{colors:!0,date:!1}})}title(e,t,n=[]){this.printPanel({title:`${e} ${t}`.trim(),renderedTitle:`${l.colors.cyan(l.colors.bold(e))}${t?` ${l.colors.dim(t)}`:``}`,rows:n,formatValue:l.colors.green})}panel(e,t,n){this.printPanel({title:n===void 0?e:`${e} ${n}`,renderedTitle:`${l.colors.cyan(l.colors.bold(e))}${n===void 0?``:` ${l.colors.green(String(n))}`}`,rows:t,formatValue:l.colors.dim})}step(e,t){return`${l.colors.cyan(e.padEnd(10,` `))}${t}`}duration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(2)}s`}emptyLine(){this.instance.log(``)}log(e,...t){this.instance.log(e,...t)}info(e,...t){this.instance.info(e,...t)}start(e,...t){this.instance.start(e,...t)}success(e,...t){this.instance.success(e,...t)}warn(e,...t){this.instance.warn(e,...t)}error(e,...t){this.instance.error(e,...t)}debug(e,...t){this.instance.debug(e,...t)}printPanel(e){this.instance.log(this.formatPanel(e))}formatPanel(e){let t=this.getPanelWidth(e);return[this.formatPanelTop(e.renderedTitle,t),...e.rows.map(n=>this.formatPanelRow(n,t,e.formatValue)),this.formatPanelBottom(t)].join(`
|
|
2
|
-
`)}formatPanelTop(e,t){let n=Math.max(1,t-this.visibleLength(e)-5);return`${l.colors.dim(`╭─`)} ${e} ${l.colors.dim(`─`.repeat(n))}${l.colors.dim(`╮`)}`}formatPanelBottom(e){return`${l.colors.dim(`╰`)}${l.colors.dim(`─`.repeat(e-2))}${l.colors.dim(`╯`)}`}formatPanelRow(e,t,n){let r=e.label.padEnd(14,` `),i=String(e.value),a=this.visibleLength(r)+this.visibleLength(i)+4,o=Math.max(0,t-a);return`${l.colors.dim(`│`)} ${l.colors.blue(r)}${n(i)}${` `.repeat(o)} ${l.colors.dim(`│`)}`}getPanelWidth(e){return Math.max(48,this.getTitleWidth(e),this.getRowsWidth(e.rows))}getTitleWidth(e){return this.visibleLength(e.title)+6}getRowsWidth(e){return Math.max(0,...e.map(e=>this.getRowWidth(e)))}getRowWidth(e){return 14+this.visibleLength(String(e.value))+4}visibleLength(e){return e.replace(m,``).length}};function g(){return new h({enabled:!1})}function _(e,t){if(u.default.isAbsolute(t))return u.default.normalize(t);let n;try{let t=new URL(e);if(t.protocol!==`file:`)throw Error(`Unsupported URL protocol "${t.protocol}"`);n=u.default.dirname((0,f.fileURLToPath)(t))}catch{n=e}return u.default.resolve(n,t)}function v(e){let t=_(process.cwd(),e),n=d.default.existsSync(t)&&d.default.statSync(t).isDirectory()?t:u.default.dirname(t);if(!d.default.existsSync(n))throw Error(`Directory "${n}" does not exist.`);return t}function y(e){return e instanceof Error}function b(e,t={}){if(e==null)return{};let{filterNull:n=!0,filterUndefined:r=!0,filterEmptyString:i=!1,filterEmptyObject:a=!1,filterEmptyArray:o=!1}=t;return Object.keys(e).reduce((s,c)=>{let l=e[c];return x(l)&&Object.getPrototypeOf(l)===null&&(l=void 0),C(l)&&(l=b(l,t)),n&&l===null||r&&l===void 0||i&&l===``||a&&S(l)||o&&Array.isArray(l)&&l.length===0||(s[c]=l),s},{})}function x(e){return typeof e==`object`&&!!e}function S(e){return x(e)&&Object.keys(e).length===0}function C(e){return x(e)&&Object.getPrototypeOf(e)===Object.prototype}function w(e){return e==null||[`string`,`number`,`boolean`,`bigint`,`symbol`].includes(typeof e)}Array.prototype.isEmpty=function(){return this==null||this.length===0},String.prototype.capitalized=function(){let e=this==null?``:this.toString();return e.trim()?e.charAt(0).toUpperCase()+e.slice(1):``};var T=class{options;instance;constructor(e){this.options=e,this.instance=this.makeInstance()}info(e,t){this.log(`info`,e,t)}debug(e,t){this.log(`debug`,e,t)}trace(e,t){this.log(`trace`,e,t)}warn(e,t){this.log(`warn`,e,t)}error(e,t){this.log(`error`,e,t)}fatal(e,t){this.log(`fatal`,e,t)}child(e){return this.instance.child(e)}log(e,t,n){this.instance[e]({msg:t,...this.formatLogOptions(n)})}formatLogOptions(e){return e?this.normalizeObject({flag:e.flag,details:this.formatUnknown(e.details),error:this.formatUnknown(e.error),metadata:this.formatUnknown(e.metadata)}):{}}formatUnknown(e){if(y(e)){let t={type:e.constructor.name,message:e.message};this.options.debug&&e.stack&&(t.stack=e.stack);for(let[n,r]of Object.entries(e))n in t||(t[n]=r);let n=this.normalizeObject(t);return S(n)?void 0:n}if(Buffer.isBuffer(e))return`[Buffer]`;if(e&&typeof e.pipe==`function`)return`[Stream]`;if(x(e))try{let t=JSON.stringify(e);if(t===void 0)return;let n=JSON.parse(t);if(Array.isArray(n))return n.length>0?n:void 0;if(x(n)){let e=this.normalizeObject(n);return S(e)?void 0:e}return n}catch{return{type:`NonSerializableObject`}}return w(e)?e:String(e)}normalizeObject(e){return b(Object.fromEntries(Object.entries(e)),{filterNull:!0,filterUndefined:!0,filterEmptyString:!0,filterEmptyArray:!0,filterEmptyObject:!0})}makeInstance(){if(!this.options.enabled)return(0,p.default)({enabled:!1,timestamp:!0});let e=this.options.transports,t={level:this.makeGlobalLogLevel(e),enabled:!0,timestamp:!0,transport:{targets:this.makeTransportTargets(e)}};return(0,p.default)(t)}makeTransportTargets(e){if(e.filter(e=>e.type===`console`).length>1)throw Error(`[Logger] Multiple console transports are not supported.`);return e.map(e=>{switch(e.type){case`console`:return this.makeConsoleTransportTarget(e);case`file`:return this.makeFileTransportTarget(e)}})}makeConsoleTransportTarget(e){return{target:`pino-pretty`,level:this.makeTransportLevel(e.level),options:e.pretty}}makeFileTransportTarget(e){let t=this.makeTransportLevel(e.level),n=u.default.isAbsolute(e.path)?u.default.normalize(e.path):_(process.cwd(),e.path);return v(u.default.dirname(n)),{target:`pino/file`,level:t,options:{destination:n}}}makeTransportLevel(e){return this.options.debug?`trace`:e??`info`}makeGlobalLogLevel(e){if(this.options.debug)return`trace`;let t=e.at(0);if(!t)return`info`;let n={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},r=this.makeTransportLevel(t.level);for(let t of e.slice(1)){let e=this.makeTransportLevel(t.level);n[e]<n[r]&&(r=e)}return r}};function E(e={enabled:!1}){return new T(e)}exports.makeConsoleFixture=g,exports.makeLoggerFixture=E;
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { Bindings, Level, Logger } from "pino";
|
|
2
|
-
import { PrettyOptions } from "pino-pretty";
|
|
3
|
-
//#region src-node/console/console-options.d.ts
|
|
4
|
-
interface ConsoleOptions {
|
|
5
|
-
readonly enabled?: boolean;
|
|
6
|
-
}
|
|
7
|
-
//#endregion
|
|
8
|
-
//#region src-node/console/console.d.ts
|
|
9
|
-
interface ConsolePanelRow {
|
|
10
|
-
readonly label: string;
|
|
11
|
-
readonly value: string | number;
|
|
12
|
-
}
|
|
13
|
-
declare class Console {
|
|
14
|
-
private readonly instance;
|
|
15
|
-
constructor(options?: ConsoleOptions);
|
|
16
|
-
title(product: string, command: string, rows?: readonly ConsolePanelRow[]): void;
|
|
17
|
-
panel(title: string, rows: readonly ConsolePanelRow[], badge?: string | number): void;
|
|
18
|
-
step(label: string, message: string): string;
|
|
19
|
-
duration(ms: number): string;
|
|
20
|
-
emptyLine(): void;
|
|
21
|
-
log(message?: unknown, ...args: unknown[]): void;
|
|
22
|
-
info(message?: unknown, ...args: unknown[]): void;
|
|
23
|
-
start(message?: unknown, ...args: unknown[]): void;
|
|
24
|
-
success(message?: unknown, ...args: unknown[]): void;
|
|
25
|
-
warn(message?: unknown, ...args: unknown[]): void;
|
|
26
|
-
error(message?: unknown, ...args: unknown[]): void;
|
|
27
|
-
debug(message?: unknown, ...args: unknown[]): void;
|
|
28
|
-
private printPanel;
|
|
29
|
-
private formatPanel;
|
|
30
|
-
private formatPanelTop;
|
|
31
|
-
private formatPanelBottom;
|
|
32
|
-
private formatPanelRow;
|
|
33
|
-
private getPanelWidth;
|
|
34
|
-
private getTitleWidth;
|
|
35
|
-
private getRowsWidth;
|
|
36
|
-
private getRowWidth;
|
|
37
|
-
private visibleLength;
|
|
38
|
-
}
|
|
39
|
-
//#endregion
|
|
40
|
-
//#region src-node-test/console.d.ts
|
|
41
|
-
declare function makeConsoleFixture(): Console;
|
|
42
|
-
//#endregion
|
|
43
|
-
//#region src-node/logger/log-flag.d.ts
|
|
44
|
-
declare enum LogFlag {
|
|
45
|
-
Critical = "CRITICAL",
|
|
46
|
-
Serious = "SERIOUS",
|
|
47
|
-
Important = "IMPORTANT",
|
|
48
|
-
Notice = "NOTICE",
|
|
49
|
-
Routine = "ROUTINE"
|
|
50
|
-
}
|
|
51
|
-
//#endregion
|
|
52
|
-
//#region src-node/logger/log-options.d.ts
|
|
53
|
-
interface LogOptions {
|
|
54
|
-
readonly flag?: LogFlag;
|
|
55
|
-
readonly details?: unknown;
|
|
56
|
-
readonly error?: unknown;
|
|
57
|
-
readonly metadata?: unknown;
|
|
58
|
-
}
|
|
59
|
-
//#endregion
|
|
60
|
-
//#region src-node/logger/logger-options.d.ts
|
|
61
|
-
interface BaseLoggerTransportOptions {
|
|
62
|
-
readonly level?: Level;
|
|
63
|
-
}
|
|
64
|
-
interface LoggerConsoleTransportOptions extends BaseLoggerTransportOptions {
|
|
65
|
-
readonly type: 'console';
|
|
66
|
-
readonly target: 'pino-pretty';
|
|
67
|
-
readonly pretty?: PrettyOptions;
|
|
68
|
-
}
|
|
69
|
-
interface LoggerFileTransportOptions extends BaseLoggerTransportOptions {
|
|
70
|
-
readonly type: 'file';
|
|
71
|
-
readonly path: string;
|
|
72
|
-
}
|
|
73
|
-
type LoggerTransportOptions = LoggerConsoleTransportOptions | LoggerFileTransportOptions;
|
|
74
|
-
type LoggerOptions = {
|
|
75
|
-
readonly enabled: false;
|
|
76
|
-
readonly debug?: boolean;
|
|
77
|
-
readonly transports?: never;
|
|
78
|
-
} | {
|
|
79
|
-
readonly enabled: true;
|
|
80
|
-
readonly debug?: boolean;
|
|
81
|
-
readonly transports: readonly [LoggerTransportOptions, ...LoggerTransportOptions[]];
|
|
82
|
-
};
|
|
83
|
-
//#endregion
|
|
84
|
-
//#region src-node/logger/logger.d.ts
|
|
85
|
-
interface Logger$1 {
|
|
86
|
-
readonly instance: Logger;
|
|
87
|
-
info(title: string, options?: LogOptions): void;
|
|
88
|
-
debug(title: string, options?: LogOptions): void;
|
|
89
|
-
trace(title: string, options?: LogOptions): void;
|
|
90
|
-
warn(title: string, options?: LogOptions): void;
|
|
91
|
-
error(title: string, options?: LogOptions): void;
|
|
92
|
-
fatal(title: string, options?: LogOptions): void;
|
|
93
|
-
child(bindings: Bindings): Logger;
|
|
94
|
-
}
|
|
95
|
-
//#endregion
|
|
96
|
-
//#region src-node-test/logger.d.ts
|
|
97
|
-
declare function makeLoggerFixture(options?: LoggerOptions): Logger$1;
|
|
98
|
-
//#endregion
|
|
99
|
-
export { makeConsoleFixture, makeLoggerFixture };
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { Bindings, Level, Logger } from "pino";
|
|
2
|
-
import { PrettyOptions } from "pino-pretty";
|
|
3
|
-
//#region src-node/console/console-options.d.ts
|
|
4
|
-
interface ConsoleOptions {
|
|
5
|
-
readonly enabled?: boolean;
|
|
6
|
-
}
|
|
7
|
-
//#endregion
|
|
8
|
-
//#region src-node/console/console.d.ts
|
|
9
|
-
interface ConsolePanelRow {
|
|
10
|
-
readonly label: string;
|
|
11
|
-
readonly value: string | number;
|
|
12
|
-
}
|
|
13
|
-
declare class Console {
|
|
14
|
-
private readonly instance;
|
|
15
|
-
constructor(options?: ConsoleOptions);
|
|
16
|
-
title(product: string, command: string, rows?: readonly ConsolePanelRow[]): void;
|
|
17
|
-
panel(title: string, rows: readonly ConsolePanelRow[], badge?: string | number): void;
|
|
18
|
-
step(label: string, message: string): string;
|
|
19
|
-
duration(ms: number): string;
|
|
20
|
-
emptyLine(): void;
|
|
21
|
-
log(message?: unknown, ...args: unknown[]): void;
|
|
22
|
-
info(message?: unknown, ...args: unknown[]): void;
|
|
23
|
-
start(message?: unknown, ...args: unknown[]): void;
|
|
24
|
-
success(message?: unknown, ...args: unknown[]): void;
|
|
25
|
-
warn(message?: unknown, ...args: unknown[]): void;
|
|
26
|
-
error(message?: unknown, ...args: unknown[]): void;
|
|
27
|
-
debug(message?: unknown, ...args: unknown[]): void;
|
|
28
|
-
private printPanel;
|
|
29
|
-
private formatPanel;
|
|
30
|
-
private formatPanelTop;
|
|
31
|
-
private formatPanelBottom;
|
|
32
|
-
private formatPanelRow;
|
|
33
|
-
private getPanelWidth;
|
|
34
|
-
private getTitleWidth;
|
|
35
|
-
private getRowsWidth;
|
|
36
|
-
private getRowWidth;
|
|
37
|
-
private visibleLength;
|
|
38
|
-
}
|
|
39
|
-
//#endregion
|
|
40
|
-
//#region src-node-test/console.d.ts
|
|
41
|
-
declare function makeConsoleFixture(): Console;
|
|
42
|
-
//#endregion
|
|
43
|
-
//#region src-node/logger/log-flag.d.ts
|
|
44
|
-
declare enum LogFlag {
|
|
45
|
-
Critical = "CRITICAL",
|
|
46
|
-
Serious = "SERIOUS",
|
|
47
|
-
Important = "IMPORTANT",
|
|
48
|
-
Notice = "NOTICE",
|
|
49
|
-
Routine = "ROUTINE"
|
|
50
|
-
}
|
|
51
|
-
//#endregion
|
|
52
|
-
//#region src-node/logger/log-options.d.ts
|
|
53
|
-
interface LogOptions {
|
|
54
|
-
readonly flag?: LogFlag;
|
|
55
|
-
readonly details?: unknown;
|
|
56
|
-
readonly error?: unknown;
|
|
57
|
-
readonly metadata?: unknown;
|
|
58
|
-
}
|
|
59
|
-
//#endregion
|
|
60
|
-
//#region src-node/logger/logger-options.d.ts
|
|
61
|
-
interface BaseLoggerTransportOptions {
|
|
62
|
-
readonly level?: Level;
|
|
63
|
-
}
|
|
64
|
-
interface LoggerConsoleTransportOptions extends BaseLoggerTransportOptions {
|
|
65
|
-
readonly type: 'console';
|
|
66
|
-
readonly target: 'pino-pretty';
|
|
67
|
-
readonly pretty?: PrettyOptions;
|
|
68
|
-
}
|
|
69
|
-
interface LoggerFileTransportOptions extends BaseLoggerTransportOptions {
|
|
70
|
-
readonly type: 'file';
|
|
71
|
-
readonly path: string;
|
|
72
|
-
}
|
|
73
|
-
type LoggerTransportOptions = LoggerConsoleTransportOptions | LoggerFileTransportOptions;
|
|
74
|
-
type LoggerOptions = {
|
|
75
|
-
readonly enabled: false;
|
|
76
|
-
readonly debug?: boolean;
|
|
77
|
-
readonly transports?: never;
|
|
78
|
-
} | {
|
|
79
|
-
readonly enabled: true;
|
|
80
|
-
readonly debug?: boolean;
|
|
81
|
-
readonly transports: readonly [LoggerTransportOptions, ...LoggerTransportOptions[]];
|
|
82
|
-
};
|
|
83
|
-
//#endregion
|
|
84
|
-
//#region src-node/logger/logger.d.ts
|
|
85
|
-
interface Logger$1 {
|
|
86
|
-
readonly instance: Logger;
|
|
87
|
-
info(title: string, options?: LogOptions): void;
|
|
88
|
-
debug(title: string, options?: LogOptions): void;
|
|
89
|
-
trace(title: string, options?: LogOptions): void;
|
|
90
|
-
warn(title: string, options?: LogOptions): void;
|
|
91
|
-
error(title: string, options?: LogOptions): void;
|
|
92
|
-
fatal(title: string, options?: LogOptions): void;
|
|
93
|
-
child(bindings: Bindings): Logger;
|
|
94
|
-
}
|
|
95
|
-
//#endregion
|
|
96
|
-
//#region src-node-test/logger.d.ts
|
|
97
|
-
declare function makeLoggerFixture(options?: LoggerOptions): Logger$1;
|
|
98
|
-
//#endregion
|
|
99
|
-
export { makeConsoleFixture, makeLoggerFixture };
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{createConsola as e}from"consola";import{colors as t}from"consola/utils";import n from"node:path";import r from"node:fs";import{fileURLToPath as i}from"node:url";import a from"pino";const o=/\u001B\[[0-9;]*m/g;var s=class{instance;constructor(t={}){this.instance=e({level:t.enabled===!1?-999:999,formatOptions:{colors:!0,date:!1}})}title(e,n,r=[]){this.printPanel({title:`${e} ${n}`.trim(),renderedTitle:`${t.cyan(t.bold(e))}${n?` ${t.dim(n)}`:``}`,rows:r,formatValue:t.green})}panel(e,n,r){this.printPanel({title:r===void 0?e:`${e} ${r}`,renderedTitle:`${t.cyan(t.bold(e))}${r===void 0?``:` ${t.green(String(r))}`}`,rows:n,formatValue:t.dim})}step(e,n){return`${t.cyan(e.padEnd(10,` `))}${n}`}duration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(2)}s`}emptyLine(){this.instance.log(``)}log(e,...t){this.instance.log(e,...t)}info(e,...t){this.instance.info(e,...t)}start(e,...t){this.instance.start(e,...t)}success(e,...t){this.instance.success(e,...t)}warn(e,...t){this.instance.warn(e,...t)}error(e,...t){this.instance.error(e,...t)}debug(e,...t){this.instance.debug(e,...t)}printPanel(e){this.instance.log(this.formatPanel(e))}formatPanel(e){let t=this.getPanelWidth(e);return[this.formatPanelTop(e.renderedTitle,t),...e.rows.map(n=>this.formatPanelRow(n,t,e.formatValue)),this.formatPanelBottom(t)].join(`
|
|
2
|
-
`)}formatPanelTop(e,n){let r=Math.max(1,n-this.visibleLength(e)-5);return`${t.dim(`╭─`)} ${e} ${t.dim(`─`.repeat(r))}${t.dim(`╮`)}`}formatPanelBottom(e){return`${t.dim(`╰`)}${t.dim(`─`.repeat(e-2))}${t.dim(`╯`)}`}formatPanelRow(e,n,r){let i=e.label.padEnd(14,` `),a=String(e.value),o=this.visibleLength(i)+this.visibleLength(a)+4,s=Math.max(0,n-o);return`${t.dim(`│`)} ${t.blue(i)}${r(a)}${` `.repeat(s)} ${t.dim(`│`)}`}getPanelWidth(e){return Math.max(48,this.getTitleWidth(e),this.getRowsWidth(e.rows))}getTitleWidth(e){return this.visibleLength(e.title)+6}getRowsWidth(e){return Math.max(0,...e.map(e=>this.getRowWidth(e)))}getRowWidth(e){return 14+this.visibleLength(String(e.value))+4}visibleLength(e){return e.replace(o,``).length}};function c(){return new s({enabled:!1})}function l(e,t){if(n.isAbsolute(t))return n.normalize(t);let r;try{let t=new URL(e);if(t.protocol!==`file:`)throw Error(`Unsupported URL protocol "${t.protocol}"`);r=n.dirname(i(t))}catch{r=e}return n.resolve(r,t)}function u(e){let t=l(process.cwd(),e),i=r.existsSync(t)&&r.statSync(t).isDirectory()?t:n.dirname(t);if(!r.existsSync(i))throw Error(`Directory "${i}" does not exist.`);return t}function d(e){return e instanceof Error}function f(e,t={}){if(e==null)return{};let{filterNull:n=!0,filterUndefined:r=!0,filterEmptyString:i=!1,filterEmptyObject:a=!1,filterEmptyArray:o=!1}=t;return Object.keys(e).reduce((s,c)=>{let l=e[c];return p(l)&&Object.getPrototypeOf(l)===null&&(l=void 0),h(l)&&(l=f(l,t)),n&&l===null||r&&l===void 0||i&&l===``||a&&m(l)||o&&Array.isArray(l)&&l.length===0||(s[c]=l),s},{})}function p(e){return typeof e==`object`&&!!e}function m(e){return p(e)&&Object.keys(e).length===0}function h(e){return p(e)&&Object.getPrototypeOf(e)===Object.prototype}function g(e){return e==null||[`string`,`number`,`boolean`,`bigint`,`symbol`].includes(typeof e)}Array.prototype.isEmpty=function(){return this==null||this.length===0},String.prototype.capitalized=function(){let e=this==null?``:this.toString();return e.trim()?e.charAt(0).toUpperCase()+e.slice(1):``};var _=class{options;instance;constructor(e){this.options=e,this.instance=this.makeInstance()}info(e,t){this.log(`info`,e,t)}debug(e,t){this.log(`debug`,e,t)}trace(e,t){this.log(`trace`,e,t)}warn(e,t){this.log(`warn`,e,t)}error(e,t){this.log(`error`,e,t)}fatal(e,t){this.log(`fatal`,e,t)}child(e){return this.instance.child(e)}log(e,t,n){this.instance[e]({msg:t,...this.formatLogOptions(n)})}formatLogOptions(e){return e?this.normalizeObject({flag:e.flag,details:this.formatUnknown(e.details),error:this.formatUnknown(e.error),metadata:this.formatUnknown(e.metadata)}):{}}formatUnknown(e){if(d(e)){let t={type:e.constructor.name,message:e.message};this.options.debug&&e.stack&&(t.stack=e.stack);for(let[n,r]of Object.entries(e))n in t||(t[n]=r);let n=this.normalizeObject(t);return m(n)?void 0:n}if(Buffer.isBuffer(e))return`[Buffer]`;if(e&&typeof e.pipe==`function`)return`[Stream]`;if(p(e))try{let t=JSON.stringify(e);if(t===void 0)return;let n=JSON.parse(t);if(Array.isArray(n))return n.length>0?n:void 0;if(p(n)){let e=this.normalizeObject(n);return m(e)?void 0:e}return n}catch{return{type:`NonSerializableObject`}}return g(e)?e:String(e)}normalizeObject(e){return f(Object.fromEntries(Object.entries(e)),{filterNull:!0,filterUndefined:!0,filterEmptyString:!0,filterEmptyArray:!0,filterEmptyObject:!0})}makeInstance(){if(!this.options.enabled)return a({enabled:!1,timestamp:!0});let e=this.options.transports,t={level:this.makeGlobalLogLevel(e),enabled:!0,timestamp:!0,transport:{targets:this.makeTransportTargets(e)}};return a(t)}makeTransportTargets(e){if(e.filter(e=>e.type===`console`).length>1)throw Error(`[Logger] Multiple console transports are not supported.`);return e.map(e=>{switch(e.type){case`console`:return this.makeConsoleTransportTarget(e);case`file`:return this.makeFileTransportTarget(e)}})}makeConsoleTransportTarget(e){return{target:`pino-pretty`,level:this.makeTransportLevel(e.level),options:e.pretty}}makeFileTransportTarget(e){let t=this.makeTransportLevel(e.level),r=n.isAbsolute(e.path)?n.normalize(e.path):l(process.cwd(),e.path);return u(n.dirname(r)),{target:`pino/file`,level:t,options:{destination:r}}}makeTransportLevel(e){return this.options.debug?`trace`:e??`info`}makeGlobalLogLevel(e){if(this.options.debug)return`trace`;let t=e.at(0);if(!t)return`info`;let n={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},r=this.makeTransportLevel(t.level);for(let t of e.slice(1)){let e=this.makeTransportLevel(t.level);n[e]<n[r]&&(r=e)}return r}};function v(e={enabled:!1}){return new _(e)}export{c as makeConsoleFixture,v as makeLoggerFixture};
|