@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @buildplease/core
2
2
 
3
- Core is the shared foundation for BuildPlease applications. It provides framework-independent application primitives used by the other BuildPlease kits.
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};
@@ -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,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},s=(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},c=(e,t,n)=>(s(e,t,`default`),n&&s(n,t,`default`)),l=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));let u=require("node:module"),d=require("consola"),f=require("consola/utils"),p=require("inversify"),m=require("date-fns"),h=require("date-fns-tz"),g=require("ms");g=l(g,1);let _=require("node:path");_=l(_,1);let v=require("node:fs");v=l(v,1);let ee=require("node:url"),y=require("pino");y=l(y,1);let b=require("zod");b=l(b,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=S(t.bundle??[]),u=S(t.external??[]);O(u,l),oe(l),o||ae(s,l);let d=new Set(l.map(w)),f=n?s.filter(e=>!d.has(e)):[],p=r?c.filter(e=>!d.has(e)):[];return{external:C([...a?ne():[],...x([...f,...p,...u],i)]),bundle:C(x(l,i))}}function ne(){let e=S(u.builtinModules.map(T)),t=e.map(e=>`node:${e}`);return C([...e,...t,/^node:/])}function x(e,t){return t?e.map(e=>re(e)):[...e]}function re(e){return E(e)?e:RegExp(`^${D(e)}(?:/.*)?$`)}function S(e){return Array.from(new Set(e))}function C(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 w(e){if(e.startsWith(`@`)){let[t,n]=e.split(`/`);return t&&n?`${t}/${n}`:e}let[t]=e.split(`/`);return t??e}function T(e){return e.startsWith(`node:`)?e.slice(5):e}function E(e){return e.includes(`*`)||e.startsWith(`^`)||e.endsWith(`$`)}function D(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function O(e,t){let n=new Set(e.map(w)),r=t.filter(e=>n.has(w(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(w(e)));if(r.length!==0)throw Error(`Peer dependencies must stay external and cannot be bundled by default: ${r.join(`, `)}`)}function oe(e){let t=new Set(u.builtinModules.map(T)),n=e.filter(e=>se(e,t));if(n.length!==0)throw Error(`Node.js built-in modules cannot be bundled: ${n.join(`, `)}`)}function se(e,t){let n=T(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=(0,d.createConsola)({level:e.enabled===!1?-999:999,formatOptions:{colors:!0,date:!1}})}title(e,t,n=[]){this.printPanel({title:`${e} ${t}`.trim(),renderedTitle:`${f.colors.cyan(f.colors.bold(e))}${t?` ${f.colors.dim(t)}`:``}`,rows:n,formatValue:f.colors.green})}panel(e,t,n){this.printPanel({title:n===void 0?e:`${e} ${n}`,renderedTitle:`${f.colors.cyan(f.colors.bold(e))}${n===void 0?``:` ${f.colors.green(String(n))}`}`,rows:t,formatValue:f.colors.dim})}step(e,t){return`${f.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`${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/logger/log-flag.d.ts
199
- declare enum LogFlag {
200
- Critical = "CRITICAL",
201
- Serious = "SERIOUS",
202
- Important = "IMPORTANT",
203
- Notice = "NOTICE",
204
- Routine = "ROUTINE"
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
- //#endregion
207
- //#region src-node/logger/log-options.d.ts
208
- interface LogOptions {
209
- readonly flag?: LogFlag;
210
- readonly details?: unknown;
211
- readonly error?: unknown;
212
- readonly metadata?: unknown;
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/logger/logger-options.d.ts
216
- interface BaseLoggerTransportOptions {
217
- readonly level?: Level;
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
- interface LoggerConsoleTransportOptions extends BaseLoggerTransportOptions {
220
- readonly type: 'console';
221
- readonly target: 'pino-pretty';
222
- readonly pretty?: PrettyOptions;
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 LoggerFileTransportOptions extends BaseLoggerTransportOptions {
225
- readonly type: 'file';
226
- readonly path: string;
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
- type LoggerTransportOptions = LoggerConsoleTransportOptions | LoggerFileTransportOptions;
229
- type LoggerOptions = {
230
- readonly enabled: false;
231
- readonly debug?: boolean;
232
- readonly transports?: never;
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/logger/logger.d.ts
240
- interface Logger {
241
- readonly instance: Logger$1;
242
- info(title: string, options?: LogOptions): void;
243
- debug(title: string, options?: LogOptions): void;
244
- trace(title: string, options?: LogOptions): void;
245
- warn(title: string, options?: LogOptions): void;
246
- error(title: string, options?: LogOptions): void;
247
- fatal(title: string, options?: LogOptions): void;
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 class LoggerImpl implements Logger {
251
- private readonly options;
252
- readonly instance: Logger$1;
253
- constructor(options: LoggerOptions);
254
- info(title: string, options?: LogOptions): void;
255
- debug(title: string, options?: LogOptions): void;
256
- trace(title: string, options?: LogOptions): void;
257
- warn(title: string, options?: LogOptions): void;
258
- error(title: string, options?: LogOptions): void;
259
- fatal(title: string, options?: LogOptions): void;
260
- child(bindings: Bindings): Logger$1;
261
- private log;
262
- private formatLogOptions;
263
- private formatUnknown;
264
- private normalizeObject;
265
- private makeInstance;
266
- private makeTransportTargets;
267
- private makeConsoleTransportTarget;
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
- //#endregion
273
- //#region src/di/assembly.d.ts
274
- type AssemblyContainer = Container;
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
- //#endregion
279
- //#region src-node/di/core-node-assembly.d.ts
280
- interface CoreNodeAssemblyOptions {
281
- readonly logger?: LoggerOptions;
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
- declare function coreNodeAssembly(options?: CoreNodeAssemblyOptions): Assembly[];
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/environment-variable.d.ts
286
- declare function optionalEnvironmentVariable(name: string): string | undefined;
287
- declare function requiredEnvironmentVariable(name: string): string;
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, CoreNodeAssemblyOptions, DependencyBundlingMatcher, DependencyBundlingPackageJSON, DependencyBundlingPolicy, LogFlag, LogOptions, Logger, LoggerConsoleTransportOptions, LoggerFileTransportOptions, LoggerImpl, LoggerOptions, LoggerTransportOptions, MakeDependencyBundlingPolicyOptions, PackageJSONModel, PackageJSONSchema, PackageNameModel, PackageNameSchema, coreNodeAssembly, createDirectory, createDirectoryAsync, createFile, createFileAsync, ensureDirectory, ensureDirectoryAsync, loadPackageJSON, makeDependencyBundlingPolicy, optionalEnvironmentVariable, removePath, removePathAsync, requiredEnvironmentVariable, resolvePath };
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/logger/log-flag.d.ts
199
- declare enum LogFlag {
200
- Critical = "CRITICAL",
201
- Serious = "SERIOUS",
202
- Important = "IMPORTANT",
203
- Notice = "NOTICE",
204
- Routine = "ROUTINE"
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
- //#endregion
207
- //#region src-node/logger/log-options.d.ts
208
- interface LogOptions {
209
- readonly flag?: LogFlag;
210
- readonly details?: unknown;
211
- readonly error?: unknown;
212
- readonly metadata?: unknown;
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/logger/logger-options.d.ts
216
- interface BaseLoggerTransportOptions {
217
- readonly level?: Level;
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
- interface LoggerConsoleTransportOptions extends BaseLoggerTransportOptions {
220
- readonly type: 'console';
221
- readonly target: 'pino-pretty';
222
- readonly pretty?: PrettyOptions;
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 LoggerFileTransportOptions extends BaseLoggerTransportOptions {
225
- readonly type: 'file';
226
- readonly path: string;
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
- type LoggerTransportOptions = LoggerConsoleTransportOptions | LoggerFileTransportOptions;
229
- type LoggerOptions = {
230
- readonly enabled: false;
231
- readonly debug?: boolean;
232
- readonly transports?: never;
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/logger/logger.d.ts
240
- interface Logger {
241
- readonly instance: Logger$1;
242
- info(title: string, options?: LogOptions): void;
243
- debug(title: string, options?: LogOptions): void;
244
- trace(title: string, options?: LogOptions): void;
245
- warn(title: string, options?: LogOptions): void;
246
- error(title: string, options?: LogOptions): void;
247
- fatal(title: string, options?: LogOptions): void;
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 class LoggerImpl implements Logger {
251
- private readonly options;
252
- readonly instance: Logger$1;
253
- constructor(options: LoggerOptions);
254
- info(title: string, options?: LogOptions): void;
255
- debug(title: string, options?: LogOptions): void;
256
- trace(title: string, options?: LogOptions): void;
257
- warn(title: string, options?: LogOptions): void;
258
- error(title: string, options?: LogOptions): void;
259
- fatal(title: string, options?: LogOptions): void;
260
- child(bindings: Bindings): Logger$1;
261
- private log;
262
- private formatLogOptions;
263
- private formatUnknown;
264
- private normalizeObject;
265
- private makeInstance;
266
- private makeTransportTargets;
267
- private makeConsoleTransportTarget;
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
- //#endregion
273
- //#region src/di/assembly.d.ts
274
- type AssemblyContainer = Container;
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
- //#endregion
279
- //#region src-node/di/core-node-assembly.d.ts
280
- interface CoreNodeAssemblyOptions {
281
- readonly logger?: LoggerOptions;
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
- declare function coreNodeAssembly(options?: CoreNodeAssemblyOptions): Assembly[];
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/environment-variable.d.ts
286
- declare function optionalEnvironmentVariable(name: string): string | undefined;
287
- declare function requiredEnvironmentVariable(name: string): string;
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, CoreNodeAssemblyOptions, DependencyBundlingMatcher, DependencyBundlingPackageJSON, DependencyBundlingPolicy, LogFlag, LogOptions, Logger, LoggerConsoleTransportOptions, LoggerFileTransportOptions, LoggerImpl, LoggerOptions, LoggerTransportOptions, MakeDependencyBundlingPolicyOptions, PackageJSONModel, PackageJSONSchema, PackageNameModel, PackageNameSchema, coreNodeAssembly, createDirectory, createDirectoryAsync, createFile, createFileAsync, ensureDirectory, ensureDirectoryAsync, loadPackageJSON, makeDependencyBundlingPolicy, optionalEnvironmentVariable, removePath, removePathAsync, requiredEnvironmentVariable, resolvePath };
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,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{injectable as r}from"inversify";import{add as i,addDays as a,addHours as o,addMilliseconds as s,addMinutes as c,addMonths as l,addSeconds as u,addWeeks as d,addYears as f,compareAsc as p,differenceInDays as ee,differenceInHours as te,differenceInMilliseconds as ne,differenceInMinutes as re,differenceInMonths as ie,differenceInSeconds as ae,differenceInWeeks as oe,differenceInYears as se,endOfDay as m,endOfMonth as ce,endOfWeek as le,endOfYear as ue,format as de,formatISO as fe,fromUnixTime as pe,getDate as me,getDay as he,getHours as ge,getMinutes as _e,getMonth as ve,getSeconds as ye,getUnixTime as be,getYear as xe,isAfter as Se,isBefore as Ce,isEqual as we,isSameDay as Te,isValid as h,parseISO as Ee,setDate as De,setDay as Oe,setHours as ke,setMinutes as Ae,setMonth as je,setSeconds as Me,setYear as Ne,startOfDay as g,startOfMonth as _,startOfWeek as v,startOfYear as y,sub as b,subDays as Pe,subHours as Fe,subMilliseconds as Ie,subMinutes as Le,subMonths as Re,subSeconds as ze,subWeeks as Be,subYears as Ve}from"date-fns";import{formatInTimeZone as He,fromZonedTime as Ue,getTimezoneOffset as We,toZonedTime as Ge}from"date-fns-tz";import x from"ms";import S from"node:path";import C,{promises as w}from"node:fs";import{fileURLToPath as Ke}from"node:url";import T from"pino";import E from"zod";var D=Object.defineProperty,qe=Object.getOwnPropertyDescriptor,Je=Object.getOwnPropertyNames,Ye=Object.prototype.hasOwnProperty,O=(e,t)=>{let n={};for(var r in e)D(n,r,{get:e[r],enumerable:!0});return t||D(n,Symbol.toStringTag,{value:`Module`}),n},k=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=Je(t),a=0,o=i.length,s;a<o;a++)s=i[a],!Ye.call(e,s)&&s!==n&&D(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=qe(t,s))||r.enumerable});return e},A=(e,t,n)=>(k(e,t,`default`),n&&k(n,t,`default`));function Xe(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=M(t.bundle??[]),u=M(t.external??[]);nt(u,l),it(l),o||rt(s,l);let d=new Set(l.map(P)),f=n?s.filter(e=>!d.has(e)):[],p=r?c.filter(e=>!d.has(e)):[];return{external:N([...a?Ze():[],...j([...f,...p,...u],i)]),bundle:N(j(l,i))}}function Ze(){let t=M(e.map(F)),n=t.map(e=>`node:${e}`);return N([...t,...n,/^node:/])}function j(e,t){return t?e.map(e=>Qe(e)):[...e]}function Qe(e){return et(e)?e:RegExp(`^${tt(e)}(?:/.*)?$`)}function M(e){return Array.from(new Set(e))}function N(e){let t=new Set,n=[];for(let r of e){let e=$e(r);t.has(e)||(t.add(e),n.push(r))}return n}function $e(e){return typeof e==`string`?`string:${e}`:`regexp:${e.source}/${e.flags}`}function P(e){if(e.startsWith(`@`)){let[t,n]=e.split(`/`);return t&&n?`${t}/${n}`:e}let[t]=e.split(`/`);return t??e}function F(e){return e.startsWith(`node:`)?e.slice(5):e}function et(e){return e.includes(`*`)||e.startsWith(`^`)||e.endsWith(`$`)}function tt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function nt(e,t){let n=new Set(e.map(P)),r=t.filter(e=>n.has(P(e)));if(r.length!==0)throw Error(`Packages cannot be both external and bundled: ${r.join(`, `)}`)}function rt(e,t){let n=new Set(e),r=t.filter(e=>n.has(P(e)));if(r.length!==0)throw Error(`Peer dependencies must stay external and cannot be bundled by default: ${r.join(`, `)}`)}function it(t){let n=new Set(e.map(F)),r=t.filter(e=>at(e,n));if(r.length!==0)throw Error(`Node.js built-in modules cannot be bundled: ${r.join(`, `)}`)}function at(e,t){let n=F(e),[r]=n.split(`/`);return r?t.has(r):t.has(n)}const ot=/\u001B\[[0-9;]*m/g;var st=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(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.0.2",
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
- "./node/test": {
34
+ "./test": {
35
35
  "import": {
36
- "types": "./dist/src-node-test/index.d.mts",
37
- "default": "./dist/src-node-test/index.mjs"
36
+ "types": "./dist/src-test/index.d.mts",
37
+ "default": "./dist/src-test/index.mjs"
38
38
  },
39
39
  "require": {
40
- "types": "./dist/src-node-test/index.d.cts",
41
- "default": "./dist/src-node-test/index.cjs"
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};