@noormdev/cli 1.0.0-alpha.12 → 1.0.0-alpha.13
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/noorm.js +41 -0
- package/package.json +4 -8
- package/scripts/postinstall.js +105 -56
- package/dist/chunk-5DTOZH7A.js +0 -9
- package/dist/chunk-CFWFYGBB.js +0 -7
- package/dist/chunk-CTFIMWJ7.js +0 -8
- package/dist/chunk-ERDQ5FIO.js +0 -2
- package/dist/chunk-GGT3S2QA.js +0 -5
- package/dist/chunk-GQBL2JPZ.js +0 -2
- package/dist/chunk-KVY4JR2A.js +0 -2
- package/dist/chunk-PJYMXUBP.js +0 -2
- package/dist/chunk-QI5B3GSQ.js +0 -2
- package/dist/chunk-QNPOKMVM.js +0 -208
- package/dist/chunk-UR6MHSHU.js +0 -2
- package/dist/connection-AQAVQLXV.js +0 -2
- package/dist/devtools-YYBWFXMQ.js +0 -8
- package/dist/engine-RYCOAOP4.js +0 -2
- package/dist/esm-74GQLDJV.js +0 -3
- package/dist/index.js +0 -3126
- package/dist/mssql-Y7W7F4UH.js +0 -2
- package/dist/mysql-EEPNIS5Q.js +0 -2
- package/dist/mysql2-GYI2HTEE.js +0 -3008
- package/dist/open-NGBTRDPN.js +0 -3
- package/dist/postgres-7E352BHM.js +0 -2
- package/dist/sqlite-KSGG7IKM.js +0 -2
- package/dist/storage-YJUXROPC.js +0 -2
- package/dist/tarn-LSH7NLRE.js +0 -2
- package/dist/tedious-7M6OXIVA.js +0 -192
package/noorm.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Thin shim that execs the platform-specific noorm binary.
|
|
5
|
+
*
|
|
6
|
+
* npm points `bin.noorm` here. On postinstall, the real binary is
|
|
7
|
+
* downloaded to the same directory. This shim finds and execs it,
|
|
8
|
+
* passing through all arguments and signals.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { execFileSync } from 'child_process';
|
|
12
|
+
import { existsSync } from 'fs';
|
|
13
|
+
import { resolve, dirname } from 'path';
|
|
14
|
+
import { fileURLToPath } from 'url';
|
|
15
|
+
|
|
16
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const binaryName = process.platform === 'win32' ? 'noorm.exe' : 'noorm';
|
|
18
|
+
const binaryPath = resolve(__dirname, 'bin', binaryName);
|
|
19
|
+
|
|
20
|
+
if (!existsSync(binaryPath)) {
|
|
21
|
+
|
|
22
|
+
console.error('noorm binary not found. Try reinstalling:');
|
|
23
|
+
console.error(' npm install -g @noormdev/cli');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
|
|
30
|
+
execFileSync(binaryPath, process.argv.slice(2), {
|
|
31
|
+
stdio: 'inherit',
|
|
32
|
+
env: process.env,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
|
|
38
|
+
// execFileSync throws on non-zero exit — forward the exit code
|
|
39
|
+
process.exit(err.status ?? 1);
|
|
40
|
+
|
|
41
|
+
}
|
package/package.json
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noormdev/cli",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.13",
|
|
4
4
|
"description": "Database schema & changeset manager CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"noorm": "./
|
|
7
|
+
"noorm": "./noorm.js"
|
|
8
8
|
},
|
|
9
|
-
"main": "./dist/index.js",
|
|
10
9
|
"files": [
|
|
11
|
-
"
|
|
10
|
+
"noorm.js",
|
|
12
11
|
"scripts"
|
|
13
12
|
],
|
|
14
13
|
"scripts": {
|
|
15
14
|
"postinstall": "node scripts/postinstall.js"
|
|
16
15
|
},
|
|
17
|
-
"dependencies": {
|
|
18
|
-
"better-sqlite3": "^12.5.0"
|
|
19
|
-
},
|
|
20
16
|
"engines": {
|
|
21
|
-
"node": ">=
|
|
17
|
+
"node": ">=18"
|
|
22
18
|
},
|
|
23
19
|
"keywords": [
|
|
24
20
|
"database",
|
package/scripts/postinstall.js
CHANGED
|
@@ -1,106 +1,155 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Downloads the platform-specific noorm binary on npm install.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* The @noormdev/cli npm package is a thin wrapper. The actual CLI is a
|
|
7
|
+
* bun-compiled binary hosted on GitHub Releases. This script runs on
|
|
8
|
+
* postinstall to fetch the correct binary for the user's OS and architecture.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
11
|
+
import { createWriteStream, existsSync, chmodSync, mkdirSync } from 'fs';
|
|
12
|
+
import { get as httpsGet } from 'https';
|
|
12
13
|
import { dirname, resolve } from 'path';
|
|
13
14
|
import { fileURLToPath } from 'url';
|
|
14
15
|
|
|
15
16
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
const
|
|
17
|
-
const
|
|
17
|
+
const PACKAGE_ROOT = resolve(__dirname, '..');
|
|
18
|
+
const BIN_DIR = resolve(PACKAGE_ROOT, 'bin');
|
|
19
|
+
const REPO = 'noormdev/noorm';
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Resolves the platform suffix used in binary asset names.
|
|
23
|
+
*
|
|
24
|
+
* Maps Node's process.platform and process.arch to the naming convention
|
|
25
|
+
* used by the build-binary script: noorm-{os}-{arch}
|
|
26
|
+
*/
|
|
27
|
+
function getPlatformSuffix() {
|
|
25
28
|
|
|
26
|
-
|
|
29
|
+
const platform = process.platform;
|
|
30
|
+
const arch = process.arch;
|
|
27
31
|
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
const osMap = { darwin: 'darwin', linux: 'linux', win32: 'windows' };
|
|
33
|
+
const archMap = { arm64: 'arm64', x64: 'x64' };
|
|
30
34
|
|
|
31
|
-
|
|
35
|
+
const os = osMap[platform];
|
|
36
|
+
const cpu = archMap[arch];
|
|
32
37
|
|
|
38
|
+
if (!os || !cpu) {
|
|
39
|
+
console.error(`Unsupported platform: ${platform}-${arch}`);
|
|
40
|
+
process.exit(0); // Don't fail install
|
|
33
41
|
}
|
|
34
42
|
|
|
35
|
-
|
|
36
|
-
if (existsSync(SOURCE)) {
|
|
43
|
+
const suffix = `${os}-${cpu}`;
|
|
37
44
|
|
|
38
|
-
|
|
45
|
+
if (platform === 'win32') {
|
|
46
|
+
return `${suffix}.exe`;
|
|
47
|
+
}
|
|
39
48
|
|
|
40
|
-
|
|
41
|
-
const content = await readFile(SOURCE, 'utf8');
|
|
42
|
-
const lines = content.split('\n');
|
|
49
|
+
return suffix;
|
|
43
50
|
|
|
44
|
-
|
|
51
|
+
}
|
|
45
52
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Reads the package version to determine which release to download from.
|
|
55
|
+
*/
|
|
56
|
+
async function getVersion() {
|
|
49
57
|
|
|
50
|
-
|
|
58
|
+
const { readFile } = await import('fs/promises');
|
|
59
|
+
const pkg = JSON.parse(await readFile(resolve(PACKAGE_ROOT, 'package.json'), 'utf8'));
|
|
51
60
|
|
|
52
|
-
|
|
53
|
-
catch (err) {
|
|
61
|
+
return pkg.version;
|
|
54
62
|
|
|
55
|
-
|
|
63
|
+
}
|
|
56
64
|
|
|
57
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Follow redirects and download a URL to a file path.
|
|
67
|
+
*
|
|
68
|
+
* GitHub Releases URLs redirect to S3. This follows up to 5 redirects.
|
|
69
|
+
*/
|
|
70
|
+
function download(url, dest, redirects = 0) {
|
|
58
71
|
|
|
72
|
+
if (redirects > 5) {
|
|
73
|
+
return Promise.reject(new Error('Too many redirects'));
|
|
59
74
|
}
|
|
60
75
|
|
|
61
|
-
|
|
62
|
-
if (existsSync(BIN_PATH)) {
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
63
77
|
|
|
64
|
-
|
|
78
|
+
httpsGet(url, { headers: { 'User-Agent': 'noorm-installer' } }, (res) => {
|
|
65
79
|
|
|
66
|
-
|
|
80
|
+
// Follow redirects
|
|
81
|
+
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
82
|
+
resolve(download(res.headers.location, dest, redirects + 1));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
67
85
|
|
|
68
|
-
if (
|
|
86
|
+
if (res.statusCode !== 200) {
|
|
87
|
+
reject(new Error(`Download failed: HTTP ${res.statusCode}`));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
69
90
|
|
|
70
|
-
|
|
91
|
+
const file = createWriteStream(dest);
|
|
92
|
+
res.pipe(file);
|
|
71
93
|
|
|
72
|
-
|
|
94
|
+
file.on('finish', () => {
|
|
95
|
+
file.close();
|
|
96
|
+
resolve();
|
|
97
|
+
});
|
|
73
98
|
|
|
74
|
-
|
|
99
|
+
file.on('error', (err) => {
|
|
100
|
+
file.close();
|
|
101
|
+
reject(err);
|
|
102
|
+
});
|
|
75
103
|
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
104
|
+
}).on('error', reject);
|
|
78
105
|
|
|
79
|
-
|
|
106
|
+
});
|
|
80
107
|
|
|
81
|
-
|
|
108
|
+
}
|
|
82
109
|
|
|
83
|
-
|
|
110
|
+
/**
|
|
111
|
+
* Main postinstall routine.
|
|
112
|
+
*
|
|
113
|
+
* Downloads the correct binary, saves it to bin/, and makes it executable.
|
|
114
|
+
* Exits cleanly on failure so npm install doesn't break.
|
|
115
|
+
*/
|
|
116
|
+
async function main() {
|
|
84
117
|
|
|
85
|
-
|
|
118
|
+
const suffix = getPlatformSuffix();
|
|
119
|
+
const version = await getVersion();
|
|
120
|
+
const assetName = `noorm-${suffix}`;
|
|
121
|
+
const tag = `@noormdev/cli@${version}`;
|
|
122
|
+
const url = `https://github.com/${REPO}/releases/download/${tag}/${assetName}`;
|
|
86
123
|
|
|
87
|
-
|
|
88
|
-
|
|
124
|
+
const binaryName = process.platform === 'win32' ? 'noorm.exe' : 'noorm';
|
|
125
|
+
const dest = resolve(BIN_DIR, binaryName);
|
|
89
126
|
|
|
127
|
+
// Skip if binary already exists (e.g. reinstall)
|
|
128
|
+
if (existsSync(dest)) {
|
|
129
|
+
console.log(`noorm binary already exists at ${dest}`);
|
|
130
|
+
return;
|
|
90
131
|
}
|
|
91
|
-
catch (err) {
|
|
92
132
|
|
|
93
|
-
|
|
133
|
+
mkdirSync(BIN_DIR, { recursive: true });
|
|
94
134
|
|
|
95
|
-
|
|
96
|
-
console.log(` sudo ln -sf "${SOURCE}" ${BIN_PATH}\n`);
|
|
135
|
+
console.log(`Downloading noorm ${version} for ${suffix}...`);
|
|
97
136
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
// Don't fail install on symlink errors
|
|
137
|
+
await download(url, dest);
|
|
101
138
|
|
|
139
|
+
if (process.platform !== 'win32') {
|
|
140
|
+
chmodSync(dest, 0o755);
|
|
102
141
|
}
|
|
103
142
|
|
|
143
|
+
console.log(`✓ noorm ${version} installed`);
|
|
144
|
+
|
|
104
145
|
}
|
|
105
146
|
|
|
106
|
-
main()
|
|
147
|
+
main().catch((err) => {
|
|
148
|
+
|
|
149
|
+
console.error(`Warning: Could not download noorm binary: ${err.message}`);
|
|
150
|
+
console.error('You can download it manually from:');
|
|
151
|
+
console.error(` https://github.com/${REPO}/releases`);
|
|
152
|
+
// Don't fail the install
|
|
153
|
+
process.exit(0);
|
|
154
|
+
|
|
155
|
+
});
|
package/dist/chunk-5DTOZH7A.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as dt,c as p,d as P,f as gt,i as g}from"./chunk-CTFIMWJ7.js";import{W as K}from"./chunk-QI5B3GSQ.js";import{c as lt,e as mt}from"./chunk-UR6MHSHU.js";var Dt=lt((Ge,Je)=>{"use strict";(function(e,t){typeof Ge=="object"&&typeof Je<"u"?Je.exports=t():typeof define=="function"&&define.amd?define(t):(e=typeof globalThis<"u"?globalThis:e||self).dayjs=t()})(Ge,(function(){"use strict";var e=1e3,t=6e4,r=36e5,n="millisecond",i="second",o="minute",s="hour",l="day",f="week",m="month",h="quarter",v="year",C="date",A="Invalid Date",B=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,H=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,J={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(y){var u=["th","st","nd","rd"],a=y%100;return"["+y+(u[(a-20)%10]||u[a]||u[0])+"]"}},F=function(y,u,a){var d=String(y);return!d||d.length>=u?y:""+Array(u+1-d.length).join(a)+y},_={s:F,z:function(y){var u=-y.utcOffset(),a=Math.abs(u),d=Math.floor(a/60),c=a%60;return(u<=0?"+":"-")+F(d,2,"0")+":"+F(c,2,"0")},m:function y(u,a){if(u.date()<a.date())return-y(a,u);var d=12*(a.year()-u.year())+(a.month()-u.month()),c=u.clone().add(d,m),b=a-c<0,w=u.clone().add(d+(b?-1:1),m);return+(-(d+(a-c)/(b?c-w:w-c))||0)},a:function(y){return y<0?Math.ceil(y)||0:Math.floor(y)},p:function(y){return{M:m,y:v,w:f,d:l,D:C,h:s,m:o,s:i,ms:n,Q:h}[y]||String(y||"").toLowerCase().replace(/s$/,"")},u:function(y){return y===void 0}},$="en",N={};N[$]=J;var O="$isDayjsObject",z=function(y){return y instanceof we||!(!y||!y[O])},re=function y(u,a,d){var c;if(!u)return $;if(typeof u=="string"){var b=u.toLowerCase();N[b]&&(c=b),a&&(N[b]=a,c=b);var w=u.split("-");if(!c&&w.length>1)return y(w[0])}else{var S=u.name;N[S]=u,c=S}return!d&&c&&($=c),c||!d&&$},E=function(y,u){if(z(y))return y.clone();var a=typeof u=="object"?u:{};return a.date=y,a.args=arguments,new we(a)},k=_;k.l=re,k.i=z,k.w=function(y,u){return E(y,{locale:u.$L,utc:u.$u,x:u.$x,$offset:u.$offset})};var we=(function(){function y(a){this.$L=re(a.locale,null,!0),this.parse(a),this.$x=this.$x||a.x||{},this[O]=!0}var u=y.prototype;return u.parse=function(a){this.$d=(function(d){var c=d.date,b=d.utc;if(c===null)return new Date(NaN);if(k.u(c))return new Date;if(c instanceof Date)return new Date(c);if(typeof c=="string"&&!/Z$/i.test(c)){var w=c.match(B);if(w){var S=w[2]-1||0,I=(w[7]||"0").substring(0,3);return b?new Date(Date.UTC(w[1],S,w[3]||1,w[4]||0,w[5]||0,w[6]||0,I)):new Date(w[1],S,w[3]||1,w[4]||0,w[5]||0,w[6]||0,I)}}return new Date(c)})(a),this.init()},u.init=function(){var a=this.$d;this.$y=a.getFullYear(),this.$M=a.getMonth(),this.$D=a.getDate(),this.$W=a.getDay(),this.$H=a.getHours(),this.$m=a.getMinutes(),this.$s=a.getSeconds(),this.$ms=a.getMilliseconds()},u.$utils=function(){return k},u.isValid=function(){return this.$d.toString()!==A},u.isSame=function(a,d){var c=E(a);return this.startOf(d)<=c&&c<=this.endOf(d)},u.isAfter=function(a,d){return E(a)<this.startOf(d)},u.isBefore=function(a,d){return this.endOf(d)<E(a)},u.$g=function(a,d,c){return k.u(a)?this[d]:this.set(c,a)},u.unix=function(){return Math.floor(this.valueOf()/1e3)},u.valueOf=function(){return this.$d.getTime()},u.startOf=function(a,d){var c=this,b=!!k.u(d)||d,w=k.p(a),S=function(Q,D){var W=k.w(c.$u?Date.UTC(c.$y,D,Q):new Date(c.$y,D,Q),c);return b?W:W.endOf(l)},I=function(Q,D){return k.w(c.toDate()[Q].apply(c.toDate("s"),(b?[0,0,0,0]:[23,59,59,999]).slice(D)),c)},T=this.$W,M=this.$M,j=this.$D,ne="set"+(this.$u?"UTC":"");switch(w){case v:return b?S(1,0):S(31,11);case m:return b?S(1,M):S(0,M+1);case f:var Z=this.$locale().weekStart||0,ce=(T<Z?T+7:T)-Z;return S(b?j-ce:j+(6-ce),M);case l:case C:return I(ne+"Hours",0);case s:return I(ne+"Minutes",1);case o:return I(ne+"Seconds",2);case i:return I(ne+"Milliseconds",3);default:return this.clone()}},u.endOf=function(a){return this.startOf(a,!1)},u.$set=function(a,d){var c,b=k.p(a),w="set"+(this.$u?"UTC":""),S=(c={},c[l]=w+"Date",c[C]=w+"Date",c[m]=w+"Month",c[v]=w+"FullYear",c[s]=w+"Hours",c[o]=w+"Minutes",c[i]=w+"Seconds",c[n]=w+"Milliseconds",c)[b],I=b===l?this.$D+(d-this.$W):d;if(b===m||b===v){var T=this.clone().set(C,1);T.$d[S](I),T.init(),this.$d=T.set(C,Math.min(this.$D,T.daysInMonth())).$d}else S&&this.$d[S](I);return this.init(),this},u.set=function(a,d){return this.clone().$set(a,d)},u.get=function(a){return this[k.p(a)]()},u.add=function(a,d){var c,b=this;a=Number(a);var w=k.p(d),S=function(M){var j=E(b);return k.w(j.date(j.date()+Math.round(M*a)),b)};if(w===m)return this.set(m,this.$M+a);if(w===v)return this.set(v,this.$y+a);if(w===l)return S(1);if(w===f)return S(7);var I=(c={},c[o]=t,c[s]=r,c[i]=e,c)[w]||1,T=this.$d.getTime()+a*I;return k.w(T,this)},u.subtract=function(a,d){return this.add(-1*a,d)},u.format=function(a){var d=this,c=this.$locale();if(!this.isValid())return c.invalidDate||A;var b=a||"YYYY-MM-DDTHH:mm:ssZ",w=k.z(this),S=this.$H,I=this.$m,T=this.$M,M=c.weekdays,j=c.months,ne=c.meridiem,Z=function(D,W,ue,xe){return D&&(D[W]||D(d,b))||ue[W].slice(0,xe)},ce=function(D){return k.s(S%12||12,D,"0")},Q=ne||function(D,W,ue){var xe=D<12?"AM":"PM";return ue?xe.toLowerCase():xe};return b.replace(H,(function(D,W){return W||(function(ue){switch(ue){case"YY":return String(d.$y).slice(-2);case"YYYY":return k.s(d.$y,4,"0");case"M":return T+1;case"MM":return k.s(T+1,2,"0");case"MMM":return Z(c.monthsShort,T,j,3);case"MMMM":return Z(j,T);case"D":return d.$D;case"DD":return k.s(d.$D,2,"0");case"d":return String(d.$W);case"dd":return Z(c.weekdaysMin,d.$W,M,2);case"ddd":return Z(c.weekdaysShort,d.$W,M,3);case"dddd":return M[d.$W];case"H":return String(S);case"HH":return k.s(S,2,"0");case"h":return ce(1);case"hh":return ce(2);case"a":return Q(S,I,!0);case"A":return Q(S,I,!1);case"m":return String(I);case"mm":return k.s(I,2,"0");case"s":return String(d.$s);case"ss":return k.s(d.$s,2,"0");case"SSS":return k.s(d.$ms,3,"0");case"Z":return w}return null})(D)||w.replace(":","")}))},u.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},u.diff=function(a,d,c){var b,w=this,S=k.p(d),I=E(a),T=(I.utcOffset()-this.utcOffset())*t,M=this-I,j=function(){return k.m(w,I)};switch(S){case v:b=j()/12;break;case m:b=j();break;case h:b=j()/3;break;case f:b=(M-T)/6048e5;break;case l:b=(M-T)/864e5;break;case s:b=M/r;break;case o:b=M/t;break;case i:b=M/e;break;default:b=M}return c?b:k.a(b)},u.daysInMonth=function(){return this.endOf(m).$D},u.$locale=function(){return N[this.$L]},u.locale=function(a,d){if(!a)return this.$L;var c=this.clone(),b=re(a,d,!0);return b&&(c.$L=b),c},u.clone=function(){return k.w(this.$d,this)},u.toDate=function(){return new Date(this.valueOf())},u.toJSON=function(){return this.isValid()?this.toISOString():null},u.toISOString=function(){return this.$d.toISOString()},u.toString=function(){return this.$d.toUTCString()},y})(),ut=we.prototype;return E.prototype=ut,[["$ms",n],["$s",i],["$m",o],["$H",s],["$W",l],["$M",m],["$y",v],["$D",C]].forEach((function(y){ut[y[1]]=function(u){return this.$g(u,y[0],y[1])}})),E.extend=function(y,u){return y.$i||(y(u,we,E),y.$i=!0),E},E.locale=re,E.isDayjs=z,E.unix=function(y){return E(1e3*y)},E.en=N[$],E.Ls=N,E.p={},E}))});var Yt=lt((Ci,Wt)=>{"use strict";var At,Ze,tt,{defineProperty:cn,setPrototypeOf:zt,create:un,keys:ln}=Object,q="",{round:te,max:mn}=Math,Qe=e=>{let t=/([a-f\d]{3,6})/i.exec(e)?.[1],r=t?.length,n=parseInt(6^r?3^r?"0":t[0]+t[0]+t[1]+t[1]+t[2]+t[2]:t,16);return[n>>16&255,n>>8&255,255&n]},Bt=(e,t,r)=>e^t||t^r?16+36*te(e/51)+6*te(t/51)+te(r/51):8>e?16:e>248?231:te(24*(e-8)/247)+232,Xe=e=>{let t,r,n,i,o;return 8>e?30+e:16>e?e-8+90:(232>e?(o=(e-=16)%36,t=(e/36|0)/5,r=(o/6|0)/5,n=o%6/5):t=r=n=(10*(e-232)+8)/255,i=2*mn(t,r,n),i?30+(te(n)<<2|te(r)<<1|te(t))+(2^i?0:60):30)},dn=(()=>{let e=m=>n.some((h=>m.test(h))),t=globalThis,r=t.process??{},n=r.argv??[],i=r.env??{},o=-1;try{At=","+ln(i).join(",")}catch{i={},o=0}let s="FORCE_COLOR",l={false:0,0:0,1:1,2:2,3:3}[i[s]]??-1,f=s in i&&l||e(/^--color=?(true|always)?$/);return f&&(o=l),~o||(o=((m,h,v)=>(Ze=m.TERM,{"24bit":3,truecolor:3,ansi256:2,ansi:1}[m.COLORTERM]||(m.CI?/,GITHUB/.test(At)?3:1:h&&Ze!=="dumb"?v?3:/-256/.test(Ze)?2:1:0)))(i,!!i.PM2_HOME||i.NEXT_RUNTIME?.includes("edge")||!!r.stdout?.isTTY,r.platform==="win32")),!l||i.NO_COLOR||e(/^--(no-color|color=(false|never))$/)?0:t.window?.chrome||f&&!o?3:o})(),Ft={open:q,close:q},se=39,ae=49,Ut={},Ht=({p:e},{open:t,close:r})=>{let n=(s,...l)=>{if(!s){if(t&&t===r)return t;if((s??q)===q)return q}let f,m=s.raw?String.raw({raw:s},...l):q+s,h=n.p,v=h.o,C=h.c;if(m.includes("\x1B"))for(;h;h=h.p){let{open:A,close:B}=h,H=B.length,J=q,F=0;if(H)for(;~(f=m.indexOf(B,F));F=f+H)J+=m.slice(F,f)+A;m=J+m.slice(F)}return v+(m.includes(`
|
|
3
|
-
`)?m.replace(/(\r?\n)/g,C+"$1"+v):m)+C},i=t,o=r;return e&&(i=e.o+t,o=r+e.c),zt(n,tt),n.p={open:t,close:r,o:i,c:o,p:e},n.open=i,n.close=o,n},et=new function e(t=dn){let r={Ansis:e,level:t,isSupported:()=>i,strip:_=>_.replace(/[][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,q),extend(_){for(let $ in _){let N=_[$],O=(typeof N)[0];O==="s"?(n($,h(...Qe(N))),n(J($),v(...Qe(N)))):n($,N,O==="f")}return tt=un({},Ut),zt(r,tt),r}},n=(_,$,N)=>{Ut[_]={get(){let O=N?(...z)=>Ht(this,$(...z)):Ht(this,$);return cn(this,_,{value:O}),O}}},i=t>0,o=(_,$)=>i?{open:`\x1B[${_}m`,close:`\x1B[${$}m`}:Ft,s=_=>$=>_(...Qe($)),l=(_,$)=>(N,O,z)=>o(`${_}8;2;${N};${O};${z}`,$),f=(_,$)=>(N,O,z)=>o(((re,E,k)=>Xe(Bt(re,E,k)))(N,O,z)+_,$),m=_=>($,N,O)=>_(Bt($,N,O)),h=l(3,se),v=l(4,ae),C=_=>o("38;5;"+_,se),A=_=>o("48;5;"+_,ae);t===2?(h=m(C),v=m(A)):t===1&&(h=f(0,se),v=f(10,ae),C=_=>o(Xe(_),se),A=_=>o(Xe(_)+10,ae));let B,H={fg:C,bg:A,rgb:h,bgRgb:v,hex:s(h),bgHex:s(v),visible:Ft,reset:o(0,0),bold:o(1,22),dim:o(2,22),italic:o(3,23),underline:o(4,24),inverse:o(7,27),hidden:o(8,28),strikethrough:o(9,29)},J=_=>"bg"+_[0].toUpperCase()+_.slice(1),F="Bright";return"black,red,green,yellow,blue,magenta,cyan,white,gray".split(",").map(((_,$)=>{B=J(_),8>$?(H[_+F]=o(90+$,se),H[B+F]=o(100+$,ae)):$=60,H[_]=o(30+$,se),H[B]=o(40+$,ae)})),r.extend(H)};Wt.exports=et,et.default=et});var Oe=class{#r=new Map;#t=new Map;#o=1;#e=!1;#s=null;constructor(){this.#s=g.on("app:shutdown",async()=>{process.env.NOORM_DEBUG&&console.error(`[ConnectionManager] app:shutdown received, closing ${this.size} connections`),this.#e=!0,await this.closeAll(),process.env.NOORM_DEBUG&&console.error("[ConnectionManager] all connections closed")})}track(t,r){let n=this.#o++;return this.#t.set(n,{conn:t,configName:r,createdAt:new Date}),n}untrack(t){this.#t.delete(t)}async getConnection(t,r){let n=t.name;if(this.#r.has(n))return this.#r.get(n);let i=await r(t);return this.#r.set(n,i),i}async closeCached(t){let r=this.#r.get(t);if(r){let[,n]=await p(()=>r.destroy());this.#r.delete(t),n?g.emit("error",{source:"connection",error:n}):g.emit("connection:close",{configName:t})}}async closeAll(){let r=Array.from(this.#r.keys());for(let i of r)await this.closeCached(i);let n=Array.from(this.#t.entries());for(let[i,o]of n){let s=Promise.race([o.conn.destroy(),new Promise(f=>setTimeout(f,5e3))]),[,l]=await p(()=>s);this.#t.delete(i),l?g.emit("error",{source:"connection",error:l}):g.emit("connection:close",{configName:o.configName})}}hasCached(t){return this.#r.has(t)}get size(){return this.#r.size+this.#t.size}get isShuttingDown(){return this.#e}dispose(){this.#s&&(this.#s(),this.#s=null)}},X=null;function De(){return X||(X=new Oe),X}async function lr(){X&&(await X.closeAll(),X.dispose(),X=null)}import{execSync as ft}from"child_process";import{userInfo as mr}from"os";function Pe(e={}){let t;return e.configIdentity?t=pt(e.configIdentity,"config"):e.cryptoIdentity?t=dr(e.cryptoIdentity):process.env.NOORM_IDENTITY?t=pt(process.env.NOORM_IDENTITY,"env"):e.skipGit?t=yt():t=gr()??yt(),g.emit("identity:resolved",{name:t.name,email:t.email,source:t.source}),t}function dr(e){return{name:e.name,email:e.email,source:"state"}}function pt(e,t){let r=e.trim(),n=r.match(/^(.+?)\s*<([^>]+)>$/);return n?{name:n[1].trim(),email:n[2].trim(),source:t}:{name:r,source:t}}function gr(){let[e,t]=P(()=>ft("git config user.name",{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim());if(t||!e)return null;let[r]=P(()=>ft("git config user.email",{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim());return{name:e,email:r||void 0,source:"git"}}function yt(){return{name:mr().username,source:"system"}}function fr(e){return e.email?`${e.name} <${e.email}>`:e.name}import{execSync as Ct}from"child_process";import{hostname as Be,platform as Fe,release as Ue,userInfo as Or}from"os";import{generateKeyPairSync as pr,createCipheriv as yr,createDecipheriv as hr,createPrivateKey as br,createPublicKey as wr,diffieHellman as xr,hkdfSync as ht,randomBytes as _r}from"crypto";function _e(){let{publicKey:e,privateKey:t}=pr("x25519",{publicKeyEncoding:{type:"spki",format:"der"},privateKeyEncoding:{type:"pkcs8",format:"der"}});return{publicKey:e.toString("hex"),privateKey:t.toString("hex")}}function bt(e,t){let r=br({key:Buffer.from(e,"hex"),format:"der",type:"pkcs8"}),n=wr({key:Buffer.from(t,"hex"),format:"der",type:"spki"});return xr({privateKey:r,publicKey:n})}function wt(e,t){return Buffer.from(ht("sha256",e,Buffer.alloc(0),t,32))}function vr(e,t,r,n){let i=_e(),o=bt(i.privateKey,t),s=wt(o,"noorm-config-share"),l=_r(16),f=yr("aes-256-gcm",s,l),m=Buffer.concat([f.update(e,"utf8"),f.final()]),h=f.getAuthTag();return{version:1,sender:r,recipient:n,ephemeralPubKey:i.publicKey,iv:l.toString("hex"),authTag:h.toString("hex"),ciphertext:m.toString("hex")}}function $r(e,t){if(e.version!==1)throw new Error(`Unsupported payload version: ${e.version}`);let r=bt(t,e.ephemeralPubKey),n=wt(r,"noorm-config-share"),i=hr("aes-256-gcm",n,Buffer.from(e.iv,"hex"));return i.setAuthTag(Buffer.from(e.authTag,"hex")),Buffer.concat([i.update(Buffer.from(e.ciphertext,"hex")),i.final()]).toString("utf8")}function kr(e){let t=Buffer.from(e,"hex");return Buffer.from(ht("sha256",t,Buffer.alloc(0),"noorm-state-encryption",32))}import{homedir as Sr}from"os";import{join as ve}from"path";import{chmod as xt,mkdir as Cr,readFile as Ke,stat as _t,writeFile as Ve}from"fs/promises";var oe=ve(Sr(),".noorm"),le=ve(oe,"identity.key"),me=ve(oe,"identity.pub"),vt=384,$t=420,kt=ve(oe,"identity.json");async function St(){let[,e]=await p(()=>Cr(oe,{recursive:!0}));if(e)throw new Error(`Failed to create ${oe}: ${e.message}`)}async function je(e){await St();let[,t]=await p(()=>Ve(le,e.privateKey,{encoding:"utf8",mode:vt}));if(t)throw new Error(`Failed to write private key: ${t.message}`);await p(()=>xt(le,vt));let[,r]=await p(()=>Ve(me,e.publicKey,{encoding:"utf8",mode:$t}));if(r)throw new Error(`Failed to write public key: ${r.message}`);await p(()=>xt(me,$t))}async function $e(e){await St();let t={identityHash:e.identityHash,name:e.name,email:e.email,publicKey:e.publicKey,machine:e.machine,os:e.os,createdAt:e.createdAt},[,r]=await p(()=>Ve(kt,JSON.stringify(t,null,2),{encoding:"utf8"}));if(r)throw new Error(`Failed to write identity metadata: ${r.message}`)}async function Ae(){let[e,t]=await p(()=>Ke(kt,{encoding:"utf8"}));if(t){if(t.code==="ENOENT")return null;throw new Error(`Failed to read identity metadata: ${t.message}`)}let[r,n]=P(()=>JSON.parse(e));return n?null:r}async function Ir(){let[e,t]=await p(()=>Ke(le,{encoding:"utf8"}));if(t){if(t.code==="ENOENT")return null;throw new Error(`Failed to read private key: ${t.message}`)}return e.trim()}async function ke(){let[e,t]=await p(()=>Ke(me,{encoding:"utf8"}));if(t){if(t.code==="ENOENT")return null;throw new Error(`Failed to read public key: ${t.message}`)}return e.trim()}async function Rr(){let[e]=await p(()=>_t(le)),[t]=await p(()=>_t(me));return!!e&&!!t}function Nr(){return le}function Er(){return me}function Tr(){return oe}import{createHash as Mr}from"crypto";function Se(e){if(!e.email||!e.name||!e.machine||!e.os)throw new Error("All fields required for identity hash: email, name, machine, os");let t=[e.email,e.name,e.machine,e.os].join("\0");return Mr("sha256").update(t,"utf8").digest("hex")}function Lr(e,t=8){return e.slice(0,t)}function Dr(){let[e]=P(()=>Ct("git config user.name",{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim()),[t]=P(()=>Ct("git config user.email",{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim());return{name:e||Or().username,email:t||"",machine:Be(),os:`${Fe()} ${Ue()}`}}async function Pr(e,t=!0){if(!e.name?.trim())throw new Error("Name is required for identity");if(!e.email?.trim())throw new Error("Email is required for identity");let r=e.machine?.trim()||Be(),n=`${Fe()} ${Ue()}`,i=_e(),o=Se({email:e.email.trim(),name:e.name.trim(),machine:r,os:n}),s={identityHash:o,name:e.name.trim(),email:e.email.trim(),publicKey:i.publicKey,machine:r,os:n,createdAt:new Date().toISOString()};return t&&(await je(i),await $e(s)),g.emit("identity:created",{identityHash:o,name:s.name,email:s.email,machine:s.machine}),{identity:s,keypair:i}}async function Vr(e){if(!e.name?.trim())throw new Error("Name is required for identity");if(!e.email?.trim())throw new Error("Email is required for identity");let t=await ke();if(!t)return null;let r=e.machine?.trim()||Be(),n=`${Fe()} ${Ue()}`,i=Se({email:e.email.trim(),name:e.name.trim(),machine:r,os:n}),o={identityHash:i,name:e.name.trim(),email:e.email.trim(),publicKey:t,machine:r,os:n,createdAt:new Date().toISOString()};return await $e(o),g.emit("identity:created",{identityHash:i,name:o.name,email:o.email,machine:o.machine}),o}async function de(){let e=await Ae();if(!e)return null;let t=await ke();return t?{...e,publicKey:t}:null}var L=Object.freeze({schema:1,state:1,settings:1}),ee=class extends Error{constructor(r,n,i){super(`${r} version ${n} is newer than CLI supports (${i}). Please upgrade noorm.`);this.layer=r;this.current=n;this.expected=i;this.name="VersionMismatchError"}},Y=class extends Error{constructor(r,n,i){super(`${r} migration v${n} failed: ${i.message}`);this.layer=r;this.version=n;this.cause=i;this.name="MigrationError"}};function ie(e,t){return t==="postgres"?e.addColumn("id","serial",r=>r.primaryKey()):e.addColumn("id","integer",r=>r.primaryKey().autoIncrement())}var It={version:1,description:"Create initial tracking tables",async up(e,t){await ie(e.schema.createTable("__noorm_version__"),t).addColumn("cli_version","varchar(50)",r=>r.notNull()).addColumn("noorm_version","integer",r=>r.notNull()).addColumn("state_version","integer",r=>r.notNull()).addColumn("settings_version","integer",r=>r.notNull()).addColumn("installed_at","timestamp",r=>r.notNull().defaultTo(K`CURRENT_TIMESTAMP`)).addColumn("upgraded_at","timestamp",r=>r.notNull().defaultTo(K`CURRENT_TIMESTAMP`)).execute(),await ie(e.schema.createTable("__noorm_change__"),t).addColumn("name","varchar(255)",r=>r.notNull()).addColumn("change_type","varchar(50)",r=>r.notNull()).addColumn("direction","varchar(50)",r=>r.notNull()).addColumn("checksum","varchar(64)",r=>r.notNull().defaultTo("")).addColumn("executed_at","timestamp",r=>r.notNull().defaultTo(K`CURRENT_TIMESTAMP`)).addColumn("executed_by","varchar(255)",r=>r.notNull().defaultTo("")).addColumn("config_name","varchar(255)",r=>r.notNull().defaultTo("")).addColumn("cli_version","varchar(50)",r=>r.notNull().defaultTo("")).addColumn("status","varchar(50)",r=>r.notNull()).addColumn("error_message","text",r=>r.notNull().defaultTo("")).addColumn("duration_ms","integer",r=>r.notNull().defaultTo(0)).execute(),await ie(e.schema.createTable("__noorm_executions__"),t).addColumn("change_id","integer",r=>r.notNull().references("__noorm_change__.id").onDelete("cascade")).addColumn("filepath","varchar(500)",r=>r.notNull()).addColumn("file_type","varchar(10)",r=>r.notNull()).addColumn("checksum","varchar(64)",r=>r.notNull().defaultTo("")).addColumn("cli_version","varchar(50)",r=>r.notNull().defaultTo("")).addColumn("status","varchar(50)",r=>r.notNull()).addColumn("error_message","text",r=>r.notNull().defaultTo("")).addColumn("skip_reason","varchar(100)",r=>r.notNull().defaultTo("")).addColumn("duration_ms","integer",r=>r.notNull().defaultTo(0)).execute(),await ie(e.schema.createTable("__noorm_lock__"),t).addColumn("config_name","varchar(255)",r=>r.notNull().unique()).addColumn("locked_by","varchar(255)",r=>r.notNull()).addColumn("locked_at","timestamp",r=>r.notNull().defaultTo(K`CURRENT_TIMESTAMP`)).addColumn("expires_at","timestamp",r=>r.notNull()).addColumn("reason","varchar(255)",r=>r.notNull().defaultTo("")).execute(),await ie(e.schema.createTable("__noorm_identities__"),t).addColumn("identity_hash","varchar(64)",r=>r.notNull().unique()).addColumn("email","varchar(255)",r=>r.notNull()).addColumn("name","varchar(255)",r=>r.notNull()).addColumn("machine","varchar(255)",r=>r.notNull()).addColumn("os","varchar(255)",r=>r.notNull()).addColumn("public_key","text",r=>r.notNull()).addColumn("encrypted_vault_key","text").addColumn("registered_at","timestamp",r=>r.notNull().defaultTo(K`CURRENT_TIMESTAMP`)).addColumn("last_seen_at","timestamp",r=>r.notNull().defaultTo(K`CURRENT_TIMESTAMP`)).execute(),await ie(e.schema.createTable("__noorm_vault__"),t).addColumn("secret_key","varchar(255)",r=>r.notNull().unique()).addColumn("encrypted_value","text",r=>r.notNull()).addColumn("set_by","varchar(255)",r=>r.notNull()).addColumn("created_at","timestamp",r=>r.notNull().defaultTo(K`CURRENT_TIMESTAMP`)).addColumn("updated_at","timestamp",r=>r.notNull().defaultTo(K`CURRENT_TIMESTAMP`)).execute(),await e.schema.createIndex("idx_executions_change_id").on("__noorm_executions__").column("change_id").execute(),await e.schema.createIndex("idx_change_name_config").on("__noorm_change__").columns(["name","config_name"]).execute(),await e.schema.createIndex("idx_vault_secret_key").on("__noorm_vault__").column("secret_key").execute()},async down(e,t){await e.schema.dropIndex("idx_change_name_config").execute(),await e.schema.dropIndex("idx_executions_change_id").execute(),await e.schema.dropIndex("idx_vault_secret_key").execute(),await e.schema.dropTable("__noorm_vault__").execute(),await e.schema.dropTable("__noorm_identities__").execute(),await e.schema.dropTable("__noorm_lock__").execute(),await e.schema.dropTable("__noorm_executions__").execute(),await e.schema.dropTable("__noorm_change__").execute(),await e.schema.dropTable("__noorm_version__").execute()}};var Kr="https://registry.npmjs.org/@noormdev/cli",jr=5e3;async function Rt(){let e=new AbortController,t=setTimeout(()=>e.abort(),jr),[r,n]=await p(()=>fetch(Kr,{signal:e.signal,headers:{Accept:"application/json"}}));if(clearTimeout(t),n||!r?.ok)return null;let[i,o]=await p(()=>r.json());return o?null:i??null}function He(e,t="latest"){return e["dist-tags"][t]??null}function Nt(e,t){let n=Object.keys(e.versions).filter(i=>i.includes(`-${t}`));return n.sort((i,o)=>{let[s="0.0.0",l]=i.split(`-${t}`),[f="0.0.0",m]=o.split(`-${t}`),h=s.localeCompare(f,void 0,{numeric:!0});if(h!==0)return h;let v=parseInt(l?.replace(".","")||"0",10),C=parseInt(m?.replace(".","")||"0",10);return v-C}),n}function Ce(){return"1.0.0-alpha.12"}function ze(e){let t=e.match(/-(\w+)\.?(\d+)?$/);return!t||!t[1]?null:{channel:t[1],number:t[2]?parseInt(t[2],10):0}}function Ar(e,t){let r=e.split("-")[0]??"0.0.0",n=t.split("-")[0]??"0.0.0",i=parseInt(r.split(".")[0]??"0",10);return parseInt(n.split(".")[0]??"0",10)>i}function Et(e,t){let r=e.split("-")[0]??"0.0.0",n=t.split("-")[0]??"0.0.0",i=r.split(".").map(Number),o=n.split(".").map(Number);for(let C=0;C<3;C++){let A=i[C]??0,B=o[C]??0;if(A>B)return 1;if(A<B)return-1}let s=ze(e),l=ze(t);if(!s&&l)return 1;if(s&&!l)return-1;if(!s&&!l)return 0;let f={alpha:0,beta:1,rc:2},m=f[s.channel]??99,h=f[l.channel]??99;if(m!==h)return m>h?1:-1;let v=s.number-l.number;return v===0?0:v>0?1:-1}async function ko(){let e=Ce();if(e==="0.0.0-dev")return{currentVersion:e,latestVersion:e,updateAvailable:!1,isMajorUpdate:!1,isPrerelease:!0,channel:"dev"};g.emit("update:checking",{});let t=await Rt();if(!t)return g.emit("update:check-failed",{error:"Network error or timeout"}),null;let r=ze(e),n;if(r){let l=Nt(t,r.channel),f=l[l.length-1],m=He(t,"latest");m&&Et(m,e)>0?n=m:n=f??e}else n=He(t,"latest")??e;let i=Et(n,e)>0,o=i&&Ar(e,n),s={currentVersion:e,latestVersion:n,updateAvailable:i,isMajorUpdate:o,isPrerelease:!!r,channel:r?.channel};return i?o?g.emit("update:major-available",{currentVersion:e,latestVersion:n}):g.emit("update:available",{currentVersion:e,latestVersion:n}):g.emit("update:not-available",{currentVersion:e}),s}var Tt=[It];async function ge(e){let[t,r]=await p(async()=>(await K`SELECT 1 FROM __noorm_version__ LIMIT 1`.execute(e),!0));return r?!1:t}async function Mt(e){if(!await ge(e))return 0;let[r,n]=await p(async()=>e.selectFrom("__noorm_version__").select("noorm_version").orderBy("id","desc").limit(1).executeTakeFirst());return n?0:r?.noorm_version??0}async function We(e){let t=await Mt(e),r=L.schema;return g.emit("version:schema:checking",{current:t}),{current:t,expected:r,needsMigration:t<r,isNewer:t>r}}async function Lt(e,t,r){let n=performance.now();g.emit("version:schema:migrating",{from:0,to:L.schema});for(let o of Tt){let[,s]=await p(()=>o.up(e,t));if(s)throw new Y("schema",o.version,s)}await e.insertInto("__noorm_version__").values({cli_version:Ce(),noorm_version:L.schema,state_version:r?.stateVersion??L.state,settings_version:r?.settingsVersion??L.settings}).execute();let i=performance.now()-n;g.emit("version:schema:migrated",{from:0,to:L.schema,durationMs:i}),await fe(e)}async function Ot(e){if(!await ge(e))return null;let[r,n]=await p(async()=>e.selectFrom("__noorm_version__").select(["state_version","settings_version"]).orderBy("id","desc").limit(1).executeTakeFirst());return n||!r?null:{stateVersion:r.state_version,settingsVersion:r.settings_version}}async function Ye(e,t,r){let n=await We(e);if(n.isNewer)throw g.emit("version:mismatch",{layer:"schema",current:n.current,expected:n.expected}),new ee("schema",n.current,n.expected);if(!n.needsMigration)return;if(n.current===0){await Lt(e,t,r);return}let i=performance.now();g.emit("version:schema:migrating",{from:n.current,to:L.schema});let o=await Ot(e),s=Tt.filter(f=>f.version>n.current);for(let f of s){let[,m]=await p(()=>f.up(e,t));if(m)throw new Y("schema",f.version,m)}await e.insertInto("__noorm_version__").values({cli_version:Ce(),noorm_version:L.schema,state_version:r?.stateVersion??o?.stateVersion??L.state,settings_version:r?.settingsVersion??o?.settingsVersion??L.settings}).execute();let l=performance.now()-i;g.emit("version:schema:migrated",{from:n.current,to:L.schema,durationMs:l}),await fe(e)}async function Br(e,t,r){await Ye(e,t,r)}import{relative as Fr,sep as qe}from"path";function Ur(e,t,r,n){let i=l=>l.split(/[\\/]/).join(qe),o=r.map(i),s=n.map(i);return e.filter(l=>{let f=Fr(t,l),m=o.length===0||o.some(v=>f===v||f.startsWith(v+qe)),h=s.some(v=>f===v||f.startsWith(v+qe));return m&&!h})}import{createWriteStream as On}from"fs";import{join as Dn,dirname as Pn}from"path";import{mkdir as Vn}from"fs/promises";var Zr=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","JENKINS_URL","BUILDKITE","TEAMCITY_VERSION","TF_BUILD","BITBUCKET_BUILD_NUMBER"];function Ie(){if(process.env.NOORM_HEADLESS==="true")return!0;for(let e of Zr)if(process.env[e])return!0;return!process.stdout.isTTY}function hi(){return process.env.NODE_ENV==="development"||process.env.NOORM_DEV==="true"}function bi(){return process.env.NOORM_CONFIG}var Te=mt(Dt(),1);import{join as En,dirname as Tn}from"path";import{createWriteStream as Mn}from"fs";import{mkdir as Ln}from"fs/promises";var Pt={silent:0,error:1,warn:2,info:3,verbose:4},Vt={enabled:!0,level:"info",file:".noorm/state/noorm.log",maxSize:"10mb",maxFiles:5};var Qr=[/^error$/,/:error$/,/:failed$/],Xr=[/:warning$/,/:blocked$/,/:expired$/],en=[/:before$/,/:acquiring$/,/:file$/],tn=[/^update:/,/^global-settings:/,/^settings:/,/^file:/,/^change:/,/^build:/,/^run:/,/^lock:/,/^state:/,/^config:/,/^secret:/,/^known-user:/,/^db:/,/^template:/,/^identity:/,/^connection:/,/^app:/,/^transfer:/,/^dt:/,/^vault:/];function Re(e){for(let t of Qr)if(t.test(e))return"error";for(let t of Xr)if(t.test(e))return"warn";for(let t of en)if(t.test(e))return"debug";for(let t of tn)if(t.test(e))return"info";return"debug"}function Kt(e,t){if(t==="silent")return!1;if(t==="verbose")return!0;let r=Re(e),n=rn(r),i=Pt[t];return n<=i}function rn(e){switch(e){case"error":return 1;case"warn":return 2;case"info":return 3;case"debug":return 4}}var nn={"file:before":e=>`Executing ${e.filepath}`,"file:after":e=>e.status==="success"?`Executed ${e.filepath} (${e.durationMs}ms)`:`Failed ${e.filepath}: ${e.error}`,"file:skip":e=>`Skipped ${e.filepath} (${e.reason})`,"change:start":e=>`Starting ${e.direction} for ${e.name} (${e.files?.length??0} files)`,"change:file":e=>`${e.change}: ${e.filepath} (${e.index}/${e.total})`,"change:complete":e=>`${e.direction} ${e.name}: ${e.status} (${e.durationMs}ms)`,"build:start":e=>`Starting schema build (${e.fileCount} files)`,"build:complete":e=>e.status==="success"?`Build complete: ${e.filesRun} run, ${e.filesSkipped} skipped (${e.durationMs}ms)`:`Build failed after ${e.filesRun} files (${e.durationMs}ms)`,"run:file":e=>`Running ${e.filepath} on ${e.configName}`,"run:dir":e=>`Running directory ${e.dirpath} (${e.fileCount} files) on ${e.configName}`,"lock:acquiring":e=>`Acquiring lock for ${e.configName} as ${e.identity}`,"lock:acquired":e=>`Lock acquired for ${e.configName}`,"lock:released":e=>`Lock released for ${e.configName}`,"lock:blocked":e=>`Lock blocked: ${e.configName} held by ${e.holder}`,"lock:expired":e=>`Lock expired for ${e.configName} (was held by ${e.previousHolder})`,"state:loaded":e=>`State loaded: ${e.configCount} configs, version ${e.version}`,"state:persisted":e=>`State saved: ${e.configCount} configs`,"state:migrated":e=>`State migrated from ${e.from} to ${e.to}`,"config:created":e=>`Created config: ${e.name}`,"config:updated":e=>`Updated config ${e.name}: ${e.fields?.join(", ")}`,"config:deleted":e=>`Deleted config: ${e.name}`,"config:activated":e=>`Activated config: ${e.name}${e.previous?` (was ${e.previous})`:""}`,"secret:set":e=>`Set secret ${e.key} for ${e.configName}`,"secret:deleted":e=>`Deleted secret ${e.key} from ${e.configName}`,"global-secret:set":e=>`Set global secret: ${e.key}`,"global-secret:deleted":e=>`Deleted global secret: ${e.key}`,"db:creating":e=>`Creating database ${e.database} for ${e.configName}`,"db:created":e=>`Created database ${e.database} (${e.durationMs}ms)`,"db:destroying":e=>`Destroying database ${e.database} for ${e.configName}`,"db:destroyed":e=>`Destroyed database ${e.database}`,"db:bootstrap":e=>`Bootstrapped ${e.tables?.length??0} tables for ${e.configName}`,"template:render":e=>`Rendered template ${e.filepath} (${e.durationMs}ms)`,"template:load":e=>`Loaded ${e.format} data from ${e.filepath}`,"identity:resolved":e=>`Identity resolved: ${e.name} (${e.source})`,"identity:created":e=>`Created identity: ${e.name} <${e.email}>`,"identity:registered":e=>`Registered identity for ${e.name}`,"identity:synced":e=>`Synced ${e.discovered} identities for ${e.configName}`,"identity:not-found":()=>"No identity found","vault:initialized":e=>`Vault initialized for ${e.identityHash}`,"vault:secret:created":e=>`Created vault secret: ${e.key} (by ${e.setBy})`,"vault:secret:updated":e=>`Updated vault secret: ${e.key} (by ${e.setBy})`,"vault:secret:deleted":e=>`Deleted vault secret: ${e.key}`,"vault:propagated":e=>`Propagated vault access to ${e.toEmail}`,"vault:copy:starting":e=>`Copying vault secrets from ${e.source} to ${e.destination} (${e.keys==="all"?"all":`${e.keys} keys`})`,"vault:copy:completed":e=>`Vault copy complete: ${e.copied} copied, ${e.skipped} skipped, ${e.errors} errors`,"config:exported":e=>`Exported ${e.configName} to ${e.recipient}`,"config:imported":e=>`Imported ${e.configName} from ${e.from}`,"connection:open":e=>`Connected to ${e.configName} (${e.dialect})`,"connection:close":e=>`Disconnected from ${e.configName}`,"connection:error":e=>`Connection error for ${e.configName}: ${e.error}`,"logger:started":e=>`Logger started: ${e.file} at ${e.level} level`,"logger:rotated":e=>`Rotated log: ${e.oldFile} -> ${e.newFile}`,"logger:error":e=>`Logger error: ${e.error?.message??e.error}`,"logger:flushed":e=>`Flushed ${e.entriesWritten} log entries`,"settings:loaded":e=>`Settings loaded from ${e.path}`,"settings:saved":e=>`Settings saved to ${e.path}`,"settings:initialized":e=>`Settings initialized at ${e.path}${e.force?" (forced)":""}`,error:e=>`Error in ${e.source}: ${on(e.error)}`};function on(e){if(e==null)return"Unknown error";if(e instanceof Error||typeof e=="object"&&"message"in e&&typeof e.message=="string")return e.message;if(typeof e=="object"){let t=e;if(t.code&&t.severity){let n=[`${t.severity} ${t.code}`];return t.routine&&n.push(`in ${t.routine}`),t.where&&n.push(`- ${String(t.where).slice(0,100)}`),n.join(" ")}let r=Object.keys(t).slice(0,3);if(r.length>0)return`{${r.map(n=>`${n}: ${sn(t[n])}`).join(", ")}}`}return String(e)}function sn(e){return e==null?String(e):typeof e=="string"?e.length>30?`"${e.slice(0,27)}..."`:`"${e}"`:typeof e=="number"||typeof e=="boolean"?String(e):"[...]"}function jt(e,t){let r=nn[e];if(r){let[i,o]=P(()=>r(t));if(!o&&i!==null)return i}let n=Object.entries(t).slice(0,3).map(([i,o])=>`${i}=${an(o)}`);return n.length===0?e.replace(/:/g," "):`${e.replace(/:/g," ")}: ${n.join(", ")}`}function an(e){return e==null?String(e):typeof e=="string"?e.length>50?`"${e.slice(0,47)}..."`:`"${e}"`:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?`[${e.length} items]`:typeof e=="object"?`{${Object.keys(e).length} keys}`:String(e)}var rt=mt(Yt(),1),R=rt.default,{Ansis:Ii,fg:Ri,bg:Ni,rgb:Ei,bgRgb:Ti,hex:Mi,bgHex:Li,reset:Oi,inverse:Di,hidden:Pi,visible:Vi,bold:Ki,dim:ji,italic:Ai,underline:Bi,strikethrough:Fi,black:Ui,red:Hi,green:zi,yellow:Wi,blue:Yi,magenta:qi,cyan:Gi,white:Ji,gray:Zi,redBright:Qi,greenBright:Xi,yellowBright:es,blueBright:ts,magentaBright:rs,cyanBright:ns,whiteBright:os,bgBlack:is,bgRed:ss,bgGreen:as,bgYellow:cs,bgBlue:us,bgMagenta:ls,bgCyan:ms,bgWhite:ds,bgGray:gs,bgRedBright:fs,bgGreenBright:ps,bgYellowBright:ys,bgBlueBright:hs,bgMagentaBright:bs,bgCyanBright:ws,bgWhiteBright:xs}=rt.default;var V={primary:"#3B82F6",success:"#10B981",warning:"#F59E0B",error:"#EF4444",info:"#8B5CF6",debug:"#8B5CF6",action:"#3B82F6",secondary:"#6B7280",muted:"#9CA3AF",destructive:"#EF4444",text:"#F3F4F6",textDim:"#D1D5DB",border:"#4B5563",borderLight:"#6B7280",background:"#1F2937"},x={primary:e=>R.hex(V.primary)(e),success:e=>R.hex(V.success)(e),warning:e=>R.hex(V.warning)(e),error:e=>R.hex(V.error)(e),info:e=>R.hex(V.info)(e),debug:e=>R.hex(V.debug)(e),action:e=>R.hex(V.action)(e),secondary:e=>R.hex(V.secondary)(e),muted:e=>R.hex(V.muted)(e),destructive:e=>R.hex(V.destructive)(e),text:e=>R.hex(V.text)(e),textDim:e=>R.hex(V.textDim)(e),border:e=>R.hex(V.border)(e),borderLight:e=>R.hex(V.borderLight)(e),bold:R.bold,dim:R.dim,italic:R.italic,underline:R.underline,inverse:R.inverse,reset:R.reset},Ne={success:"\u2713",error:"\u2717",warning:"\u26A0",info:"\u2022",debug:"\u25CB",pending:"\u25CC",arrow:"\u2192",bullet:"\u2022",check:"\u2713",cross:"\u2717",star:"\u2605",dot:"\xB7"};var G={string(e){return x.text(e)},number(e){return x.warning(String(e))},boolean(e){return e?x.success("true"):x.error("false")},nil(){return x.muted("null")},pair(e,t){let r=typeof t=="number"?G.number(t):typeof t=="boolean"?G.boolean(t):t==null?G.nil():G.string(String(t));return`${x.muted(e)}=${r}`},path(e){return x.info(e)},duration(e){return e<1e3?x.muted(`${e}ms`):x.muted(`${(e/1e3).toFixed(2)}s`)},count(e,t,r){let n=e===1?t:r??`${t}s`;return`${x.warning(String(e))} ${x.text(n)}`}},pe={error:x.error,warn:x.warning,info:x.info,debug:x.debug},ye={error:Ne.error,warn:Ne.warning,info:Ne.info,debug:Ne.debug};var gn={error:{icon:ye.error,color:pe.error},warn:{icon:ye.warn,color:pe.warn},info:{icon:ye.info,color:pe.info},debug:{icon:ye.debug,color:pe.debug}};function fn(e){if(e===null)return G.nil();if(e===void 0)return x.muted("undefined");if(typeof e=="string")return e.length>50?x.text(`"${e.slice(0,47)}..."`):x.text(e);if(typeof e=="number")return G.number(e);if(typeof e=="boolean")return G.boolean(e);if(e instanceof Date)return x.muted(e.toISOString());if(e instanceof Error)return x.error(e.message);if(Array.isArray(e))return e.length===0?x.muted("[]"):e.length<=3&&e.every(t=>typeof t=="string"||typeof t=="number")?x.text(`[${e.join(", ")}]`):x.muted(`[${e.length} items]`);if(typeof e=="object"){let[t,r]=P(()=>JSON.stringify(e));return r?x.muted("[object]"):x.text(t.length>60?t.slice(0,57)+"...":t)}return x.text(String(e))}function pn(e){let t=[];for(let[r,n]of Object.entries(e))t.push(`${x.muted(r)}=${fn(n)}`);return t.join(" ")}function qt(e,t,r,n){let i=gn[e],o=i.color(i.icon),s=i.color(t),l=`${o} ${s} ${x.text(r)}`;return n&&Object.keys(n).length>0&&(l+=` ${pn(n)}`),l}var Cs={success:x.success("\u2713"),failed:x.error("\u2717"),partial:x.warning("\u26A0"),pending:x.warning("\u25CB"),skipped:x.muted("\u25CB"),reverted:x.info("\u21A9")};var Gt=12,U=new Set;function yn(e){return e.replace(/[-_\s]+(.)?/g,(t,r)=>r?r.toUpperCase():"").replace(/^[A-Z]/,t=>t.toLowerCase())}function hn(e){return e.replace(/[-\s]+/g,"_").replace(/([a-z])([A-Z])/g,"$1_$2").toLowerCase()}function bn(e){return e.replace(/[_\s]+/g,"-").replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function Jt(e){return e.replace(/[-_\s]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function nt(e){return e.replace(/[-_\s]/g,"")}function Ee(e){for(let t of e){let r=[t,`noorm_${t}`];for(let n of r)U.add(n),U.add(n.toLowerCase()),U.add(n.toUpperCase()),U.add(yn(n)),U.add(hn(n)),U.add(bn(n)),U.add(Jt(n)),U.add(nt(n)),U.add(nt(n).toLowerCase()),U.add(nt(n).toUpperCase())}}Ee(["password","pass","secret","token","key","credential","api_key","apikey","access_key","secret_key","db_pass","db_password","redis_pass","client_secret","private_key","encryption_key","auth_token","bearer_token","jwt_secret","session_secret"]);function wn(e,t,r){let n=e.length,i=Math.min(n,Gt),o=Math.min(Math.ceil(n/5),4)||1,s="*".repeat(i);return r==="verbose"&&n>=4&&(s=e.slice(0,o)+"*".repeat(Math.max(0,i-4)),s.length<i&&(s+="*".repeat(i-s.length))),n>Gt&&(s+="..."),`<${Jt(t)} ${s} (${n}) />`}function Zt(e){if(e.stages){for(let t of Object.values(e.stages))if(t.secrets&&Array.isArray(t.secrets)){let r=t.secrets.map(n=>n.key);Ee(r)}}}function Qt(){let e=[];return e.push(g.on("secret:set",({key:t})=>{Ee([t])})),e.push(g.on("global-secret:set",({key:t})=>{Ee([t])})),()=>e.forEach(t=>t())}function he(e,t){if(e==null||typeof e!="object"||e instanceof URL||e instanceof Date)return e;if(Array.isArray(e))return e.map(n=>typeof n=="object"&&n!==null?he(n,t):n);let r={...e};for(let n in r){let i=Object.getOwnPropertyDescriptor(r,n);if(i&&!i.writable&&!i.set)continue;let o=r[n];U.has(n)&&typeof o=="string"?r[n]=wn(o,n,t):typeof o=="object"&&o!==null&&(r[n]=he(o,t))}return r}import{stat as xn,rename as _n,readdir as vn,unlink as $n}from"fs/promises";import{dirname as er,basename as tr,join as rr,extname as nr}from"path";function kn(e){let t=e.toLowerCase().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/);if(!t||!t[1])throw new Error(`Invalid size format: ${e}`);let r=parseFloat(t[1]),n=t[2]??"b",o={b:1,kb:1024,mb:1024*1024,gb:1024*1024*1024}[n];if(o===void 0)throw new Error(`Invalid size unit: ${n}`);return Math.floor(r*o)}function Sn(e){let t=er(e),r=nr(e),n=tr(e,r),i=new Date().toISOString().replace(/:/g,"-").replace(/\.\d+Z$/,"");return rr(t,`${n}.${i}${r}`)}async function Cn(e,t){let[r,n]=await p(()=>xn(e));return n?!1:r.size>=t}async function In(e){let t=Sn(e),[r,n]=await p(()=>_n(e,t));if(n)throw new Error(`Failed to rotate log file: ${n.message}`);return t}async function Rn(e){let t=er(e),r=nr(e),n=tr(e,r),i=new RegExp(`^${Xt(n)}\\.\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}${Xt(r)}$`),[o,s]=await p(()=>vn(t));return s?[]:o.filter(l=>i.test(l)).map(l=>rr(t,l)).sort().reverse()}async function Nn(e,t){let n=(await Rn(e)).slice(t),i=[];for(let o of n){let[s,l]=await p(()=>$n(o));l||i.push(o)}return i}async function ot(e,t,r){let n=kn(t);if(!await Cn(e,n))return{rotated:!1};let o=await In(e),s=await Nn(e,r);return{rotated:!0,oldFile:e,newFile:o,deletedFiles:s.length>0?s:void 0}}function Xt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function or(e,t){for(let[r,n]of Object.entries(e))if(!(r in t))if(n==null)t[r]=n;else if(Array.isArray(n))t[r]=JSON.stringify(n);else if(typeof n=="object")for(let[i,o]of Object.entries(n)){let s=`${r}.${i}`;s in t||(t[s]=typeof o=="object"&&o!==null?JSON.stringify(o):o)}else t[r]=n}var be=class{#r;#t;#o;#e={file:null,console:process.stdout,diagnostics:process.stderr};#s=!1;#l=!1;#i=null;#n="idle";#a=null;#c=null;constructor(t){this.#r=t.projectRoot,this.#t={...Vt,...t.config},this.#o=t.context??{},this.#l=t.json??Ie(),this.#l&&(this.#s=!1),t.color&&(this.#s=t.color),t.console&&(this.#e.console=t.console),t.diagnostics&&(this.#e.diagnostics=t.diagnostics),t.file&&(this.#e.file=t.file),this.#c=g.on("app:shutdown",async()=>{await this.stop()})}get state(){return this.#n}get level(){return this.#t.level}get filepath(){return En(this.#r,this.#t.file)}get isEnabled(){return this.#t.enabled&&this.#t.level!=="silent"}get stats(){return this.#n!=="running"||!this.#i?null:{pending:this.#i.pending,totalWritten:this.#i.stats.processed}}async flush(){!this.#i||this.#n!=="running"||await this.#i.flush()}setContext(t){this.#o={...this.#o,...t}}clearContext(){this.#o={}}async start(){if(this.#n==="idle"&&this.isEnabled){if(!this.#e.file&&this.#t.file){let t=this.filepath;await Ln(Tn(t),{recursive:!0}),this.#e.file=Mn(t,{flags:"a"})}if(this.#e.file){let t=await ot(this.filepath,this.#t.maxSize,this.#t.maxFiles);t.rotated&&g.emit("logger:rotated",{oldFile:t.oldFile,newFile:t.newFile}),this.#a=setInterval(()=>{this.#p()},6e4)}this.#i=g.queue(/./,t=>{let{event:r,data:n}=t;this.#f(r,n)},{name:"logger",autoStart:!0,concurrency:1,type:"fifo",debug:process.env.NOORM_LOGGER_DEBUG==="true"}),this.#n="running",g.emit("logger:started",{file:this.filepath,level:this.#t.level})}}async stop(){this.#n==="running"&&(this.#n="flushing",this.#a&&(clearInterval(this.#a),this.#a=null),this.#i&&(await this.#i.stop(),this.#i=null),this.#e.file&&this.#e.file!==process.stdout&&this.#e.file!==process.stderr&&await new Promise(t=>{this.#e.file.end(()=>t())}),this.#c&&(this.#c(),this.#c=null),this.#n="stopped")}#f(t,r){if(t.startsWith("logger:")||!Kt(t,this.#t.level))return;let n=Re(t);(t.endsWith(":complete")||t.endsWith(":after"))&&"status"in r&&r.status!=="success"&&r.status!=="skipped"&&(n="error"),r.error&&(n="error");let i=he({...r},this.#t.level),o=jt(t,i);this.#m(n,t,o,i),this.#d(n,t,o,i)}#m(t,r,n,i){let o=i&&Object.keys(i).length>0;if(this.#l){let s=this.#g(t,r,n,i,o);this.#e.console.write(JSON.stringify(s)+`
|
|
4
|
-
`)}else if(this.#s){let s=(0,Te.default)().format("YY-MM-DD HH:mm:ss"),l=qt(t,r,n,o?i:void 0);this.#e.diagnostics.write(`[${s}] ${l}
|
|
5
|
-
`)}else{let s=(0,Te.default)().format("YY-MM-DD HH:mm:ss"),l=t.toUpperCase().padEnd(5),f=`[${s}] [${l}] [${r}] ${n}`;o&&(f+=` ${JSON.stringify(i)}`),this.#e.diagnostics.write(f+`
|
|
6
|
-
`)}}#d(t,r,n,i){if(!this.#e.file)return;let o=i&&Object.keys(i).length>0,s=this.#g(t,r,n,i,o);this.#e.file.write(JSON.stringify(s)+`
|
|
7
|
-
`)}#g(t,r,n,i,o){let s={time:(0,Te.default)().format("YYYY-MM-DDTHH:mm:ss.SSSZ"),type:r,level:t,message:n};return o&&Object.keys(i).length>0&&or(i,s),this.#o&&Object.keys(this.#o).length>0&&or(this.#o,s),s}async#p(){if(!this.#e.file||this.#n!=="running")return;let t=await ot(this.filepath,this.#t.maxSize,this.#t.maxFiles);t.rotated&&g.emit("logger:rotated",{oldFile:t.oldFile,newFile:t.newFile})}info(t,r){this.#u("info",t,r)}warn(t,r){this.#u("warn",t,r)}error(t,r){this.#u("error",t,r)}debug(t,r){this.#u("debug",t,r)}#u(t,r,n){if(!this.isEnabled||this.#n!=="running")return;let i={error:1,warn:2,info:3,debug:4},o={silent:0,error:1,warn:2,info:3,verbose:4};if(i[t]>o[this.#t.level])return;let s=n?he({...n},this.#t.level):{};this.#m(t,"log",r,s),this.#d(t,"log",r,s)}result(t){let r=JSON.stringify(t)+`
|
|
8
|
-
`;this.#e.console&&this.#e.console.write(r),this.#e.file&&this.#e.file.write(r)}},it=null;function ir(e){if(!it&&e){let t={projectRoot:"",settings:{}};typeof e=="string"?t.projectRoot=e:t=dt(t,e),it=new be(t)}return it}var Kn=null,sr=null,at=null,st={};function ra(e,t){sr||(st=t??{},Kn=Qt(),sr=g.once("settings:loaded",async r=>{let{settings:n}=r;if(!n.logging?.enabled)return;Zt(n);let i;if(!Ie()){let o=Dn(e,n.logging.file??".noorm/state/noorm.log"),[,s]=await p(()=>Vn(Pn(o),{recursive:!0}));s||(i=On(o,{flags:"a"}))}at=new be({projectRoot:e,settings:n,config:n.logging,file:i,console:st.console,diagnostics:st.diagnostics}),await at.start()}))}function ar(){return at??ir()}async function Me(e,t){let[r,n]=await p(()=>e.selectFrom("__noorm_identities__").select(["id"]).where("identity_hash","=",t.identityHash).executeTakeFirst());if(n)return g.emit("error",{source:"identity:register:select",error:n,context:{identityHash:t.identityHash,name:t.name,email:t.email}}),{ok:!1,registered:!1,error:n.message};if(r){let[,o]=await p(()=>e.updateTable("__noorm_identities__").set({last_seen_at:new Date}).where("identity_hash","=",t.identityHash).execute());return o?(g.emit("error",{source:"identity:register:update",error:o,context:{identityHash:t.identityHash,name:t.name,email:t.email}}),{ok:!1,registered:!1,error:o.message}):{ok:!0,registered:!1}}let[,i]=await p(()=>e.insertInto("__noorm_identities__").values({identity_hash:t.identityHash,email:t.email,name:t.name,machine:t.machine,os:t.os,public_key:t.publicKey}).execute());return i?(g.emit("error",{source:"identity:register:insert",error:i,context:{identityHash:t.identityHash,name:t.name,email:t.email}}),{ok:!1,registered:!1,error:i.message}):(g.emit("identity:registered",{identityHash:t.identityHash,name:t.name,email:t.email}),{ok:!0,registered:!0})}async function cr(e,t){let[r,n]=await p(()=>e.selectFrom("__noorm_identities__").selectAll().execute());return n?{ok:!1,users:[],error:n.message}:{ok:!0,users:(r??[]).map(o=>({identityHash:o.identity_hash,email:o.email,name:o.name,publicKey:o.public_key,machine:o.machine,os:o.os,lastSeen:o.last_seen_at instanceof Date?o.last_seen_at.toISOString():String(o.last_seen_at),source:t}))}}async function ur(e,t,r){let[n,i]=await p(()=>ge(e));if(i)return{ok:!1,error:i.message};if(!n)return{ok:!0,knownUsersCount:0};let o=!1;if(t){let m=await Me(e,t);if(!m.ok)return{ok:!1,error:m.error};o=m.registered}let[s,l]=await p(()=>e.selectFrom("__noorm_identities__").select(e.fn.count("id").as("count")).executeTakeFirst());if(l)return{ok:!1,error:l.message};let f=Number(s?.count??0);return g.emit("identity:synced",{configName:r,registered:o,knownUsersCount:f}),{ok:!0,registered:o,knownUsersCount:f}}async function jn(e){let[t]=await p(()=>de());if(ar()?.info("Loaded existing identity",{identity:t}),!t)return{ok:!0,knownUsersCount:0};let[r,n]=await p(()=>Le(e.connection,e.name));if(n)return g.emit("error",{source:"identity:sync:connection",error:n,context:{configName:e.name}}),{ok:!0,knownUsersCount:0};let i=r.db,o=await ur(i,t,e.name);if(!o.ok)return o;if(o.knownUsersCount&&o.knownUsersCount>0){let[s,l]=await p(()=>cr(i,e.name));if(l)return g.emit("error",{source:"identity:fetch-known-users",error:l,context:{configName:e.name}}),{ok:!1,error:l.message};let{ok:f,users:m,error:h}=s;return f?{...o,knownUsers:m}:{ok:!1,error:h}}return o}var ct=null;function An(e={}){return e.configIdentity||e.cryptoIdentity?Pe(e):(ct||(ct=Pe(e)),ct)}function ka(e){return An({configIdentity:e.identity})}async function fe(e){let t=await de();if(t||g.emit("identity:not-found"),!t)return;let[,r]=await p(()=>Me(e,t));r&&g.emit("error",{error:r,source:"identity:ensure",context:{identity:t}})}async function Bn(e){switch(e){case"sqlite":return(await import("./sqlite-KSGG7IKM.js")).createSqliteConnection;case"postgres":return(await import("./postgres-7E352BHM.js")).createPostgresConnection;case"mysql":return(await import("./mysql-EEPNIS5Q.js")).createMysqlConnection;case"mssql":return(await import("./mssql-Y7W7F4UH.js")).createMssqlConnection;default:throw new Error(`Unsupported dialect: ${e}`)}}function Fn(e){return{postgres:"npm install pg",mysql:"npm install mysql2",sqlite:"npm install better-sqlite3",mssql:"npm install tedious tarn"}[e]}async function Le(e,t="__default__"){let[r,n]=await p(()=>gt(async()=>{let[m,h]=await p(()=>Bn(e.dialect));if(h)throw h.message.includes("Cannot find module")?new Error(`Missing driver for ${e.dialect}. Install it with:
|
|
9
|
-
`+Fn(e.dialect)):h;let v=await m(e);return await K`SELECT 1`.execute(v.db),v},{retries:3,delay:1e3,backoff:2,jitterFactor:.1,shouldRetry:m=>{let h=m.message.toLowerCase();return h.includes("authentication")||h.includes("password")||h.includes("missing driver")?!1:h.includes("econnrefused")||h.includes("etimedout")||h.includes("too many connections")||h.includes("connection reset")}}));if(n)throw g.emit("connection:error",{configName:t,error:n.message}),n;let i=De(),o=i.track(r,t),s=r.destroy,l=async()=>{i.untrack(o),await s(),g.emit("connection:close",{configName:t})},f={db:r.db,dialect:r.dialect,destroy:l};return g.emit("connection:open",{configName:t,dialect:e.dialect}),await fe(f.db),f}var Un={postgres:"postgres",mysql:void 0,sqlite:void 0,mssql:"master"};async function Hn(e,t={}){let r=e;if(t.testServerOnly&&e.dialect!=="sqlite"){let o=Un[e.dialect];r={...e,database:o??e.database}}let[n,i]=await p(()=>Le(r,"__test__"));return i?{ok:!1,error:i.message}:(await n.destroy(),{ok:!0})}export{Ae as a,Ir as b,Rr as c,Nr as d,Er as e,Tr as f,vr as g,$r as h,kr as i,De as j,lr as k,Pe as l,fr as m,Lr as n,Dr as o,Pr as p,Vr as q,de as r,Ce as s,ko as t,ge as u,Lt as v,Br as w,Ur as x,Ie as y,hi as z,bi as A,Dt as B,R as C,V as D,wn as E,be as F,ra as G,Me as H,jn as I,An as J,ka as K,Le as L,Hn as M};
|