@lde/sparql-monitor 0.2.1 → 0.2.2

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/schema.d.ts CHANGED
@@ -5,28 +5,25 @@ export declare const observations: import("drizzle-orm/pg-core").PgTableWithColu
5
5
  name: "observations";
6
6
  schema: undefined;
7
7
  columns: {
8
- id: import("drizzle-orm/pg-core").PgColumn<{
9
- name: "id";
8
+ id: import("drizzle-orm/pg-core").PgBuildColumn<"observations", import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgUUIDBuilder>>>, {
9
+ name: string;
10
10
  tableName: "observations";
11
- dataType: "string";
12
- columnType: "PgUUID";
11
+ dataType: "string uuid";
13
12
  data: string;
14
13
  driverParam: string;
15
14
  notNull: true;
16
15
  hasDefault: true;
17
- isPrimaryKey: true;
16
+ isPrimaryKey: false;
18
17
  isAutoincrement: false;
19
18
  hasRuntimeDefault: false;
20
19
  enumValues: undefined;
21
- baseColumn: never;
22
20
  identity: undefined;
23
21
  generated: undefined;
24
- }, {}, {}>;
25
- observedAt: import("drizzle-orm/pg-core").PgColumn<{
26
- name: "observed_at";
22
+ }>;
23
+ observedAt: import("drizzle-orm/pg-core").PgBuildColumn<"observations", import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>, {
24
+ name: string;
27
25
  tableName: "observations";
28
- dataType: "date";
29
- columnType: "PgTimestamp";
26
+ dataType: "object date";
30
27
  data: Date;
31
28
  driverParam: string;
32
29
  notNull: true;
@@ -35,15 +32,13 @@ export declare const observations: import("drizzle-orm/pg-core").PgTableWithColu
35
32
  isAutoincrement: false;
36
33
  hasRuntimeDefault: false;
37
34
  enumValues: undefined;
38
- baseColumn: never;
39
35
  identity: undefined;
40
36
  generated: undefined;
41
- }, {}, {}>;
42
- monitor: import("drizzle-orm/pg-core").PgColumn<{
43
- name: "monitor";
37
+ }>;
38
+ monitor: import("drizzle-orm/pg-core").PgBuildColumn<"observations", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
39
+ name: string;
44
40
  tableName: "observations";
45
41
  dataType: "string";
46
- columnType: "PgText";
47
42
  data: string;
48
43
  driverParam: string;
49
44
  notNull: true;
@@ -51,16 +46,14 @@ export declare const observations: import("drizzle-orm/pg-core").PgTableWithColu
51
46
  isPrimaryKey: false;
52
47
  isAutoincrement: false;
53
48
  hasRuntimeDefault: false;
54
- enumValues: [string, ...string[]];
55
- baseColumn: never;
49
+ enumValues: undefined;
56
50
  identity: undefined;
57
51
  generated: undefined;
58
- }, {}, {}>;
59
- success: import("drizzle-orm/pg-core").PgColumn<{
60
- name: "success";
52
+ }>;
53
+ success: import("drizzle-orm/pg-core").PgBuildColumn<"observations", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBooleanBuilder>, {
54
+ name: string;
61
55
  tableName: "observations";
62
56
  dataType: "boolean";
63
- columnType: "PgBoolean";
64
57
  data: boolean;
65
58
  driverParam: boolean;
66
59
  notNull: true;
@@ -69,15 +62,13 @@ export declare const observations: import("drizzle-orm/pg-core").PgTableWithColu
69
62
  isAutoincrement: false;
70
63
  hasRuntimeDefault: false;
71
64
  enumValues: undefined;
72
- baseColumn: never;
73
65
  identity: undefined;
74
66
  generated: undefined;
75
- }, {}, {}>;
76
- responseTimeMs: import("drizzle-orm/pg-core").PgColumn<{
77
- name: "response_time_ms";
67
+ }>;
68
+ responseTimeMs: import("drizzle-orm/pg-core").PgBuildColumn<"observations", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>, {
69
+ name: string;
78
70
  tableName: "observations";
79
- dataType: "number";
80
- columnType: "PgInteger";
71
+ dataType: "number int32";
81
72
  data: number;
82
73
  driverParam: string | number;
83
74
  notNull: true;
@@ -86,15 +77,13 @@ export declare const observations: import("drizzle-orm/pg-core").PgTableWithColu
86
77
  isAutoincrement: false;
87
78
  hasRuntimeDefault: false;
88
79
  enumValues: undefined;
89
- baseColumn: never;
90
80
  identity: undefined;
91
81
  generated: undefined;
92
- }, {}, {}>;
93
- errorMessage: import("drizzle-orm/pg-core").PgColumn<{
94
- name: "error_message";
82
+ }>;
83
+ errorMessage: import("drizzle-orm/pg-core").PgBuildColumn<"observations", import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, {
84
+ name: string;
95
85
  tableName: "observations";
96
86
  dataType: "string";
97
- columnType: "PgText";
98
87
  data: string;
99
88
  driverParam: string;
100
89
  notNull: false;
@@ -102,11 +91,10 @@ export declare const observations: import("drizzle-orm/pg-core").PgTableWithColu
102
91
  isPrimaryKey: false;
103
92
  isAutoincrement: false;
104
93
  hasRuntimeDefault: false;
105
- enumValues: [string, ...string[]];
106
- baseColumn: never;
94
+ enumValues: undefined;
107
95
  identity: undefined;
108
96
  generated: undefined;
109
- }, {}, {}>;
97
+ }>;
110
98
  };
111
99
  dialect: "pg";
112
100
  }>;
@@ -118,11 +106,10 @@ export declare const refreshLatestObservationsViewSql: import("drizzle-orm").SQL
118
106
  * Materialized view for the latest observation per monitor.
119
107
  */
120
108
  export declare const latestObservations: import("drizzle-orm/pg-core").PgMaterializedViewWithSelection<"latest_observations", false, {
121
- id: import("drizzle-orm/pg-core").PgColumn<{
122
- name: "id";
109
+ id: import("drizzle-orm/pg-core").PgBuildColumn<"latest_observations", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgUUIDBuilder>, {
110
+ name: string;
123
111
  tableName: "latest_observations";
124
- dataType: "string";
125
- columnType: "PgUUID";
112
+ dataType: "string uuid";
126
113
  data: string;
127
114
  driverParam: string;
128
115
  notNull: true;
@@ -131,15 +118,13 @@ export declare const latestObservations: import("drizzle-orm/pg-core").PgMateria
131
118
  isAutoincrement: false;
132
119
  hasRuntimeDefault: false;
133
120
  enumValues: undefined;
134
- baseColumn: never;
135
121
  identity: undefined;
136
122
  generated: undefined;
137
- }, {}, {}>;
138
- monitor: import("drizzle-orm/pg-core").PgColumn<{
139
- name: "monitor";
123
+ }>;
124
+ monitor: import("drizzle-orm/pg-core").PgBuildColumn<"latest_observations", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
125
+ name: string;
140
126
  tableName: "latest_observations";
141
127
  dataType: "string";
142
- columnType: "PgText";
143
128
  data: string;
144
129
  driverParam: string;
145
130
  notNull: true;
@@ -147,16 +132,14 @@ export declare const latestObservations: import("drizzle-orm/pg-core").PgMateria
147
132
  isPrimaryKey: false;
148
133
  isAutoincrement: false;
149
134
  hasRuntimeDefault: false;
150
- enumValues: [string, ...string[]];
151
- baseColumn: never;
135
+ enumValues: undefined;
152
136
  identity: undefined;
153
137
  generated: undefined;
154
- }, {}, {}>;
155
- observedAt: import("drizzle-orm/pg-core").PgColumn<{
156
- name: "observed_at";
138
+ }>;
139
+ observedAt: import("drizzle-orm/pg-core").PgBuildColumn<"latest_observations", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>, {
140
+ name: string;
157
141
  tableName: "latest_observations";
158
- dataType: "date";
159
- columnType: "PgTimestamp";
142
+ dataType: "object date";
160
143
  data: Date;
161
144
  driverParam: string;
162
145
  notNull: true;
@@ -165,15 +148,13 @@ export declare const latestObservations: import("drizzle-orm/pg-core").PgMateria
165
148
  isAutoincrement: false;
166
149
  hasRuntimeDefault: false;
167
150
  enumValues: undefined;
168
- baseColumn: never;
169
151
  identity: undefined;
170
152
  generated: undefined;
171
- }, {}, {}>;
172
- success: import("drizzle-orm/pg-core").PgColumn<{
173
- name: "success";
153
+ }>;
154
+ success: import("drizzle-orm/pg-core").PgBuildColumn<"latest_observations", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBooleanBuilder>, {
155
+ name: string;
174
156
  tableName: "latest_observations";
175
157
  dataType: "boolean";
176
- columnType: "PgBoolean";
177
158
  data: boolean;
178
159
  driverParam: boolean;
179
160
  notNull: true;
@@ -182,15 +163,13 @@ export declare const latestObservations: import("drizzle-orm/pg-core").PgMateria
182
163
  isAutoincrement: false;
183
164
  hasRuntimeDefault: false;
184
165
  enumValues: undefined;
185
- baseColumn: never;
186
166
  identity: undefined;
187
167
  generated: undefined;
188
- }, {}, {}>;
189
- responseTimeMs: import("drizzle-orm/pg-core").PgColumn<{
190
- name: "response_time_ms";
168
+ }>;
169
+ responseTimeMs: import("drizzle-orm/pg-core").PgBuildColumn<"latest_observations", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>, {
170
+ name: string;
191
171
  tableName: "latest_observations";
192
- dataType: "number";
193
- columnType: "PgInteger";
172
+ dataType: "number int32";
194
173
  data: number;
195
174
  driverParam: string | number;
196
175
  notNull: true;
@@ -199,15 +178,13 @@ export declare const latestObservations: import("drizzle-orm/pg-core").PgMateria
199
178
  isAutoincrement: false;
200
179
  hasRuntimeDefault: false;
201
180
  enumValues: undefined;
202
- baseColumn: never;
203
181
  identity: undefined;
204
182
  generated: undefined;
205
- }, {}, {}>;
206
- errorMessage: import("drizzle-orm/pg-core").PgColumn<{
207
- name: "error_message";
183
+ }>;
184
+ errorMessage: import("drizzle-orm/pg-core").PgBuildColumn<"latest_observations", import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, {
185
+ name: string;
208
186
  tableName: "latest_observations";
209
187
  dataType: "string";
210
- columnType: "PgText";
211
188
  data: string;
212
189
  driverParam: string;
213
190
  notNull: false;
@@ -215,10 +192,9 @@ export declare const latestObservations: import("drizzle-orm/pg-core").PgMateria
215
192
  isPrimaryKey: false;
216
193
  isAutoincrement: false;
217
194
  hasRuntimeDefault: false;
218
- enumValues: [string, ...string[]];
219
- baseColumn: never;
195
+ enumValues: undefined;
220
196
  identity: undefined;
221
197
  generated: undefined;
222
- }, {}, {}>;
198
+ }>;
223
199
  }>;
224
200
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAqBA;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAexB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gCAAgC,oCAE5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAqBA;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAexB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gCAAgC,oCAE5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC"}
package/dist/store.d.ts CHANGED
@@ -3,11 +3,15 @@ import type { ObservationStore, Observation } from './types.js';
3
3
  * PostgreSQL implementation of the ObservationStore interface.
4
4
  */
5
5
  export declare class PostgresObservationStore implements ObservationStore {
6
- private client;
7
6
  private db;
8
7
  private constructor();
9
8
  /**
10
9
  * Create a new store and initialize the database schema.
10
+ *
11
+ * Uses drizzle-kit's generateMigration to create schema from code.
12
+ * This approach works around a bug in pushSchema where the execute()
13
+ * return format doesn't match what drizzle-kit expects.
14
+ * See: https://github.com/drizzle-team/drizzle-orm/issues/5293
11
15
  */
12
16
  static create(connectionString: string): Promise<PostgresObservationStore>;
13
17
  close(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAKhE;;GAEG;AACH,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,EAAE,CAAqB;IAE/B,OAAO;IAKP;;OAEG;WACU,MAAM,CACjB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,wBAAwB,CAAC;IAQ9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAK9C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAS5C,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAQjE,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC;CAGrD"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAKhE;;GAEG;AACH,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,OAAO,CAAC,EAAE,CAAqB;IAE/B,OAAO;IAIP;;;;;;;OAOG;WACU,MAAM,CACjB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,wBAAwB,CAAC;IAyC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAK9C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAS5C,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAQjE,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC;CAGrD"}
package/dist/store.js CHANGED
@@ -1,30 +1,63 @@
1
1
  import { drizzle } from 'drizzle-orm/postgres-js';
2
- import { eq } from 'drizzle-orm';
3
- import postgres from 'postgres';
2
+ import { eq, sql } from 'drizzle-orm';
4
3
  import * as schema from './schema.js';
5
4
  const { observations, latestObservations, refreshLatestObservationsViewSql } = schema;
6
5
  /**
7
6
  * PostgreSQL implementation of the ObservationStore interface.
8
7
  */
9
8
  export class PostgresObservationStore {
10
- client;
11
9
  db;
12
10
  constructor(connectionString) {
13
- this.client = postgres(connectionString);
14
- this.db = drizzle(this.client);
11
+ this.db = drizzle(connectionString);
15
12
  }
16
13
  /**
17
14
  * Create a new store and initialize the database schema.
15
+ *
16
+ * Uses drizzle-kit's generateMigration to create schema from code.
17
+ * This approach works around a bug in pushSchema where the execute()
18
+ * return format doesn't match what drizzle-kit expects.
19
+ * See: https://github.com/drizzle-team/drizzle-orm/issues/5293
18
20
  */
19
21
  static async create(connectionString) {
20
22
  const store = new PostgresObservationStore(connectionString);
21
- const { pushSchema } = await import('drizzle-kit/api');
22
- const result = await pushSchema(schema, store.db);
23
- await result.apply();
23
+ const { generateDrizzleJson, generateMigration } = await import('drizzle-kit/api-postgres');
24
+ // Generate migration from empty state to our schema
25
+ const empty = await generateDrizzleJson({});
26
+ const target = await generateDrizzleJson(schema, empty.id);
27
+ const migration = await generateMigration(empty, target);
28
+ // Execute each statement, ignoring "already exists" errors for idempotency
29
+ for (const statement of migration) {
30
+ try {
31
+ await store.db.execute(sql.raw(statement));
32
+ }
33
+ catch (error) {
34
+ // Check both direct error and cause for "already exists"
35
+ const isAlreadyExists = (e) => {
36
+ if (!(e instanceof Error))
37
+ return false;
38
+ if (e.message.includes('already exists'))
39
+ return true;
40
+ if ('cause' in e)
41
+ return isAlreadyExists(e.cause);
42
+ return false;
43
+ };
44
+ if (!isAlreadyExists(error)) {
45
+ throw error;
46
+ }
47
+ }
48
+ }
49
+ // Create unique index on materialized view for CONCURRENTLY refresh
50
+ try {
51
+ await store.db.execute(sql `CREATE UNIQUE INDEX latest_observations_monitor_idx ON latest_observations (monitor)`);
52
+ }
53
+ catch {
54
+ // Index may already exist
55
+ }
24
56
  return store;
25
57
  }
26
58
  async close() {
27
- await this.client.end();
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+ await this.db.$client.end();
28
61
  }
29
62
  async getLatest() {
30
63
  const rows = await this.db.select().from(latestObservations);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lde/sparql-monitor",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Monitor SPARQL endpoints with periodic checks",
5
5
  "repository": {
6
6
  "url": "https://github.com/ldengine/lde"
@@ -29,13 +29,13 @@
29
29
  "c12": "^3.0.2",
30
30
  "commander": "^13.1.0",
31
31
  "cron": "^4.1.0",
32
- "drizzle-kit": "^0.31.8",
33
- "drizzle-orm": "^0.45.1",
32
+ "drizzle-kit": "1.0.0-beta.12-a5629fb",
33
+ "drizzle-orm": "1.0.0-beta.12-a5629fb",
34
34
  "fetch-sparql-endpoint": "^6.0.0",
35
35
  "postgres": "^3.4.5",
36
36
  "tslib": "^2.3.0"
37
37
  },
38
38
  "devDependencies": {
39
- "vite": "^6.0.0"
39
+ "@testcontainers/postgresql": "^11.11.0"
40
40
  }
41
41
  }