@richardmcquiston01/chat-and-react-adapters 0.6.0 → 0.7.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/README.md CHANGED
@@ -36,10 +36,18 @@ const adapter = new WebhookOutputAdapter("https://api.example.com/events", {
36
36
 
37
37
  ## Error-log adapters
38
38
 
39
- - **`WebhookErrorAdapter`** — POST `ChatError` objects to a webhook URL
40
- - **`MongoDbErrorAdapter`** — insert `ChatError` objects into a MongoDB collection
39
+ - **`WebhookErrorAdapter`** — POST errors to a webhook URL
40
+ - **`MongoDbErrorAdapter`** — insert errors into a MongoDB collection
41
+ - **`JsonFileErrorAdapter`** / **`FlatFileErrorAdapter`** — write to a JSON or text file (Node, Bun)
42
+ - **`SqliteErrorAdapter`** — insert into a SQLite table through any driver
43
+ - **`WebStorageErrorAdapter`** / **`IndexedDbErrorAdapter`** — keep errors in the browser
44
+ - **`CompositeErrorAdapter`** — send each error to several adapters
41
45
 
42
- Both are re-exported from [`@richardmcquiston01/error-log-adapter`](https://www.npmjs.com/package/@richardmcquiston01/error-log-adapter).
46
+ All are re-exported from [`@richardmcquiston01/error-log-adapter`](https://www.npmjs.com/package/@richardmcquiston01/error-log-adapter).
47
+
48
+ ## Storage adapters
49
+
50
+ - **`sqliteAdapter`**, **`fileAdapter`**, **`jsonFileAdapter`** — save form progress on a server, re-exported from [`@richardmcquiston01/storage-adapters`](https://www.npmjs.com/package/@richardmcquiston01/storage-adapters). See [Storage Adapters](https://github.com/RichardMcQuiston01/chat-and-react/blob/main/docs/storage-adapters.md).
43
51
 
44
52
  ## Input adapters
45
53
 
package/dist/index.cjs CHANGED
@@ -20,16 +20,30 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ CompositeErrorAdapter: () => import_error_log_adapter.CompositeErrorAdapter,
23
24
  EventEmitterOutputAdapter: () => EventEmitterOutputAdapter,
25
+ FlatFileErrorAdapter: () => import_error_log_adapter.FlatFileErrorAdapter,
26
+ IndexedDbErrorAdapter: () => import_error_log_adapter.IndexedDbErrorAdapter,
27
+ JsonFileErrorAdapter: () => import_error_log_adapter.JsonFileErrorAdapter,
24
28
  MongoDbErrorAdapter: () => import_error_log_adapter.MongoDbErrorAdapter,
25
29
  MongoDbInputAdapter: () => MongoDbInputAdapter,
26
30
  MySqlInputAdapter: () => MySqlInputAdapter,
31
+ SqliteErrorAdapter: () => import_error_log_adapter.SqliteErrorAdapter,
27
32
  WebSocketOutputAdapter: () => WebSocketOutputAdapter,
33
+ WebStorageErrorAdapter: () => import_error_log_adapter.WebStorageErrorAdapter,
28
34
  WebhookErrorAdapter: () => import_error_log_adapter.WebhookErrorAdapter,
29
- WebhookOutputAdapter: () => WebhookOutputAdapter
35
+ WebhookOutputAdapter: () => WebhookOutputAdapter,
36
+ buildCreateErrorLogTableSql: () => import_error_log_adapter.buildCreateErrorLogTableSql,
37
+ createErrorLogStore: () => import_error_log_adapter.createErrorLogStore,
38
+ fileAdapter: () => import_file.fileAdapter,
39
+ jsonFileAdapter: () => import_json_file.jsonFileAdapter,
40
+ sqliteAdapter: () => import_sqlite.sqliteAdapter
30
41
  });
31
42
  module.exports = __toCommonJS(index_exports);
32
43
  var import_error_log_adapter = require("@richardmcquiston01/error-log-adapter");
44
+ var import_file = require("@richardmcquiston01/storage-adapters/file");
45
+ var import_json_file = require("@richardmcquiston01/storage-adapters/json-file");
46
+ var import_sqlite = require("@richardmcquiston01/storage-adapters/sqlite");
33
47
 
34
48
  // src/input/mongodb-input-adapter.ts
35
49
  var MongoDbInputAdapter = class _MongoDbInputAdapter {
@@ -109,12 +123,23 @@ var WebSocketOutputAdapter = class {
109
123
  };
110
124
  // Annotate the CommonJS export names for ESM import in node:
111
125
  0 && (module.exports = {
126
+ CompositeErrorAdapter,
112
127
  EventEmitterOutputAdapter,
128
+ FlatFileErrorAdapter,
129
+ IndexedDbErrorAdapter,
130
+ JsonFileErrorAdapter,
113
131
  MongoDbErrorAdapter,
114
132
  MongoDbInputAdapter,
115
133
  MySqlInputAdapter,
134
+ SqliteErrorAdapter,
116
135
  WebSocketOutputAdapter,
136
+ WebStorageErrorAdapter,
117
137
  WebhookErrorAdapter,
118
- WebhookOutputAdapter
138
+ WebhookOutputAdapter,
139
+ buildCreateErrorLogTableSql,
140
+ createErrorLogStore,
141
+ fileAdapter,
142
+ jsonFileAdapter,
143
+ sqliteAdapter
119
144
  });
120
145
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/input/mongodb-input-adapter.ts","../src/input/mysql-input-adapter.ts","../src/output/event-emitter-adapter.ts","../src/output/webhook-output-adapter.ts","../src/output/websocket-output-adapter.ts"],"sourcesContent":["// The error-log adapters now live in the standalone error-log-adapter package and are\n// re-exported here so existing imports keep working.\nexport type {\n CollectionLike,\n MongoDbErrorOptions,\n WebhookErrorOptions,\n} from '@richardmcquiston01/error-log-adapter';\nexport { MongoDbErrorAdapter, WebhookErrorAdapter } from '@richardmcquiston01/error-log-adapter';\nexport { MongoDbInputAdapter } from './input/mongodb-input-adapter.js';\nexport { MySqlInputAdapter } from './input/mysql-input-adapter.js';\nexport { EventEmitterOutputAdapter } from './output/event-emitter-adapter.js';\nexport { WebhookOutputAdapter } from './output/webhook-output-adapter.js';\nexport { WebSocketOutputAdapter } from './output/websocket-output-adapter.js';\n","import type { InputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface MongoCollectionLike {\n findOne(filter: object): Promise<object | null>;\n}\n\nexport class MongoDbInputAdapter implements InputAdapter {\n private constructor(private readonly schema: object) {}\n\n /** Fetches one document matching `filter` and caches it as the schema. */\n static async create(\n collection: MongoCollectionLike,\n filter: object,\n ): Promise<MongoDbInputAdapter> {\n const doc = await collection.findOne(filter);\n if (doc === null) {\n throw new Error('MongoDbInputAdapter: no document found');\n }\n return new MongoDbInputAdapter(doc);\n }\n\n transform(_raw: unknown): unknown {\n return this.schema;\n }\n}\n","import type { InputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface MySqlConnectionLike {\n execute(sql: string, params?: unknown[]): Promise<[unknown[], unknown]>;\n}\n\nexport class MySqlInputAdapter implements InputAdapter {\n private constructor(private readonly schema: unknown) {}\n\n /** Executes `sql` and caches the first row as the schema. */\n static async create(\n connection: MySqlConnectionLike,\n sql: string,\n params?: unknown[],\n ): Promise<MySqlInputAdapter> {\n const [rows] = await connection.execute(sql, params);\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new Error('MySqlInputAdapter: query returned no rows');\n }\n return new MySqlInputAdapter(rows[0]);\n }\n\n transform(_raw: unknown): unknown {\n return this.schema;\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface EventEmitterLike {\n emit(event: string, ...args: unknown[]): void;\n}\n\nexport class EventEmitterOutputAdapter implements OutputAdapter {\n constructor(private readonly emitter: EventEmitterLike) {}\n\n emit(event: ChatEvent): void {\n this.emitter.emit(event.type, event);\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface WebhookOptions {\n headers?: Record<string, string>;\n}\n\nexport class WebhookOutputAdapter implements OutputAdapter {\n constructor(\n private readonly url: string,\n private readonly options: WebhookOptions = {},\n ) {}\n\n emit(event: ChatEvent): void {\n fetch(this.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...this.options.headers },\n body: JSON.stringify(event),\n }).catch((err: unknown) => {\n console.error('[chat-and-react] WebhookOutputAdapter:', err);\n });\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface WebSocketLike {\n readyState: number;\n OPEN: number;\n send(data: string): void;\n}\n\nexport class WebSocketOutputAdapter implements OutputAdapter {\n constructor(private readonly socket: WebSocketLike) {}\n\n emit(event: ChatEvent): void {\n if (this.socket.readyState === this.socket.OPEN) {\n this.socket.send(JSON.stringify(event));\n } else {\n console.warn('[chat-and-react] WebSocketOutputAdapter: socket not open');\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,+BAAyD;;;ACDlD,IAAM,sBAAN,MAAM,qBAA4C;AAAA,EAC/C,YAA6B,QAAgB;AAAhB;AAAA,EAAiB;AAAA;AAAA,EAGtD,aAAa,OACX,YACA,QAC8B;AAC9B,UAAM,MAAM,MAAM,WAAW,QAAQ,MAAM;AAC3C,QAAI,QAAQ,MAAM;AAChB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,WAAO,IAAI,qBAAoB,GAAG;AAAA,EACpC;AAAA,EAEA,UAAU,MAAwB;AAChC,WAAO,KAAK;AAAA,EACd;AACF;;;AClBO,IAAM,oBAAN,MAAM,mBAA0C;AAAA,EAC7C,YAA6B,QAAiB;AAAjB;AAAA,EAAkB;AAAA;AAAA,EAGvD,aAAa,OACX,YACA,KACA,QAC4B;AAC5B,UAAM,CAAC,IAAI,IAAI,MAAM,WAAW,QAAQ,KAAK,MAAM;AACnD,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,WAAO,IAAI,mBAAkB,KAAK,CAAC,CAAC;AAAA,EACtC;AAAA,EAEA,UAAU,MAAwB;AAChC,WAAO,KAAK;AAAA,EACd;AACF;;;ACnBO,IAAM,4BAAN,MAAyD;AAAA,EAC9D,YAA6B,SAA2B;AAA3B;AAAA,EAA4B;AAAA,EAEzD,KAAK,OAAwB;AAC3B,SAAK,QAAQ,KAAK,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACNO,IAAM,uBAAN,MAAoD;AAAA,EACzD,YACmB,KACA,UAA0B,CAAC,GAC5C;AAFiB;AACA;AAAA,EAChB;AAAA,EAEH,KAAK,OAAwB;AAC3B,UAAM,KAAK,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,KAAK,QAAQ,QAAQ;AAAA,MACvE,MAAM,KAAK,UAAU,KAAK;AAAA,IAC5B,CAAC,EAAE,MAAM,CAAC,QAAiB;AACzB,cAAQ,MAAM,0CAA0C,GAAG;AAAA,IAC7D,CAAC;AAAA,EACH;AACF;;;ACbO,IAAM,yBAAN,MAAsD;AAAA,EAC3D,YAA6B,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAErD,KAAK,OAAwB;AAC3B,QAAI,KAAK,OAAO,eAAe,KAAK,OAAO,MAAM;AAC/C,WAAK,OAAO,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IACxC,OAAO;AACL,cAAQ,KAAK,0DAA0D;AAAA,IACzE;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/input/mongodb-input-adapter.ts","../src/input/mysql-input-adapter.ts","../src/output/event-emitter-adapter.ts","../src/output/webhook-output-adapter.ts","../src/output/websocket-output-adapter.ts"],"sourcesContent":["// The error-log adapters live in the error-log-adapter package and the storage adapters in\n// the storage-adapters package. They are re-exported here so everything optional can be\n// imported from one place. `nodeFileSystem` (which imports `node:fs`) is not re-exported;\n// import it from '@richardmcquiston01/storage-adapters/file/node'.\nexport type {\n CollectionLike,\n FlatFileErrorOptions,\n IdbDatabaseLike,\n IdbObjectStoreLike,\n IdbTransactionLike,\n IdbUpgradeDatabaseLike,\n IndexedDbErrorOptions,\n IndexedDbErrorRecord,\n JsonFileErrorOptions,\n JsonFileErrorRecord,\n MongoDbErrorOptions,\n SqliteClientLike,\n SqliteErrorOptions,\n StorageLike,\n WebhookErrorOptions,\n WebStorageErrorOptions,\n WebStorageErrorRecord,\n} from '@richardmcquiston01/error-log-adapter';\nexport {\n buildCreateErrorLogTableSql,\n CompositeErrorAdapter,\n createErrorLogStore,\n FlatFileErrorAdapter,\n IndexedDbErrorAdapter,\n JsonFileErrorAdapter,\n MongoDbErrorAdapter,\n SqliteErrorAdapter,\n WebhookErrorAdapter,\n WebStorageErrorAdapter,\n} from '@richardmcquiston01/error-log-adapter';\nexport type { FileAdapterOptions } from '@richardmcquiston01/storage-adapters/file';\nexport { fileAdapter } from '@richardmcquiston01/storage-adapters/file';\nexport type { JsonFileAdapterOptions } from '@richardmcquiston01/storage-adapters/json-file';\nexport { jsonFileAdapter } from '@richardmcquiston01/storage-adapters/json-file';\nexport type {\n SqliteAdapterOptions,\n SqliteDatabaseLike,\n} from '@richardmcquiston01/storage-adapters/sqlite';\nexport { sqliteAdapter } from '@richardmcquiston01/storage-adapters/sqlite';\nexport { MongoDbInputAdapter } from './input/mongodb-input-adapter.js';\nexport { MySqlInputAdapter } from './input/mysql-input-adapter.js';\nexport { EventEmitterOutputAdapter } from './output/event-emitter-adapter.js';\nexport { WebhookOutputAdapter } from './output/webhook-output-adapter.js';\nexport { WebSocketOutputAdapter } from './output/websocket-output-adapter.js';\n","import type { InputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface MongoCollectionLike {\n findOne(filter: object): Promise<object | null>;\n}\n\nexport class MongoDbInputAdapter implements InputAdapter {\n private constructor(private readonly schema: object) {}\n\n /** Fetches one document matching `filter` and caches it as the schema. */\n static async create(\n collection: MongoCollectionLike,\n filter: object,\n ): Promise<MongoDbInputAdapter> {\n const doc = await collection.findOne(filter);\n if (doc === null) {\n throw new Error('MongoDbInputAdapter: no document found');\n }\n return new MongoDbInputAdapter(doc);\n }\n\n transform(_raw: unknown): unknown {\n return this.schema;\n }\n}\n","import type { InputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface MySqlConnectionLike {\n execute(sql: string, params?: unknown[]): Promise<[unknown[], unknown]>;\n}\n\nexport class MySqlInputAdapter implements InputAdapter {\n private constructor(private readonly schema: unknown) {}\n\n /** Executes `sql` and caches the first row as the schema. */\n static async create(\n connection: MySqlConnectionLike,\n sql: string,\n params?: unknown[],\n ): Promise<MySqlInputAdapter> {\n const [rows] = await connection.execute(sql, params);\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new Error('MySqlInputAdapter: query returned no rows');\n }\n return new MySqlInputAdapter(rows[0]);\n }\n\n transform(_raw: unknown): unknown {\n return this.schema;\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface EventEmitterLike {\n emit(event: string, ...args: unknown[]): void;\n}\n\nexport class EventEmitterOutputAdapter implements OutputAdapter {\n constructor(private readonly emitter: EventEmitterLike) {}\n\n emit(event: ChatEvent): void {\n this.emitter.emit(event.type, event);\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface WebhookOptions {\n headers?: Record<string, string>;\n}\n\nexport class WebhookOutputAdapter implements OutputAdapter {\n constructor(\n private readonly url: string,\n private readonly options: WebhookOptions = {},\n ) {}\n\n emit(event: ChatEvent): void {\n fetch(this.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...this.options.headers },\n body: JSON.stringify(event),\n }).catch((err: unknown) => {\n console.error('[chat-and-react] WebhookOutputAdapter:', err);\n });\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface WebSocketLike {\n readyState: number;\n OPEN: number;\n send(data: string): void;\n}\n\nexport class WebSocketOutputAdapter implements OutputAdapter {\n constructor(private readonly socket: WebSocketLike) {}\n\n emit(event: ChatEvent): void {\n if (this.socket.readyState === this.socket.OPEN) {\n this.socket.send(JSON.stringify(event));\n } else {\n console.warn('[chat-and-react] WebSocketOutputAdapter: socket not open');\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA,+BAWO;AAEP,kBAA4B;AAE5B,uBAAgC;AAKhC,oBAA8B;;;ACrCvB,IAAM,sBAAN,MAAM,qBAA4C;AAAA,EAC/C,YAA6B,QAAgB;AAAhB;AAAA,EAAiB;AAAA;AAAA,EAGtD,aAAa,OACX,YACA,QAC8B;AAC9B,UAAM,MAAM,MAAM,WAAW,QAAQ,MAAM;AAC3C,QAAI,QAAQ,MAAM;AAChB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,WAAO,IAAI,qBAAoB,GAAG;AAAA,EACpC;AAAA,EAEA,UAAU,MAAwB;AAChC,WAAO,KAAK;AAAA,EACd;AACF;;;AClBO,IAAM,oBAAN,MAAM,mBAA0C;AAAA,EAC7C,YAA6B,QAAiB;AAAjB;AAAA,EAAkB;AAAA;AAAA,EAGvD,aAAa,OACX,YACA,KACA,QAC4B;AAC5B,UAAM,CAAC,IAAI,IAAI,MAAM,WAAW,QAAQ,KAAK,MAAM;AACnD,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,WAAO,IAAI,mBAAkB,KAAK,CAAC,CAAC;AAAA,EACtC;AAAA,EAEA,UAAU,MAAwB;AAChC,WAAO,KAAK;AAAA,EACd;AACF;;;ACnBO,IAAM,4BAAN,MAAyD;AAAA,EAC9D,YAA6B,SAA2B;AAA3B;AAAA,EAA4B;AAAA,EAEzD,KAAK,OAAwB;AAC3B,SAAK,QAAQ,KAAK,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACNO,IAAM,uBAAN,MAAoD;AAAA,EACzD,YACmB,KACA,UAA0B,CAAC,GAC5C;AAFiB;AACA;AAAA,EAChB;AAAA,EAEH,KAAK,OAAwB;AAC3B,UAAM,KAAK,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,KAAK,QAAQ,QAAQ;AAAA,MACvE,MAAM,KAAK,UAAU,KAAK;AAAA,IAC5B,CAAC,EAAE,MAAM,CAAC,QAAiB;AACzB,cAAQ,MAAM,0CAA0C,GAAG;AAAA,IAC7D,CAAC;AAAA,EACH;AACF;;;ACbO,IAAM,yBAAN,MAAsD;AAAA,EAC3D,YAA6B,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAErD,KAAK,OAAwB;AAC3B,QAAI,KAAK,OAAO,eAAe,KAAK,OAAO,MAAM;AAC/C,WAAK,OAAO,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IACxC,OAAO;AACL,cAAQ,KAAK,0DAA0D;AAAA,IACzE;AAAA,EACF;AACF;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,7 @@
1
- export { CollectionLike, MongoDbErrorAdapter, MongoDbErrorOptions, WebhookErrorAdapter, WebhookErrorOptions } from '@richardmcquiston01/error-log-adapter';
1
+ export { CollectionLike, CompositeErrorAdapter, FlatFileErrorAdapter, FlatFileErrorOptions, IdbDatabaseLike, IdbObjectStoreLike, IdbTransactionLike, IdbUpgradeDatabaseLike, IndexedDbErrorAdapter, IndexedDbErrorOptions, IndexedDbErrorRecord, JsonFileErrorAdapter, JsonFileErrorOptions, JsonFileErrorRecord, MongoDbErrorAdapter, MongoDbErrorOptions, SqliteClientLike, SqliteErrorAdapter, SqliteErrorOptions, StorageLike, WebStorageErrorAdapter, WebStorageErrorOptions, WebStorageErrorRecord, WebhookErrorAdapter, WebhookErrorOptions, buildCreateErrorLogTableSql, createErrorLogStore } from '@richardmcquiston01/error-log-adapter';
2
+ export { FileAdapterOptions, fileAdapter } from '@richardmcquiston01/storage-adapters/file';
3
+ export { JsonFileAdapterOptions, jsonFileAdapter } from '@richardmcquiston01/storage-adapters/json-file';
4
+ export { SqliteAdapterOptions, SqliteDatabaseLike, sqliteAdapter } from '@richardmcquiston01/storage-adapters/sqlite';
2
5
  import { InputAdapter, OutputAdapter, ChatEvent } from '@richardmcquiston01/chat-and-react-core';
3
6
 
4
7
  interface MongoCollectionLike {
package/dist/index.d.ts CHANGED
@@ -1,4 +1,7 @@
1
- export { CollectionLike, MongoDbErrorAdapter, MongoDbErrorOptions, WebhookErrorAdapter, WebhookErrorOptions } from '@richardmcquiston01/error-log-adapter';
1
+ export { CollectionLike, CompositeErrorAdapter, FlatFileErrorAdapter, FlatFileErrorOptions, IdbDatabaseLike, IdbObjectStoreLike, IdbTransactionLike, IdbUpgradeDatabaseLike, IndexedDbErrorAdapter, IndexedDbErrorOptions, IndexedDbErrorRecord, JsonFileErrorAdapter, JsonFileErrorOptions, JsonFileErrorRecord, MongoDbErrorAdapter, MongoDbErrorOptions, SqliteClientLike, SqliteErrorAdapter, SqliteErrorOptions, StorageLike, WebStorageErrorAdapter, WebStorageErrorOptions, WebStorageErrorRecord, WebhookErrorAdapter, WebhookErrorOptions, buildCreateErrorLogTableSql, createErrorLogStore } from '@richardmcquiston01/error-log-adapter';
2
+ export { FileAdapterOptions, fileAdapter } from '@richardmcquiston01/storage-adapters/file';
3
+ export { JsonFileAdapterOptions, jsonFileAdapter } from '@richardmcquiston01/storage-adapters/json-file';
4
+ export { SqliteAdapterOptions, SqliteDatabaseLike, sqliteAdapter } from '@richardmcquiston01/storage-adapters/sqlite';
2
5
  import { InputAdapter, OutputAdapter, ChatEvent } from '@richardmcquiston01/chat-and-react-core';
3
6
 
4
7
  interface MongoCollectionLike {
package/dist/index.mjs CHANGED
@@ -1,5 +1,19 @@
1
1
  // src/index.ts
2
- import { MongoDbErrorAdapter, WebhookErrorAdapter } from "@richardmcquiston01/error-log-adapter";
2
+ import {
3
+ buildCreateErrorLogTableSql,
4
+ CompositeErrorAdapter,
5
+ createErrorLogStore,
6
+ FlatFileErrorAdapter,
7
+ IndexedDbErrorAdapter,
8
+ JsonFileErrorAdapter,
9
+ MongoDbErrorAdapter,
10
+ SqliteErrorAdapter,
11
+ WebhookErrorAdapter,
12
+ WebStorageErrorAdapter
13
+ } from "@richardmcquiston01/error-log-adapter";
14
+ import { fileAdapter } from "@richardmcquiston01/storage-adapters/file";
15
+ import { jsonFileAdapter } from "@richardmcquiston01/storage-adapters/json-file";
16
+ import { sqliteAdapter } from "@richardmcquiston01/storage-adapters/sqlite";
3
17
 
4
18
  // src/input/mongodb-input-adapter.ts
5
19
  var MongoDbInputAdapter = class _MongoDbInputAdapter {
@@ -78,12 +92,23 @@ var WebSocketOutputAdapter = class {
78
92
  }
79
93
  };
80
94
  export {
95
+ CompositeErrorAdapter,
81
96
  EventEmitterOutputAdapter,
97
+ FlatFileErrorAdapter,
98
+ IndexedDbErrorAdapter,
99
+ JsonFileErrorAdapter,
82
100
  MongoDbErrorAdapter,
83
101
  MongoDbInputAdapter,
84
102
  MySqlInputAdapter,
103
+ SqliteErrorAdapter,
85
104
  WebSocketOutputAdapter,
105
+ WebStorageErrorAdapter,
86
106
  WebhookErrorAdapter,
87
- WebhookOutputAdapter
107
+ WebhookOutputAdapter,
108
+ buildCreateErrorLogTableSql,
109
+ createErrorLogStore,
110
+ fileAdapter,
111
+ jsonFileAdapter,
112
+ sqliteAdapter
88
113
  };
89
114
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/input/mongodb-input-adapter.ts","../src/input/mysql-input-adapter.ts","../src/output/event-emitter-adapter.ts","../src/output/webhook-output-adapter.ts","../src/output/websocket-output-adapter.ts"],"sourcesContent":["// The error-log adapters now live in the standalone error-log-adapter package and are\n// re-exported here so existing imports keep working.\nexport type {\n CollectionLike,\n MongoDbErrorOptions,\n WebhookErrorOptions,\n} from '@richardmcquiston01/error-log-adapter';\nexport { MongoDbErrorAdapter, WebhookErrorAdapter } from '@richardmcquiston01/error-log-adapter';\nexport { MongoDbInputAdapter } from './input/mongodb-input-adapter.js';\nexport { MySqlInputAdapter } from './input/mysql-input-adapter.js';\nexport { EventEmitterOutputAdapter } from './output/event-emitter-adapter.js';\nexport { WebhookOutputAdapter } from './output/webhook-output-adapter.js';\nexport { WebSocketOutputAdapter } from './output/websocket-output-adapter.js';\n","import type { InputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface MongoCollectionLike {\n findOne(filter: object): Promise<object | null>;\n}\n\nexport class MongoDbInputAdapter implements InputAdapter {\n private constructor(private readonly schema: object) {}\n\n /** Fetches one document matching `filter` and caches it as the schema. */\n static async create(\n collection: MongoCollectionLike,\n filter: object,\n ): Promise<MongoDbInputAdapter> {\n const doc = await collection.findOne(filter);\n if (doc === null) {\n throw new Error('MongoDbInputAdapter: no document found');\n }\n return new MongoDbInputAdapter(doc);\n }\n\n transform(_raw: unknown): unknown {\n return this.schema;\n }\n}\n","import type { InputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface MySqlConnectionLike {\n execute(sql: string, params?: unknown[]): Promise<[unknown[], unknown]>;\n}\n\nexport class MySqlInputAdapter implements InputAdapter {\n private constructor(private readonly schema: unknown) {}\n\n /** Executes `sql` and caches the first row as the schema. */\n static async create(\n connection: MySqlConnectionLike,\n sql: string,\n params?: unknown[],\n ): Promise<MySqlInputAdapter> {\n const [rows] = await connection.execute(sql, params);\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new Error('MySqlInputAdapter: query returned no rows');\n }\n return new MySqlInputAdapter(rows[0]);\n }\n\n transform(_raw: unknown): unknown {\n return this.schema;\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface EventEmitterLike {\n emit(event: string, ...args: unknown[]): void;\n}\n\nexport class EventEmitterOutputAdapter implements OutputAdapter {\n constructor(private readonly emitter: EventEmitterLike) {}\n\n emit(event: ChatEvent): void {\n this.emitter.emit(event.type, event);\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface WebhookOptions {\n headers?: Record<string, string>;\n}\n\nexport class WebhookOutputAdapter implements OutputAdapter {\n constructor(\n private readonly url: string,\n private readonly options: WebhookOptions = {},\n ) {}\n\n emit(event: ChatEvent): void {\n fetch(this.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...this.options.headers },\n body: JSON.stringify(event),\n }).catch((err: unknown) => {\n console.error('[chat-and-react] WebhookOutputAdapter:', err);\n });\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface WebSocketLike {\n readyState: number;\n OPEN: number;\n send(data: string): void;\n}\n\nexport class WebSocketOutputAdapter implements OutputAdapter {\n constructor(private readonly socket: WebSocketLike) {}\n\n emit(event: ChatEvent): void {\n if (this.socket.readyState === this.socket.OPEN) {\n this.socket.send(JSON.stringify(event));\n } else {\n console.warn('[chat-and-react] WebSocketOutputAdapter: socket not open');\n }\n }\n}\n"],"mappings":";AAOA,SAAS,qBAAqB,2BAA2B;;;ACDlD,IAAM,sBAAN,MAAM,qBAA4C;AAAA,EAC/C,YAA6B,QAAgB;AAAhB;AAAA,EAAiB;AAAA;AAAA,EAGtD,aAAa,OACX,YACA,QAC8B;AAC9B,UAAM,MAAM,MAAM,WAAW,QAAQ,MAAM;AAC3C,QAAI,QAAQ,MAAM;AAChB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,WAAO,IAAI,qBAAoB,GAAG;AAAA,EACpC;AAAA,EAEA,UAAU,MAAwB;AAChC,WAAO,KAAK;AAAA,EACd;AACF;;;AClBO,IAAM,oBAAN,MAAM,mBAA0C;AAAA,EAC7C,YAA6B,QAAiB;AAAjB;AAAA,EAAkB;AAAA;AAAA,EAGvD,aAAa,OACX,YACA,KACA,QAC4B;AAC5B,UAAM,CAAC,IAAI,IAAI,MAAM,WAAW,QAAQ,KAAK,MAAM;AACnD,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,WAAO,IAAI,mBAAkB,KAAK,CAAC,CAAC;AAAA,EACtC;AAAA,EAEA,UAAU,MAAwB;AAChC,WAAO,KAAK;AAAA,EACd;AACF;;;ACnBO,IAAM,4BAAN,MAAyD;AAAA,EAC9D,YAA6B,SAA2B;AAA3B;AAAA,EAA4B;AAAA,EAEzD,KAAK,OAAwB;AAC3B,SAAK,QAAQ,KAAK,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACNO,IAAM,uBAAN,MAAoD;AAAA,EACzD,YACmB,KACA,UAA0B,CAAC,GAC5C;AAFiB;AACA;AAAA,EAChB;AAAA,EAEH,KAAK,OAAwB;AAC3B,UAAM,KAAK,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,KAAK,QAAQ,QAAQ;AAAA,MACvE,MAAM,KAAK,UAAU,KAAK;AAAA,IAC5B,CAAC,EAAE,MAAM,CAAC,QAAiB;AACzB,cAAQ,MAAM,0CAA0C,GAAG;AAAA,IAC7D,CAAC;AAAA,EACH;AACF;;;ACbO,IAAM,yBAAN,MAAsD;AAAA,EAC3D,YAA6B,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAErD,KAAK,OAAwB;AAC3B,QAAI,KAAK,OAAO,eAAe,KAAK,OAAO,MAAM;AAC/C,WAAK,OAAO,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IACxC,OAAO;AACL,cAAQ,KAAK,0DAA0D;AAAA,IACzE;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/input/mongodb-input-adapter.ts","../src/input/mysql-input-adapter.ts","../src/output/event-emitter-adapter.ts","../src/output/webhook-output-adapter.ts","../src/output/websocket-output-adapter.ts"],"sourcesContent":["// The error-log adapters live in the error-log-adapter package and the storage adapters in\n// the storage-adapters package. They are re-exported here so everything optional can be\n// imported from one place. `nodeFileSystem` (which imports `node:fs`) is not re-exported;\n// import it from '@richardmcquiston01/storage-adapters/file/node'.\nexport type {\n CollectionLike,\n FlatFileErrorOptions,\n IdbDatabaseLike,\n IdbObjectStoreLike,\n IdbTransactionLike,\n IdbUpgradeDatabaseLike,\n IndexedDbErrorOptions,\n IndexedDbErrorRecord,\n JsonFileErrorOptions,\n JsonFileErrorRecord,\n MongoDbErrorOptions,\n SqliteClientLike,\n SqliteErrorOptions,\n StorageLike,\n WebhookErrorOptions,\n WebStorageErrorOptions,\n WebStorageErrorRecord,\n} from '@richardmcquiston01/error-log-adapter';\nexport {\n buildCreateErrorLogTableSql,\n CompositeErrorAdapter,\n createErrorLogStore,\n FlatFileErrorAdapter,\n IndexedDbErrorAdapter,\n JsonFileErrorAdapter,\n MongoDbErrorAdapter,\n SqliteErrorAdapter,\n WebhookErrorAdapter,\n WebStorageErrorAdapter,\n} from '@richardmcquiston01/error-log-adapter';\nexport type { FileAdapterOptions } from '@richardmcquiston01/storage-adapters/file';\nexport { fileAdapter } from '@richardmcquiston01/storage-adapters/file';\nexport type { JsonFileAdapterOptions } from '@richardmcquiston01/storage-adapters/json-file';\nexport { jsonFileAdapter } from '@richardmcquiston01/storage-adapters/json-file';\nexport type {\n SqliteAdapterOptions,\n SqliteDatabaseLike,\n} from '@richardmcquiston01/storage-adapters/sqlite';\nexport { sqliteAdapter } from '@richardmcquiston01/storage-adapters/sqlite';\nexport { MongoDbInputAdapter } from './input/mongodb-input-adapter.js';\nexport { MySqlInputAdapter } from './input/mysql-input-adapter.js';\nexport { EventEmitterOutputAdapter } from './output/event-emitter-adapter.js';\nexport { WebhookOutputAdapter } from './output/webhook-output-adapter.js';\nexport { WebSocketOutputAdapter } from './output/websocket-output-adapter.js';\n","import type { InputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface MongoCollectionLike {\n findOne(filter: object): Promise<object | null>;\n}\n\nexport class MongoDbInputAdapter implements InputAdapter {\n private constructor(private readonly schema: object) {}\n\n /** Fetches one document matching `filter` and caches it as the schema. */\n static async create(\n collection: MongoCollectionLike,\n filter: object,\n ): Promise<MongoDbInputAdapter> {\n const doc = await collection.findOne(filter);\n if (doc === null) {\n throw new Error('MongoDbInputAdapter: no document found');\n }\n return new MongoDbInputAdapter(doc);\n }\n\n transform(_raw: unknown): unknown {\n return this.schema;\n }\n}\n","import type { InputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface MySqlConnectionLike {\n execute(sql: string, params?: unknown[]): Promise<[unknown[], unknown]>;\n}\n\nexport class MySqlInputAdapter implements InputAdapter {\n private constructor(private readonly schema: unknown) {}\n\n /** Executes `sql` and caches the first row as the schema. */\n static async create(\n connection: MySqlConnectionLike,\n sql: string,\n params?: unknown[],\n ): Promise<MySqlInputAdapter> {\n const [rows] = await connection.execute(sql, params);\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new Error('MySqlInputAdapter: query returned no rows');\n }\n return new MySqlInputAdapter(rows[0]);\n }\n\n transform(_raw: unknown): unknown {\n return this.schema;\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface EventEmitterLike {\n emit(event: string, ...args: unknown[]): void;\n}\n\nexport class EventEmitterOutputAdapter implements OutputAdapter {\n constructor(private readonly emitter: EventEmitterLike) {}\n\n emit(event: ChatEvent): void {\n this.emitter.emit(event.type, event);\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface WebhookOptions {\n headers?: Record<string, string>;\n}\n\nexport class WebhookOutputAdapter implements OutputAdapter {\n constructor(\n private readonly url: string,\n private readonly options: WebhookOptions = {},\n ) {}\n\n emit(event: ChatEvent): void {\n fetch(this.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...this.options.headers },\n body: JSON.stringify(event),\n }).catch((err: unknown) => {\n console.error('[chat-and-react] WebhookOutputAdapter:', err);\n });\n }\n}\n","import type { ChatEvent, OutputAdapter } from '@richardmcquiston01/chat-and-react-core';\n\ninterface WebSocketLike {\n readyState: number;\n OPEN: number;\n send(data: string): void;\n}\n\nexport class WebSocketOutputAdapter implements OutputAdapter {\n constructor(private readonly socket: WebSocketLike) {}\n\n emit(event: ChatEvent): void {\n if (this.socket.readyState === this.socket.OPEN) {\n this.socket.send(JSON.stringify(event));\n } else {\n console.warn('[chat-and-react] WebSocketOutputAdapter: socket not open');\n }\n }\n}\n"],"mappings":";AAuBA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,mBAAmB;AAE5B,SAAS,uBAAuB;AAKhC,SAAS,qBAAqB;;;ACrCvB,IAAM,sBAAN,MAAM,qBAA4C;AAAA,EAC/C,YAA6B,QAAgB;AAAhB;AAAA,EAAiB;AAAA;AAAA,EAGtD,aAAa,OACX,YACA,QAC8B;AAC9B,UAAM,MAAM,MAAM,WAAW,QAAQ,MAAM;AAC3C,QAAI,QAAQ,MAAM;AAChB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,WAAO,IAAI,qBAAoB,GAAG;AAAA,EACpC;AAAA,EAEA,UAAU,MAAwB;AAChC,WAAO,KAAK;AAAA,EACd;AACF;;;AClBO,IAAM,oBAAN,MAAM,mBAA0C;AAAA,EAC7C,YAA6B,QAAiB;AAAjB;AAAA,EAAkB;AAAA;AAAA,EAGvD,aAAa,OACX,YACA,KACA,QAC4B;AAC5B,UAAM,CAAC,IAAI,IAAI,MAAM,WAAW,QAAQ,KAAK,MAAM;AACnD,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,WAAO,IAAI,mBAAkB,KAAK,CAAC,CAAC;AAAA,EACtC;AAAA,EAEA,UAAU,MAAwB;AAChC,WAAO,KAAK;AAAA,EACd;AACF;;;ACnBO,IAAM,4BAAN,MAAyD;AAAA,EAC9D,YAA6B,SAA2B;AAA3B;AAAA,EAA4B;AAAA,EAEzD,KAAK,OAAwB;AAC3B,SAAK,QAAQ,KAAK,MAAM,MAAM,KAAK;AAAA,EACrC;AACF;;;ACNO,IAAM,uBAAN,MAAoD;AAAA,EACzD,YACmB,KACA,UAA0B,CAAC,GAC5C;AAFiB;AACA;AAAA,EAChB;AAAA,EAEH,KAAK,OAAwB;AAC3B,UAAM,KAAK,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,KAAK,QAAQ,QAAQ;AAAA,MACvE,MAAM,KAAK,UAAU,KAAK;AAAA,IAC5B,CAAC,EAAE,MAAM,CAAC,QAAiB;AACzB,cAAQ,MAAM,0CAA0C,GAAG;AAAA,IAC7D,CAAC;AAAA,EACH;AACF;;;ACbO,IAAM,yBAAN,MAAsD;AAAA,EAC3D,YAA6B,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAErD,KAAK,OAAwB;AAC3B,QAAI,KAAK,OAAO,eAAe,KAAK,OAAO,MAAM;AAC/C,WAAK,OAAO,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IACxC,OAAO;AACL,cAAQ,KAAK,0DAA0D;AAAA,IACzE;AAAA,EACF;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@richardmcquiston01/chat-and-react-adapters",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Optional input, output, and error-log adapters (webhook, WebSocket, MongoDB, MySQL, EventEmitter) for chat-and-react.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Richard McQuiston <richard.mcquiston01@gmail.com>",
@@ -47,8 +47,9 @@
47
47
  "typecheck": "tsc --noEmit"
48
48
  },
49
49
  "dependencies": {
50
- "@richardmcquiston01/chat-and-react-core": "0.6.0",
51
- "@richardmcquiston01/error-log-adapter": "^0.1.0"
50
+ "@richardmcquiston01/chat-and-react-core": "0.7.0",
51
+ "@richardmcquiston01/error-log-adapter": "^0.2.0",
52
+ "@richardmcquiston01/storage-adapters": "^0.5.0"
52
53
  },
53
54
  "peerDependencies": {
54
55
  "mongodb": ">=5.0.0",