squilo 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,31 +1,37 @@
1
1
  import { config as config2 } from "mssql";
2
- import { Transaction as Transaction3 } from "mssql";
3
2
  import { Transaction as Transaction2 } from "mssql";
3
+ import { ConnectionError, TransactionError, RequestError, PreparedStatementError } from "mssql";
4
+ type ErrorType = Error | ConnectionError | TransactionError | RequestError | PreparedStatementError;
5
+ type ExecutionError = Record<string, ErrorType>;
6
+ type ExecutionData<TReturn> = {
7
+ database: string;
8
+ data: TReturn;
9
+ };
4
10
  type OutputStrategy<
5
11
  TReturn,
6
12
  TOutput = void
7
- > = (data: ReadableStream<Record<string, TReturn>>) => Promise<TOutput>;
8
- import { ConnectionError, PreparedStatementError, RequestError, TransactionError } from "mssql";
9
- type ErrorType = Error | ConnectionError | TransactionError | RequestError | PreparedStatementError;
10
- type ExecutionError = {
11
- database: string;
12
- error: ErrorType;
13
+ > = (data: ReadableStream<ExecutionData<TReturn>>) => Promise<TOutput>;
14
+ type TransformChain<
15
+ TInput,
16
+ TOutput
17
+ > = {
18
+ Output<TFinalOutput>(strategy: OutputStrategy<TOutput, TFinalOutput>): Promise<[ExecutionError[], TFinalOutput]>;
13
19
  };
20
+ type TransformFunction<
21
+ TInput,
22
+ TOutput
23
+ > = (data: TInput) => TOutput | Promise<TOutput>;
14
24
  type RetrieveChain<TReturn> = {
25
+ Transform<TOutput>(transformFn: TransformFunction<TReturn, TOutput>): TransformChain<TReturn, TOutput>;
15
26
  Output<TOutput>(strategy: OutputStrategy<TReturn, TOutput>): Promise<[ExecutionError[], TOutput]>;
16
27
  };
17
- type InputChain<TParam> = {
18
- Execute(fn: (transaction: Transaction2, database: string, params: TParam) => Promise<void>): Promise<ExecutionError[]>;
19
- Retrieve<TResult>(fn: (transaction: Transaction2, database: string, params: TParam) => Promise<TResult>): RetrieveChain<TResult>;
20
- };
21
28
  type ConnectionOptions = {
22
29
  database: string;
23
30
  query: `SELECT${string}FROM${string}`;
24
31
  };
25
32
  type ConnectionChain = {
26
- Execute(fn: (transaction: Transaction3, database: string) => Promise<void>): Promise<ExecutionError[]>;
27
- Retrieve<TResult>(fn: (transaction: Transaction3, database: string) => Promise<TResult>): RetrieveChain<TResult>;
28
- Input<TParam>(fn: () => TParam): InputChain<TParam>;
33
+ Execute(fn: (transaction: Transaction2, database: string) => Promise<void>): Promise<ExecutionError[]>;
34
+ Retrieve<TResult>(fn: (transaction: Transaction2, database: string) => Promise<TResult>): RetrieveChain<TResult>;
29
35
  };
30
36
  type AuthenticationChain = {
31
37
  Connect(database: string): ConnectionChain;
package/dist/index.js CHANGED
@@ -37,7 +37,7 @@ function Pool(poolConfig) {
37
37
  };
38
38
  }
39
39
 
40
- // src/pipes/shared/transaction-runner.ts
40
+ // src/pipes/shared/runner/index.ts
41
41
  import { Presets, SingleBar } from "cli-progress";
42
42
 
43
43
  // src/utils/load-env.ts
@@ -48,13 +48,15 @@ var LoadEnv = () => {
48
48
  };
49
49
  };
50
50
 
51
- // src/pipes/shared/transaction-runner.ts
51
+ // src/pipes/shared/runner/types.ts
52
52
  class SafeGuardError extends Error {
53
53
  constructor() {
54
54
  super(`Safe guard reached`);
55
55
  }
56
56
  }
57
- var TransactionRunner = () => {
57
+
58
+ // src/pipes/shared/runner/index.ts
59
+ var Runner = () => {
58
60
  const singleBar = new SingleBar({
59
61
  format: `{bar} {percentage}% | {value}/{total} | {database}`
60
62
  }, Presets.shades_classic);
@@ -106,15 +108,14 @@ var TransactionRunner = () => {
106
108
  var Execute = (connections$, databases$, input) => {
107
109
  return async (fn) => {
108
110
  const errors = [];
109
- const [runner, singleBar] = TransactionRunner();
111
+ const [runner, singleBar] = Runner();
110
112
  const executeFn = (dc) => runner({
111
113
  connection: dc,
112
114
  input,
113
115
  fn,
114
116
  onError: async (error) => {
115
117
  errors.push({
116
- database: dc.database,
117
- error: {
118
+ [dc.database]: {
118
119
  name: error.name,
119
120
  message: error.message,
120
121
  stack: error.stack,
@@ -154,6 +155,29 @@ var Output = (data, error) => async (strategy) => {
154
155
  return [errors, output];
155
156
  };
156
157
 
158
+ // src/pipes/transform/index.ts
159
+ var Transform = (data, error) => {
160
+ return (transformFn) => {
161
+ class TransformDataStream extends TransformStream {
162
+ constructor() {
163
+ super({
164
+ async transform(chunk, controller) {
165
+ const transformedData2 = {
166
+ database: chunk.database,
167
+ data: await transformFn(chunk.data)
168
+ };
169
+ controller.enqueue(transformedData2);
170
+ }
171
+ });
172
+ }
173
+ }
174
+ const transformedData = data.pipeThrough(new TransformDataStream);
175
+ return {
176
+ Output: Output(transformedData, error)
177
+ };
178
+ };
179
+ };
180
+
157
181
  // src/pipes/retrieve/index.ts
158
182
  var Retrieve = (connections$, databases$, input) => {
159
183
  return (fn) => {
@@ -161,16 +185,16 @@ var Retrieve = (connections$, databases$, input) => {
161
185
  const { readable: readableError, writable: writableError } = new TransformStream;
162
186
  const dataWriter = writableData.getWriter();
163
187
  const errorWriter = writableError.getWriter();
164
- const [runner, singleBar] = TransactionRunner();
188
+ const [runner, singleBar] = Runner();
165
189
  const executeFn = (dc) => runner({
166
190
  connection: dc,
167
191
  input,
168
192
  fn,
169
193
  onSuccess: async (result) => {
170
- await dataWriter.write({ [dc.database]: result });
194
+ await dataWriter.write({ database: dc.database, data: result });
171
195
  },
172
196
  onError: async (error) => {
173
- await errorWriter.write({ database: dc.database, error });
197
+ await errorWriter.write({ [dc.database]: error });
174
198
  }
175
199
  });
176
200
  (async () => {
@@ -189,22 +213,12 @@ var Retrieve = (connections$, databases$, input) => {
189
213
  await errorWriter.close();
190
214
  })();
191
215
  return {
216
+ Transform: Transform(readableData, readableError),
192
217
  Output: Output(readableData, readableError)
193
218
  };
194
219
  };
195
220
  };
196
221
 
197
- // src/pipes/input/index.ts
198
- var Input = (connections$, databases$) => {
199
- return (fn) => {
200
- const params = fn();
201
- return {
202
- Execute: Execute(connections$, databases$, params),
203
- Retrieve: Retrieve(connections$, databases$, params)
204
- };
205
- };
206
- };
207
-
208
222
  // src/pipes/connect/index.ts
209
223
  var Connect = (pool) => (param, concurrent) => {
210
224
  let connections$;
@@ -242,7 +256,6 @@ var Connect = (pool) => (param, concurrent) => {
242
256
  }
243
257
  connections$ = connections(concurrent);
244
258
  return {
245
- Input: Input(connections$, databases$),
246
259
  Execute: Execute(connections$, databases$, null),
247
260
  Retrieve: Retrieve(connections$, databases$, null)
248
261
  };
@@ -270,5 +283,5 @@ export {
270
283
  SQL
271
284
  };
272
285
 
273
- //# debugId=917F0549B607EC5C64756E2164756E21
286
+ //# debugId=1C73627F80ABB76C64756E2164756E21
274
287
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,20 +1,21 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["src/pool/index.ts", "src/pipes/shared/transaction-runner.ts", "src/utils/load-env.ts", "src/pipes/execute/index.ts", "src/pipes/output/index.ts", "src/pipes/retrieve/index.ts", "src/pipes/input/index.ts", "src/pipes/connect/index.ts", "src/pipes/auth/index.ts", "src/pipes/server/index.ts", "src/index.ts"],
3
+ "sources": ["src/pool/index.ts", "src/pipes/shared/runner/index.ts", "src/utils/load-env.ts", "src/pipes/shared/runner/types.ts", "src/pipes/execute/index.ts", "src/pipes/output/index.ts", "src/pipes/transform/index.ts", "src/pipes/retrieve/index.ts", "src/pipes/connect/index.ts", "src/pipes/auth/index.ts", "src/pipes/server/index.ts", "src/index.ts"],
4
4
  "sourcesContent": [
5
5
  "import { type config, ConnectionPool } from 'mssql';\nexport type Pool = {\n connect: (partialConfig: Partial<config>) => Promise<ConnectionPool>;\n closeAll: () => Promise<void>;\n}\n\nexport function Pool(poolConfig: config): Pool {\n const POOL: Record<string, Promise<ConnectionPool>> = {};\n\n return {\n connect: (partialConfig: Partial<config>) => {\n const config = { ...poolConfig, ...partialConfig };\n const database = config.database;\n\n if (!database) {\n throw new Error('Database name is required');\n }\n\n if (!(database in POOL)) {\n const pool = new ConnectionPool(config);\n const close = pool.close.bind(pool);\n\n pool.close = async () => {\n delete POOL[database];\n return await close();\n }\n\n pool.on('error', err => {\n delete POOL[database];\n throw err;\n });\n\n POOL[database] = pool\n .connect()\n .catch(err => {\n delete POOL[database];\n throw err;\n });\n }\n\n return POOL[database]!;\n },\n closeAll: async () => {\n const closes = Object.values(POOL).map(pool => pool.then(p => p.close()));\n await Promise.all(closes);\n }\n\n }\n}",
6
- "import type { ConnectionError, PreparedStatementError, RequestError, Transaction, TransactionError } from 'mssql';\nimport type { DatabaseConnection } from '../connect/types';\nimport { Presets, SingleBar } from 'cli-progress';\nimport { LoadEnv } from '../../utils/load-env';\n\nexport type ErrorType = Error | ConnectionError | TransactionError | RequestError | PreparedStatementError;\n\nexport interface TransactionRunnerOptions<TParam, TReturn> {\n connection: DatabaseConnection;\n input: TParam;\n fn: (transaction: Transaction, database: string, params: TParam) => Promise<TReturn>;\n onSuccess?: (result: TReturn) => Promise<void> | void;\n onError?: (error: ErrorType) => Promise<void> | void;\n}\n\nexport type TransactionRunner = <TParam, TReturn>(options: TransactionRunnerOptions<TParam, TReturn>) => Promise<void>;\n\nclass SafeGuardError extends Error {\n constructor() {\n super(`Safe guard reached`);\n }\n}\n\nexport const TransactionRunner = (): [TransactionRunner, SingleBar] => {\n const singleBar = new SingleBar({\n format: `{bar} {percentage}% | {value}/{total} | {database}`\n }, Presets.shades_classic);\n\n const [guard, trackError] = (() => {\n const limit = LoadEnv().SAFE_GUARD;\n let errorsCount = 0, open = false;\n\n const guard = async () => {\n if (open) {\n throw new SafeGuardError();\n }\n }\n\n const trackError = () => {\n errorsCount++;\n if (errorsCount >= limit) {\n open = true;\n }\n }\n\n return [guard, trackError];\n })()\n\n const runner = async <TParam, TReturn>({\n connection: dc,\n input,\n fn,\n onSuccess = () => { },\n onError = () => { }\n }: TransactionRunnerOptions<TParam, TReturn>): Promise<void> => {\n return guard()\n .then(() => {\n if (singleBar && Bun.env.NODE_ENV !== 'test') {\n singleBar.update({ database: dc.database });\n }\n })\n .then(() => dc.connection)\n .then(opened => opened.transaction())\n .then(tran => tran.begin()\n .then(() => fn(tran, dc.database, input))\n .then(result => onSuccess(result))\n .then(() => tran.commit())\n .then(() => {\n if (singleBar && Bun.env.NODE_ENV !== 'test') {\n singleBar.increment(1, { database: dc.database });\n }\n })\n .catch(error => tran.rollback().then(() => { throw error }))\n )\n .catch(async error => {\n if (error instanceof SafeGuardError) {\n return;\n }\n\n trackError();\n onError(error as ErrorType);\n });\n };\n\n return [runner, singleBar];\n};\n",
6
+ "import { Presets, SingleBar } from 'cli-progress';\nimport { LoadEnv } from '../../../utils/load-env';\nimport { type ErrorType, type RunnerOptions, type TransactionRunner, SafeGuardError } from './types';\n\nexport const Runner = (): [TransactionRunner, SingleBar] => {\n const singleBar = new SingleBar({\n format: `{bar} {percentage}% | {value}/{total} | {database}`\n }, Presets.shades_classic);\n\n const [guard, trackError] = (() => {\n const limit = LoadEnv().SAFE_GUARD;\n let errorsCount = 0, open = false;\n\n const guard = async () => {\n if (open) {\n throw new SafeGuardError();\n }\n }\n\n const trackError = () => {\n errorsCount++;\n if (errorsCount >= limit) {\n open = true;\n }\n }\n\n return [guard, trackError];\n })()\n\n const runner = async <TParam, TReturn>({\n connection: dc,\n input,\n fn,\n onSuccess = () => { },\n onError = () => { }\n }: RunnerOptions<TParam, TReturn>): Promise<void> => {\n return guard()\n .then(() => {\n if (singleBar && Bun.env.NODE_ENV !== 'test') {\n singleBar.update({ database: dc.database });\n }\n })\n .then(() => dc.connection)\n .then(opened => opened.transaction())\n .then(tran => tran.begin()\n .then(() => fn(tran, dc.database, input))\n .then(result => onSuccess(result))\n .then(() => tran.commit())\n .then(() => {\n if (singleBar && Bun.env.NODE_ENV !== 'test') {\n singleBar.increment(1, { database: dc.database });\n }\n })\n .catch(error => tran.rollback().then(() => { throw error }))\n )\n .catch(async error => {\n if (error instanceof SafeGuardError) {\n return;\n }\n\n trackError();\n onError(error as ErrorType);\n });\n };\n\n return [runner, singleBar];\n};\n",
7
7
  "type Env = {\n SAFE_GUARD: number;\n}\n\ntype StringEnv = {\n [P in keyof Env]?: string\n}\n\ndeclare module \"bun\" {\n interface Env extends StringEnv { }\n}\n\nexport const LoadEnv = (): Env => {\n const SAFE_GUARD = Number.parseInt(Bun.env.SAFE_GUARD || '1', 10);\n return {\n SAFE_GUARD: SAFE_GUARD\n }\n}",
8
- "import type { Transaction } from 'mssql';\nimport type { DatabaseConnection } from \"../connect/types\";\nimport { TransactionRunner } from '../shared/transaction-runner';\nimport type { ExecutionError } from './types';\n\nexport const Execute = <TParam>(\n connections$: (databases: string[]) => Generator<DatabaseConnection[]>,\n databases$: Promise<string[]>,\n input: TParam\n) => {\n return async (\n fn: (transaction: Transaction, database: string, params: TParam) => Promise<void>\n ): Promise<ExecutionError[]> => {\n const errors: ExecutionError[] = [];\n\n const [runner, singleBar] = TransactionRunner();\n\n const executeFn = (dc: DatabaseConnection) => runner({\n connection: dc,\n input,\n fn,\n onError: async (error) => {\n errors.push({\n database: dc.database,\n error: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n code: (error as any).code || undefined,\n number: (error as any).number || undefined,\n state: (error as any).state || undefined,\n class: (error as any).class || undefined,\n serverName: (error as any).serverName || undefined,\n procName: (error as any).procName || undefined,\n lineNumber: (error as any).lineNumber || undefined\n }\n });\n }\n });\n\n const databases = await databases$;\n\n if (Bun.env.NODE_ENV !== 'test') {\n singleBar.start(databases.length, 0);\n }\n\n for await (const connectionBatch of connections$(databases)) {\n const executions = connectionBatch.map(executeFn);\n await Promise.allSettled(executions);\n }\n\n if (Bun.env.NODE_ENV !== 'test') {\n singleBar.stop();\n }\n\n return errors;\n };\n};",
9
- "import type { ExecutionError } from \"../execute/types\";\nimport type { OutputStrategy } from \"./strategies/types\";\n\nexport const Output =\n <TReturn, TOutput = void>(\n data: ReadableStream<Record<string, TReturn>>,\n error: ReadableStream<ExecutionError>\n ) =>\n async (strategy: OutputStrategy<TReturn, TOutput>): Promise<[ExecutionError[], TOutput]> => {\n const errors: ExecutionError[] = [];\n const output = await strategy(data);\n for await (const item of error) {\n errors.push(item);\n }\n return [errors, output];\n };\n",
10
- "import type { Transaction } from \"mssql\";\nimport { Output } from \"../output\"\nimport type { DatabaseConnection } from \"../connect/types\";\nimport type { RetrieveChain } from \"./types\";\nimport { TransactionRunner } from \"../shared/transaction-runner\";\nimport type { ExecutionError } from \"../execute/types\";\n\nexport const Retrieve = <TParam>(\n connections$: (databases: string[]) => Generator<DatabaseConnection[]>,\n databases$: Promise<string[]>,\n input: TParam\n) => {\n return <TReturn>(fn: (transaction: Transaction, database: string, params: TParam) => Promise<TReturn>): RetrieveChain<TReturn> => {\n const { readable: readableData, writable: writableData } = new TransformStream<Record<string, TReturn>, Record<string, TReturn>>();\n const { readable: readableError, writable: writableError } = new TransformStream<ExecutionError, ExecutionError>();\n const dataWriter = writableData.getWriter();\n const errorWriter = writableError.getWriter();\n\n const [runner, singleBar] = TransactionRunner();\n\n const executeFn = (dc: DatabaseConnection) => runner({\n connection: dc,\n input,\n fn,\n onSuccess: async (result) => {\n await dataWriter.write({ [dc.database]: result });\n },\n onError: async (error) => {\n await errorWriter.write({ database: dc.database, error });\n }\n });\n\n // Process all connections and close the stream when done\n (async () => {\n const databases = await databases$;\n\n if (Bun.env.NODE_ENV !== 'test') {\n singleBar.start(databases.length, 0);\n }\n\n for await (const connectionBatch of connections$(databases)) {\n const executions = connectionBatch.map(executeFn);\n await Promise.allSettled(executions);\n }\n\n if (Bun.env.NODE_ENV !== 'test') {\n singleBar.stop();\n }\n\n await dataWriter.close();\n await errorWriter.close();\n })();\n\n return {\n Output: Output(readableData, readableError)\n };\n }\n}",
11
- "import { Execute } from \"../execute\";\nimport type { DatabaseConnection } from \"../connect/types\";\nimport { Retrieve } from \"../retrieve\";\nimport type { InputChain } from \"./types\";\n\nexport const Input = (connections$: (databases: string[]) => Generator<DatabaseConnection[]>, databases$: Promise<string[]>) => {\n return <TParam>(fn: () => TParam): InputChain<TParam> => {\n const params = fn();\n return {\n Execute: Execute(connections$, databases$, params),\n Retrieve: Retrieve(connections$, databases$, params)\n }\n }\n}\n",
12
- "import type { Pool } from \"../../pool\";\nimport { Input } from \"../input\";\nimport { Execute } from \"../execute\";\nimport { Retrieve } from \"../retrieve\";\n\nimport type { ConnectOverloads, ConnectionOptions, ConnectionChain, DatabaseConnection } from \"./types\";\nimport { LoadEnv } from \"../../utils/load-env\";\n\nexport const Connect = (pool: Pool): ConnectOverloads => (param: string | string[] | ConnectionOptions, concurrent?: number): ConnectionChain => {\n let connections$: (databases: string[]) => Generator<DatabaseConnection[]>;\n let databases$: Promise<string[]>;\n\n function connections(concurrent: number = Number.MAX_VALUE): (databases: string[]) => Generator<DatabaseConnection[]> {\n return function* (databases: string[]) {\n const _databases = [...databases];\n const safe_guard = LoadEnv().SAFE_GUARD;\n\n if (safe_guard > 0) {\n const guard_test = _databases.splice(0, safe_guard);\n\n for (const database of guard_test) {\n yield [{\n database,\n connection: pool.connect({ database })\n }];\n }\n }\n\n const databases_result_chunks = Array.from(\n { length: Math.ceil(_databases.length / concurrent) },\n (_, i) => _databases.slice(i * concurrent, (i + 1) * concurrent)\n );\n\n for (const databases_result_chunk of databases_result_chunks) {\n yield databases_result_chunk.map(database => ({\n database,\n connection: pool.connect({ database })\n }));\n }\n }\n }\n\n if (typeof param === 'string') {\n databases$ = Promise.resolve([param]);\n }\n\n else if (Array.isArray(param)) {\n databases$ = Promise.resolve(param);\n }\n\n else if (typeof param === 'object' && 'query' in param) {\n databases$ = pool\n .connect({ database: param.database, arrayRowMode: true })\n .then(conn => conn\n .request()\n .query<string[]>(param.query)\n )\n .then(result => result.recordset.flat())\n }\n\n else {\n throw new Error(\"Invalid parameter\");\n }\n\n connections$ = connections(concurrent);\n\n return {\n Input: Input(connections$, databases$),\n Execute: Execute(connections$, databases$, null),\n Retrieve: Retrieve(connections$, databases$, null)\n }\n}",
8
+ "import type { ConnectionError, TransactionError, RequestError, PreparedStatementError, Transaction } from \"mssql\";\nimport type { DatabaseConnection } from \"../../connect/types\";\n\nexport type ErrorType = Error | ConnectionError | TransactionError | RequestError | PreparedStatementError;\n\nexport interface RunnerOptions<TParam, TReturn> {\n connection: DatabaseConnection;\n input: TParam;\n fn: (transaction: Transaction, database: string, params: TParam) => Promise<TReturn>;\n onSuccess?: (result: TReturn) => Promise<void> | void;\n onError?: (error: ErrorType) => Promise<void> | void;\n}\n\nexport type TransactionRunner = <TParam, TReturn>(options: RunnerOptions<TParam, TReturn>) => Promise<void>;\n\nexport type ExecutionError = Record<string, ErrorType>;\nexport type ExecutionData<TReturn> = { database: string, data: TReturn }\n\nexport class SafeGuardError extends Error {\n constructor() {\n super(`Safe guard reached`);\n }\n}",
9
+ "import type { Transaction } from 'mssql';\nimport type { DatabaseConnection } from \"../connect/types\";\nimport { Runner } from '../shared/runner';\nimport type { ExecutionError } from '../shared/runner/types';\n\nexport const Execute = <TParam>(\n connections$: (databases: string[]) => Generator<DatabaseConnection[]>,\n databases$: Promise<string[]>,\n input: TParam\n) => {\n return async (\n fn: (transaction: Transaction, database: string, params: TParam) => Promise<void>\n ): Promise<ExecutionError[]> => {\n const errors: ExecutionError[] = [];\n\n const [runner, singleBar] = Runner();\n\n const executeFn = (dc: DatabaseConnection) => runner({\n connection: dc,\n input,\n fn,\n onError: async (error) => {\n errors.push({\n [dc.database]: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n code: (error as any).code || undefined,\n number: (error as any).number || undefined,\n state: (error as any).state || undefined,\n class: (error as any).class || undefined,\n serverName: (error as any).serverName || undefined,\n procName: (error as any).procName || undefined,\n lineNumber: (error as any).lineNumber || undefined\n }\n });\n }\n });\n\n const databases = await databases$;\n\n if (Bun.env.NODE_ENV !== 'test') {\n singleBar.start(databases.length, 0);\n }\n\n for await (const connectionBatch of connections$(databases)) {\n const executions = connectionBatch.map(executeFn);\n await Promise.allSettled(executions);\n }\n\n if (Bun.env.NODE_ENV !== 'test') {\n singleBar.stop();\n }\n\n return errors;\n };\n};",
10
+ "import type { ExecutionData, ExecutionError } from \"../shared/runner/types\";\nimport type { OutputStrategy } from \"./strategies/types\";\n\nexport const Output =\n <TReturn, TOutput = void>(\n data: ReadableStream<ExecutionData<TReturn >>,\n error: ReadableStream<ExecutionError>\n ) =>\n async (strategy: OutputStrategy<TReturn, TOutput>): Promise<[ExecutionError[], TOutput]> => {\n const errors: ExecutionError[] = [];\n const output = await strategy(data);\n for await (const item of error) {\n errors.push(item);\n }\n return [errors, output];\n };\n",
11
+ "import type { ExecutionData, ExecutionError } from \"../shared/runner/types\";\nimport type { TransformChain, TransformFunction } from \"./types\";\nimport { Output } from \"../output\";\n\nexport const Transform = <TInput>(\n data: ReadableStream<ExecutionData<TInput>>,\n error: ReadableStream<ExecutionError>\n) => {\n return <TOutput>(transformFn: TransformFunction<TInput, TOutput>): TransformChain<TInput, TOutput> => {\n class TransformDataStream extends TransformStream<ExecutionData<TInput>, ExecutionData<TOutput>> {\n constructor() {\n super({\n async transform(chunk, controller) {\n const transformedData: ExecutionData<TOutput> = {\n database: chunk.database,\n data: await transformFn(chunk.data)\n };\n controller.enqueue(transformedData);\n }\n })\n }\n }\n \n const transformedData = data.pipeThrough(new TransformDataStream());\n\n return {\n Output: Output(transformedData, error)\n };\n }\n}",
12
+ "import type { Transaction } from \"mssql\";\nimport { Output } from \"../output\"\nimport { Transform } from \"../transform\"\nimport type { DatabaseConnection } from \"../connect/types\";\nimport type { RetrieveChain } from \"./types\";\nimport { Runner } from \"../shared/runner\";\nimport type { ExecutionData, ExecutionError } from \"../shared/runner/types\";\n\nexport const Retrieve = <TParam>(\n connections$: (databases: string[]) => Generator<DatabaseConnection[]>,\n databases$: Promise<string[]>,\n input: TParam\n) => {\n return <TReturn>(fn: (transaction: Transaction, database: string, params: TParam) => Promise<TReturn>): RetrieveChain<TReturn> => {\n const { readable: readableData, writable: writableData } = new TransformStream<ExecutionData<TReturn>, ExecutionData<TReturn>>();\n const { readable: readableError, writable: writableError } = new TransformStream<ExecutionError, ExecutionError>();\n const dataWriter = writableData.getWriter();\n const errorWriter = writableError.getWriter();\n\n const [runner, singleBar] = Runner();\n\n const executeFn = (dc: DatabaseConnection) => runner({\n connection: dc,\n input,\n fn,\n onSuccess: async (result) => {\n await dataWriter.write({ database: dc.database, data: result });\n },\n onError: async (error) => {\n await errorWriter.write({ [dc.database]: error });\n }\n });\n\n // Process all connections and close the stream when done\n (async () => {\n const databases = await databases$;\n\n if (Bun.env.NODE_ENV !== 'test') {\n singleBar.start(databases.length, 0);\n }\n\n for await (const connectionBatch of connections$(databases)) {\n const executions = connectionBatch.map(executeFn);\n await Promise.allSettled(executions);\n }\n\n if (Bun.env.NODE_ENV !== 'test') {\n singleBar.stop();\n }\n\n await dataWriter.close();\n await errorWriter.close();\n })();\n\n return {\n Transform: Transform(readableData, readableError),\n Output: Output(readableData, readableError)\n };\n }\n}",
13
+ "import type { Pool } from \"../../pool\";\nimport { Execute } from \"../execute\";\nimport { Retrieve } from \"../retrieve\";\n\nimport type { ConnectOverloads, ConnectionOptions, ConnectionChain, DatabaseConnection } from \"./types\";\nimport { LoadEnv } from \"../../utils/load-env\";\n\nexport const Connect = (pool: Pool): ConnectOverloads => (param: string | string[] | ConnectionOptions, concurrent?: number): ConnectionChain => {\n let connections$: (databases: string[]) => Generator<DatabaseConnection[]>;\n let databases$: Promise<string[]>;\n\n function connections(concurrent: number = Number.MAX_VALUE): (databases: string[]) => Generator<DatabaseConnection[]> {\n return function* (databases: string[]) {\n const _databases = [...databases];\n const safe_guard = LoadEnv().SAFE_GUARD;\n\n if (safe_guard > 0) {\n const guard_test = _databases.splice(0, safe_guard);\n\n for (const database of guard_test) {\n yield [{\n database,\n connection: pool.connect({ database })\n }];\n }\n }\n\n const databases_result_chunks = Array.from(\n { length: Math.ceil(_databases.length / concurrent) },\n (_, i) => _databases.slice(i * concurrent, (i + 1) * concurrent)\n );\n\n for (const databases_result_chunk of databases_result_chunks) {\n yield databases_result_chunk.map(database => ({\n database,\n connection: pool.connect({ database })\n }));\n }\n }\n }\n\n if (typeof param === 'string') {\n databases$ = Promise.resolve([param]);\n }\n\n else if (Array.isArray(param)) {\n databases$ = Promise.resolve(param);\n }\n\n else if (typeof param === 'object' && 'query' in param) {\n databases$ = pool\n .connect({ database: param.database, arrayRowMode: true })\n .then(conn => conn\n .request()\n .query<string[]>(param.query)\n )\n .then(result => result.recordset.flat())\n }\n\n else {\n throw new Error(\"Invalid parameter\");\n }\n\n connections$ = connections(concurrent);\n\n return {\n Execute: Execute(connections$, databases$, null),\n Retrieve: Retrieve(connections$, databases$, null)\n }\n}",
13
14
  "import type { ServerConfig } from \"../server/types\";\nimport { Pool } from \"../../pool\";\nimport { Connect } from \"../connect\";\nimport type { AuthenticationChain } from \"./types\";\nimport type { AuthStrategy } from \"./strategies/types\";\n\nexport const Auth = (config: ServerConfig) => (strategy: AuthStrategy): AuthenticationChain => {\n const configWithAuth = strategy(config);\n const pool = Pool(configWithAuth);\n\n return {\n Connect: Connect(pool),\n Close: () => pool.closeAll(),\n }\n}",
14
15
  "import { Auth } from \"../auth\";\nimport type { ServerChain, ServerConfig } from \"./types\";\n\nexport const Server = (config: ServerConfig): ServerChain => ({\n Auth: Auth(config),\n});",
15
16
  "export * from \"./pipes/server\"\nexport * as SQL from \"mssql\""
16
17
  ],
17
- "mappings": "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",
18
- "debugId": "917F0549B607EC5C64756E2164756E21",
18
+ "mappings": "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",
19
+ "debugId": "1C73627F80ABB76C64756E2164756E21",
19
20
  "names": []
20
21
  }
@@ -1,12 +1,16 @@
1
+ type ExecutionData<TReturn> = {
2
+ database: string;
3
+ data: TReturn;
4
+ };
1
5
  type OutputStrategy<
2
6
  TReturn,
3
7
  TOutput = void
4
- > = (data: ReadableStream<Record<string, TReturn>>) => Promise<TOutput>;
8
+ > = (data: ReadableStream<ExecutionData<TReturn>>) => Promise<TOutput>;
5
9
  declare const MergeOutputStrategy: <
6
- TData extends Array<unknown>,
10
+ TData,
7
11
  TMerged = TData extends Array<infer TItem> ? TItem : TData
8
12
  >() => OutputStrategy<TData, TMerged[]>;
9
13
  declare const ConsoleOutputStrategy: <TData>() => OutputStrategy<TData, void>;
10
- declare const JsonOutputStrategy: <TData>() => OutputStrategy<TData, string>;
11
- declare const XlsOutputStrategy: <TData>(unique?: boolean) => OutputStrategy<TData, string>;
14
+ declare const JsonOutputStrategy: <TData>(allowEmpty?: boolean) => OutputStrategy<TData, string>;
15
+ declare const XlsOutputStrategy: <TData extends []>(unique?: boolean) => OutputStrategy<TData, string>;
12
16
  export { XlsOutputStrategy, OutputStrategy, MergeOutputStrategy, JsonOutputStrategy, ConsoleOutputStrategy };
@@ -5,9 +5,11 @@ import"../../../shared/chunk-s3vw82k6.js";
5
5
  var MergeOutputStrategy = () => async (result) => {
6
6
  const data = [];
7
7
  for await (const item of result) {
8
- Object.values(item).forEach((value) => {
9
- data.push(...value);
10
- });
8
+ if (Array.isArray(item.data)) {
9
+ data.push(...item.data);
10
+ } else {
11
+ data.push(item.data);
12
+ }
11
13
  }
12
14
  return data;
13
15
  };
@@ -18,10 +20,23 @@ var ConsoleOutputStrategy = () => async (result) => {
18
20
  }
19
21
  };
20
22
  // src/pipes/output/strategies/json.ts
21
- var JsonOutputStrategy = () => async (result) => {
23
+ var checkEmpty = (item) => {
24
+ const value = item.data;
25
+ if (value instanceof Array) {
26
+ return value.length === 0;
27
+ }
28
+ if (value instanceof Object) {
29
+ return Object.values(value).length === 0;
30
+ }
31
+ return value === null || value === undefined;
32
+ };
33
+ var JsonOutputStrategy = (allowEmpty = true) => async (result) => {
22
34
  const data = {};
23
35
  for await (const item of result) {
24
- Object.assign(data, item);
36
+ if (!allowEmpty && checkEmpty(item)) {
37
+ continue;
38
+ }
39
+ data[item.database] = item.data;
25
40
  }
26
41
  let filename = process.argv[1]?.replace(/\.(?:js|ts)/, "");
27
42
  filename = `${filename}-${Date.now()}.json`;
@@ -37,20 +52,20 @@ import * as XLSX from "xlsx";
37
52
  async function processSeparateSheets(result, workbook) {
38
53
  let hasData = false;
39
54
  for await (const dbResult of result) {
40
- for (const [database, data] of Object.entries(dbResult)) {
41
- let sheetData = [];
42
- if (Array.isArray(data)) {
43
- sheetData = data;
44
- } else if (data && typeof data === "object") {
45
- sheetData = [data];
46
- } else {
47
- sheetData = [{ value: data }];
48
- }
49
- if (sheetData.length > 0) {
50
- const worksheet = XLSX.utils.json_to_sheet(sheetData);
51
- XLSX.utils.book_append_sheet(workbook, worksheet, database);
52
- hasData = true;
53
- }
55
+ const database = dbResult.database;
56
+ const data = dbResult.data;
57
+ let sheetData = [];
58
+ if (Array.isArray(data)) {
59
+ sheetData = data;
60
+ } else if (data && typeof data === "object") {
61
+ sheetData = [data];
62
+ } else {
63
+ sheetData = [{ value: data }];
64
+ }
65
+ if (sheetData.length > 0) {
66
+ const worksheet = XLSX.utils.json_to_sheet(sheetData);
67
+ XLSX.utils.book_append_sheet(workbook, worksheet, database);
68
+ hasData = true;
54
69
  }
55
70
  }
56
71
  return hasData;
@@ -60,20 +75,20 @@ async function processCombinedSheet(result, workbook) {
60
75
  const databaseGroups = {};
61
76
  let currentRow = 1;
62
77
  for await (const dbResult of result) {
63
- for (const [database, data] of Object.entries(dbResult)) {
64
- let sheetData = [];
65
- if (Array.isArray(data)) {
66
- sheetData = data.map((item) => ({ database, ...item }));
67
- } else if (data && typeof data === "object") {
68
- sheetData = [{ database, ...data }];
69
- } else {
70
- sheetData = [{ database, value: data }];
71
- }
72
- databaseGroups[database] ??= { startRow: currentRow, endRow: currentRow };
73
- databaseGroups[database].endRow = currentRow + sheetData.length - 1;
74
- currentRow += sheetData.length;
75
- allData.push(...sheetData);
78
+ const database = dbResult.database;
79
+ const data = dbResult.data;
80
+ let sheetData = [];
81
+ if (Array.isArray(data)) {
82
+ sheetData = data.map((item) => ({ database, ...item }));
83
+ } else if (data && typeof data === "object") {
84
+ sheetData = [{ database, ...data }];
85
+ } else {
86
+ sheetData = [{ database, value: data }];
76
87
  }
88
+ databaseGroups[database] ??= { startRow: currentRow, endRow: currentRow };
89
+ databaseGroups[database].endRow = currentRow + sheetData.length - 1;
90
+ currentRow += sheetData.length;
91
+ allData.push(...sheetData);
77
92
  }
78
93
  if (allData.length === 0) {
79
94
  return false;
@@ -122,5 +137,5 @@ export {
122
137
  ConsoleOutputStrategy
123
138
  };
124
139
 
125
- //# debugId=C1A2E6FBF98747DA64756E2164756E21
140
+ //# debugId=02912BE6658738F764756E2164756E21
126
141
  //# sourceMappingURL=index.js.map
@@ -2,12 +2,12 @@
2
2
  "version": 3,
3
3
  "sources": ["src/pipes/output/strategies/merge.ts", "src/pipes/output/strategies/console.ts", "src/pipes/output/strategies/json.ts", "src/pipes/output/strategies/xls.ts"],
4
4
  "sourcesContent": [
5
- "import type { OutputStrategy } from './types';\n\nexport const MergeOutputStrategy = <TData extends Array<unknown>, TMerged = TData extends Array<infer TItem> ? TItem : TData>(): OutputStrategy<TData, TMerged[]> => async (result) => {\n const data: TMerged[] = [];\n for await (const item of result) {\n Object.values(item).forEach((value) => {\n data.push(...value as TMerged[]);\n });\n }\n return data;\n};",
5
+ "import type { OutputStrategy } from './types';\n\nexport const MergeOutputStrategy = <TData, TMerged = TData extends Array<infer TItem> ? TItem : TData>(): OutputStrategy<TData, TMerged[]> => async (result) => {\n const data: TMerged[] = [];\n for await (const item of result) {\n if (Array.isArray(item.data)) {\n data.push(...item.data);\n } else {\n data.push(item.data as unknown as TMerged);\n }\n }\n return data;\n};",
6
6
  "import type { OutputStrategy } from './types';\n\nexport const ConsoleOutputStrategy = <TData>(): OutputStrategy<TData, void> => async (result) => {\n for await (const data of result) {\n console.log(data);\n }\n};",
7
- "import type { OutputStrategy } from './types';\n\nexport const JsonOutputStrategy = <TData>(): OutputStrategy<TData, string> => async (result) => {\n const data: Record<string, TData[]> = {};\n\n for await (const item of result) {\n Object.assign(data, item);\n }\n\n let filename = process.argv[1]?.replace(/\\.(?:js|ts)/, '')\n filename = `${filename}-${Date.now()}.json`;\n\n try {\n await Bun.write(filename, JSON.stringify(data, null, 2));\n } catch (error) {\n console.error('Error writing JSON file:', error);\n }\n\n return filename;\n};",
8
- "import * as XLSX from 'xlsx';\nimport type { OutputStrategy } from './types';\n\nasync function processSeparateSheets<TData>(\n result: ReadableStream<Record<string, TData>>,\n workbook: XLSX.WorkBook\n): Promise<boolean> {\n let hasData = false;\n\n for await (const dbResult of result) {\n for (const [database, data] of Object.entries(dbResult)) {\n let sheetData: unknown[] = [];\n if (Array.isArray(data)) {\n sheetData = data;\n } else if (data && typeof data === 'object') {\n sheetData = [data];\n } else {\n sheetData = [{ value: data }];\n }\n\n if (sheetData.length > 0) {\n const worksheet = XLSX.utils.json_to_sheet(sheetData);\n XLSX.utils.book_append_sheet(workbook, worksheet, database);\n hasData = true;\n }\n }\n }\n\n return hasData;\n}\n\nasync function processCombinedSheet<TData>(\n result: ReadableStream<Record<string, TData>>,\n workbook: XLSX.WorkBook\n): Promise<boolean> {\n const allData: unknown[] = [];\n const databaseGroups: { [database: string]: { startRow: number, endRow: number } } = {};\n let currentRow = 1; // Start from row 1 (header is row 0)\n\n for await (const dbResult of result) {\n for (const [database, data] of Object.entries(dbResult)) {\n let sheetData: unknown[] = [];\n if (Array.isArray(data)) {\n sheetData = data.map(item => ({ database, ...item }));\n } else if (data && typeof data === 'object') {\n sheetData = [{ database, ...data }];\n } else {\n sheetData = [{ database, value: data }];\n }\n\n // Track the start row for this database group\n databaseGroups[database] ??= { startRow: currentRow, endRow: currentRow };\n\n // Update the end row for this database group\n databaseGroups[database].endRow = currentRow + sheetData.length - 1;\n currentRow += sheetData.length;\n\n allData.push(...sheetData);\n }\n }\n\n if (allData.length === 0) {\n return false;\n }\n\n const worksheet = XLSX.utils.json_to_sheet(allData);\n\n worksheet['!rows'] ??= [];\n\n // Set row grouping for each database\n for (const [_, { startRow, endRow }] of Object.entries(databaseGroups)) {\n // Set level 1 for all rows in this database group\n for (let i = startRow; i <= endRow; i++) {\n worksheet['!rows'][i] ??= { hpx: 20 };\n worksheet['!rows'][i]!.level = i === endRow ? 0 : 1;\n }\n }\n\n XLSX.utils.book_append_sheet(workbook, worksheet, \"Combined\");\n return true;\n}\n\nexport const XlsOutputStrategy = <TData>(unique: boolean = false): OutputStrategy<TData, string> => async (result) => {\n const workbook = XLSX.utils.book_new();\n\n if (unique) {\n const hasData = await processCombinedSheet(result, workbook);\n if (!hasData) {\n const emptyWorksheet = XLSX.utils.json_to_sheet([{ message: \"No data available\" }]);\n XLSX.utils.book_append_sheet(workbook, emptyWorksheet, \"Empty\");\n }\n } else {\n const hasData = await processSeparateSheets(result, workbook);\n if (!hasData) {\n const emptyWorksheet = XLSX.utils.json_to_sheet([{ message: \"No data available\" }]);\n XLSX.utils.book_append_sheet(workbook, emptyWorksheet, \"Empty\");\n }\n }\n\n let filename = process.argv[1]?.replace(/\\.(?:js|ts)/, '');\n filename = `${filename}-${Date.now()}.xlsx`;\n\n try {\n const buffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx', cellStyles: true });\n await Bun.write(filename, buffer);\n return filename;\n } catch (error) {\n console.error('Error writing Excel file');\n throw error;\n }\n};"
7
+ "import type { ExecutionData } from '../../shared/runner/types';\nimport type { OutputStrategy } from './types';\n\nconst checkEmpty = (item: ExecutionData<unknown>) => {\n const value = item.data;\n if (value instanceof Array) {\n return value.length === 0;\n }\n\n if (value instanceof Object) {\n return Object.values(value).length === 0;\n }\n\n return value === null || value === undefined;\n}\n\nexport const JsonOutputStrategy = <TData>(allowEmpty: boolean = true): OutputStrategy<TData, string> => async (result) => {\n const data: Record<string, TData> = {};\n\n for await (const item of result) {\n if (!allowEmpty && checkEmpty(item)) {\n continue;\n }\n data[item.database] = item.data;\n }\n\n let filename = process.argv[1]?.replace(/\\.(?:js|ts)/, '')\n filename = `${filename}-${Date.now()}.json`;\n\n try {\n await Bun.write(filename, JSON.stringify(data, null, 2));\n } catch (error) {\n console.error('Error writing JSON file:', error);\n }\n\n return filename;\n};",
8
+ "import * as XLSX from 'xlsx';\nimport type { OutputStrategy } from './types';\nimport type { ExecutionData } from '../../shared/runner/types';\n\nasync function processSeparateSheets<TData>(\n result: ReadableStream<ExecutionData<TData>>,\n workbook: XLSX.WorkBook\n): Promise<boolean> {\n let hasData = false;\n\n for await (const dbResult of result) {\n const database = dbResult.database;\n const data = dbResult.data;\n\n let sheetData: unknown[] = [];\n if (Array.isArray(data)) {\n sheetData = data;\n } else if (data && typeof data === 'object') {\n sheetData = [data];\n } else {\n sheetData = [{ value: data }];\n }\n\n if (sheetData.length > 0) {\n const worksheet = XLSX.utils.json_to_sheet(sheetData);\n XLSX.utils.book_append_sheet(workbook, worksheet, database);\n hasData = true;\n }\n }\n\n return hasData;\n}\n\nasync function processCombinedSheet<TData>(\n result: ReadableStream<ExecutionData<TData>>,\n workbook: XLSX.WorkBook\n): Promise<boolean> {\n const allData: unknown[] = [];\n const databaseGroups: { [database: string]: { startRow: number, endRow: number } } = {};\n let currentRow = 1; // Start from row 1 (header is row 0)\n\n for await (const dbResult of result) {\n const database = dbResult.database;\n const data = dbResult.data;\n\n let sheetData: unknown[] = [];\n if (Array.isArray(data)) {\n sheetData = data.map(item => ({ database, ...item }));\n } else if (data && typeof data === 'object') {\n sheetData = [{ database, ...data }];\n } else {\n sheetData = [{ database, value: data }];\n }\n\n // Track the start row for this database group\n databaseGroups[database] ??= { startRow: currentRow, endRow: currentRow };\n\n // Update the end row for this database group\n databaseGroups[database].endRow = currentRow + sheetData.length - 1;\n currentRow += sheetData.length;\n\n allData.push(...sheetData);\n }\n\n if (allData.length === 0) {\n return false;\n }\n\n const worksheet = XLSX.utils.json_to_sheet(allData);\n\n worksheet['!rows'] ??= [];\n\n // Set row grouping for each database\n for (const [_, { startRow, endRow }] of Object.entries(databaseGroups)) {\n // Set level 1 for all rows in this database group\n for (let i = startRow; i <= endRow; i++) {\n worksheet['!rows'][i] ??= { hpx: 20 };\n worksheet['!rows'][i]!.level = i === endRow ? 0 : 1;\n }\n }\n\n XLSX.utils.book_append_sheet(workbook, worksheet, \"Combined\");\n return true;\n}\n\nexport const XlsOutputStrategy = <TData extends []>(unique: boolean = false): OutputStrategy<TData, string> => async (result) => {\n const workbook = XLSX.utils.book_new();\n\n if (unique) {\n const hasData = await processCombinedSheet(result, workbook);\n if (!hasData) {\n const emptyWorksheet = XLSX.utils.json_to_sheet([{ message: \"No data available\" }]);\n XLSX.utils.book_append_sheet(workbook, emptyWorksheet, \"Empty\");\n }\n } else {\n const hasData = await processSeparateSheets(result, workbook);\n if (!hasData) {\n const emptyWorksheet = XLSX.utils.json_to_sheet([{ message: \"No data available\" }]);\n XLSX.utils.book_append_sheet(workbook, emptyWorksheet, \"Empty\");\n }\n }\n\n let filename = process.argv[1]?.replace(/\\.(?:js|ts)/, '');\n filename = `${filename}-${Date.now()}.xlsx`;\n\n try {\n const buffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx', cellStyles: true });\n await Bun.write(filename, buffer);\n return filename;\n } catch (error) {\n console.error('Error writing Excel file');\n throw error;\n }\n};"
9
9
  ],
10
- "mappings": ";;;;AAEO,IAAM,sBAAsB,MAAkI,OAAO,WAAW;AAAA,EACrL,MAAM,OAAkB,CAAC;AAAA,EACzB,iBAAiB,QAAQ,QAAQ;AAAA,IAC/B,OAAO,OAAO,IAAI,EAAE,QAAQ,CAAC,UAAU;AAAA,MACrC,KAAK,KAAK,GAAG,KAAkB;AAAA,KAChC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;;ACPF,IAAM,wBAAwB,MAA0C,OAAO,WAAW;AAAA,EAC/F,iBAAiB,QAAQ,QAAQ;AAAA,IAC/B,QAAQ,IAAI,IAAI;AAAA,EAClB;AAAA;;ACHK,IAAM,qBAAqB,MAA4C,OAAO,WAAW;AAAA,EAC9F,MAAM,OAAgC,CAAC;AAAA,EAEvC,iBAAiB,QAAQ,QAAQ;AAAA,IAC/B,OAAO,OAAO,MAAM,IAAI;AAAA,EAC1B;AAAA,EAEA,IAAI,WAAW,QAAQ,KAAK,IAAI,QAAQ,eAAe,EAAE;AAAA,EACzD,WAAW,GAAG,YAAY,KAAK,IAAI;AAAA,EAEnC,IAAI;AAAA,IACF,MAAM,IAAI,MAAM,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,IACvD,OAAO,OAAO;AAAA,IACd,QAAQ,MAAM,4BAA4B,KAAK;AAAA;AAAA,EAGjD,OAAO;AAAA;;AClBT;AAGA,eAAe,qBAA4B,CACzC,QACA,UACkB;AAAA,EAClB,IAAI,UAAU;AAAA,EAEd,iBAAiB,YAAY,QAAQ;AAAA,IACnC,YAAY,UAAU,SAAS,OAAO,QAAQ,QAAQ,GAAG;AAAA,MACvD,IAAI,YAAuB,CAAC;AAAA,MAC5B,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,QACvB,YAAY;AAAA,MACd,EAAO,SAAI,QAAQ,OAAO,SAAS,UAAU;AAAA,QAC3C,YAAY,CAAC,IAAI;AAAA,MACnB,EAAO;AAAA,QACL,YAAY,CAAC,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA,MAG9B,IAAI,UAAU,SAAS,GAAG;AAAA,QACxB,MAAM,YAAiB,WAAM,cAAc,SAAS;AAAA,QAC/C,WAAM,kBAAkB,UAAU,WAAW,QAAQ;AAAA,QAC1D,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAGT,eAAe,oBAA2B,CACxC,QACA,UACkB;AAAA,EAClB,MAAM,UAAqB,CAAC;AAAA,EAC5B,MAAM,iBAA+E,CAAC;AAAA,EACtF,IAAI,aAAa;AAAA,EAEjB,iBAAiB,YAAY,QAAQ;AAAA,IACnC,YAAY,UAAU,SAAS,OAAO,QAAQ,QAAQ,GAAG;AAAA,MACvD,IAAI,YAAuB,CAAC;AAAA,MAC5B,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,QACvB,YAAY,KAAK,IAAI,WAAS,EAAE,aAAa,KAAK,EAAE;AAAA,MACtD,EAAO,SAAI,QAAQ,OAAO,SAAS,UAAU;AAAA,QAC3C,YAAY,CAAC,EAAE,aAAa,KAAK,CAAC;AAAA,MACpC,EAAO;AAAA,QACL,YAAY,CAAC,EAAE,UAAU,OAAO,KAAK,CAAC;AAAA;AAAA,MAIxC,eAAe,cAAc,EAAE,UAAU,YAAY,QAAQ,WAAW;AAAA,MAGxE,eAAe,UAAU,SAAS,aAAa,UAAU,SAAS;AAAA,MAClE,cAAc,UAAU;AAAA,MAExB,QAAQ,KAAK,GAAG,SAAS;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAiB,WAAM,cAAc,OAAO;AAAA,EAElD,UAAU,aAAa,CAAC;AAAA,EAGxB,YAAY,KAAK,UAAU,aAAa,OAAO,QAAQ,cAAc,GAAG;AAAA,IAEtE,SAAS,IAAI,SAAU,KAAK,QAAQ,KAAK;AAAA,MACvC,UAAU,SAAS,OAAO,EAAE,KAAK,GAAG;AAAA,MACpC,UAAU,SAAS,GAAI,QAAQ,MAAM,SAAS,IAAI;AAAA,IACpD;AAAA,EACF;AAAA,EAEK,WAAM,kBAAkB,UAAU,WAAW,UAAU;AAAA,EAC5D,OAAO;AAAA;AAGF,IAAM,oBAAoB,CAAQ,SAAkB,UAAyC,OAAO,WAAW;AAAA,EACpH,MAAM,WAAgB,WAAM,SAAS;AAAA,EAErC,IAAI,QAAQ;AAAA,IACV,MAAM,UAAU,MAAM,qBAAqB,QAAQ,QAAQ;AAAA,IAC3D,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,iBAAsB,WAAM,cAAc,CAAC,EAAE,SAAS,oBAAoB,CAAC,CAAC;AAAA,MAC7E,WAAM,kBAAkB,UAAU,gBAAgB,OAAO;AAAA,IAChE;AAAA,EACF,EAAO;AAAA,IACL,MAAM,UAAU,MAAM,sBAAsB,QAAQ,QAAQ;AAAA,IAC5D,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,iBAAsB,WAAM,cAAc,CAAC,EAAE,SAAS,oBAAoB,CAAC,CAAC;AAAA,MAC7E,WAAM,kBAAkB,UAAU,gBAAgB,OAAO;AAAA,IAChE;AAAA;AAAA,EAGF,IAAI,WAAW,QAAQ,KAAK,IAAI,QAAQ,eAAe,EAAE;AAAA,EACzD,WAAW,GAAG,YAAY,KAAK,IAAI;AAAA,EAEnC,IAAI;AAAA,IACF,MAAM,SAAc,WAAM,UAAU,EAAE,MAAM,UAAU,UAAU,QAAQ,YAAY,KAAK,CAAC;AAAA,IAC1F,MAAM,IAAI,MAAM,UAAU,MAAM;AAAA,IAChC,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IACd,QAAQ,MAAM,0BAA0B;AAAA,IACxC,MAAM;AAAA;AAAA;",
11
- "debugId": "C1A2E6FBF98747DA64756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "02912BE6658738F764756E2164756E21",
12
12
  "names": []
13
13
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "squilo",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -43,7 +43,8 @@
43
43
  "test": "bun test",
44
44
  "test:watch": "bun test --watch",
45
45
  "test:debug": "bun test --inspect",
46
- "build": "bunup"
46
+ "build": "bunup",
47
+ "prepublishOnly": "bun run build"
47
48
  },
48
49
  "devDependencies": {
49
50
  "@biomejs/biome": "2.2.6",