@powersync/nuxt 0.0.0-dev-20260504100448 → 0.0.0-dev-20260630141119

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/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "powersync-nuxt",
3
3
  "configKey": "powersync",
4
- "version": "0.0.6",
4
+ "version": "0.0.7",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "unknown"
@@ -54,7 +54,7 @@
54
54
  <div flex="~ col gap-2">
55
55
  <span text="sm gray-500">Upload Progress</span>
56
56
  <div flex="~ items-center gap-2">
57
- <span v-if="syncStatus?.dataFlowStatus.uploading">upload in progress...</span>
57
+ <span v-if="syncStatus?.uploading">upload in progress...</span>
58
58
  <span v-else text="sm gray-400">No active upload</span>
59
59
  </div>
60
60
  </div>
@@ -1,11 +1,11 @@
1
- import { type ILogHandler } from '@powersync/web';
1
+ import { type PowerSyncLogger } from '@powersync/common';
2
2
  /**
3
3
  * Provides a logger configured for PowerSync diagnostics.
4
4
  *
5
5
  * This composable creates a logger instance that is automatically configured for diagnostics
6
6
  * recording. The logger stores logs in session storage and emits events for real-time log monitoring.
7
7
  *
8
- * @param customHandler - Optional custom log handler to process log messages
8
+ * @param additional - Optional logger that messages will also be forwarded to.
9
9
  *
10
10
  * @returns An object containing:
11
11
  * - `logger` - The configured ILogHandler instance
@@ -20,8 +20,8 @@ import { type ILogHandler } from '@powersync/web';
20
20
  * // Use it in your PowerSync setup if needed
21
21
  * ```
22
22
  */
23
- export declare const useDiagnosticsLogger: (customHandler?: ILogHandler) => {
24
- logger: import("@powersync/common").GlobalLogger;
23
+ export declare const useDiagnosticsLogger: (additional?: PowerSyncLogger) => {
24
+ logger: PowerSyncLogger;
25
25
  logsStorage: import("unstorage").Storage<import("unstorage").StorageValue>;
26
26
  emitter: import("mitt").Emitter<Record<import("mitt").EventType, unknown>>;
27
27
  };
@@ -1,4 +1,4 @@
1
- import { createBaseLogger, LogLevel } from "@powersync/web";
1
+ import { createConsoleLogger, LogLevels } from "@powersync/common";
2
2
  import { createStorage } from "unstorage";
3
3
  import localStorageDriver from "unstorage/drivers/session-storage";
4
4
  import mitt from "mitt";
@@ -6,28 +6,35 @@ const emitter = mitt();
6
6
  const logsStorage = createStorage({
7
7
  driver: localStorageDriver({ base: "powersync:" })
8
8
  });
9
- export const useDiagnosticsLogger = (customHandler) => {
10
- const logger = createBaseLogger();
11
- const consoleHandler = logger.createDefaultHandler({
12
- formatter: (messages, context) => {
13
- messages.unshift(`[PowerSync]${context.name ? ` [${context.name}]` : ""}`);
9
+ export const useDiagnosticsLogger = (additional) => {
10
+ const consoleLogger = createConsoleLogger({ minLevel: LogLevels.debug });
11
+ const logger = {
12
+ async log(record) {
13
+ consoleLogger.log(record);
14
+ const logObject = {
15
+ date: /* @__PURE__ */ new Date(),
16
+ message: record.message,
17
+ error: record.error,
18
+ level: nameOfLogLevel(record.level)
19
+ };
20
+ const key = `log:${logObject.date.toISOString()}`;
21
+ await logsStorage.set(key, logObject);
22
+ emitter.emit("log", { key, value: logObject });
23
+ additional?.log(record);
14
24
  }
15
- });
16
- logger.setLevel(LogLevel.DEBUG);
17
- logger.setHandler(async (messages, context) => {
18
- consoleHandler(messages, context);
19
- const messageArray = Array.from(messages);
20
- const mainMessage = String(messageArray[0] ?? "Empty log message");
21
- const extra = messageArray.length > 1 ? messageArray.length === 2 ? messageArray[1] : messageArray.slice(1) : void 0;
22
- const logObject = {
23
- date: /* @__PURE__ */ new Date(),
24
- type: context.level.name.toLowerCase(),
25
- args: [mainMessage, extra, context]
26
- };
27
- const key = `log:${logObject.date.toISOString()}`;
28
- await logsStorage.set(key, logObject);
29
- emitter.emit("log", { key, value: logObject });
30
- await customHandler?.(messages, context);
31
- });
25
+ };
32
26
  return { logger, logsStorage, emitter };
33
27
  };
28
+ const levelNames = [
29
+ ["ERROR", LogLevels.error],
30
+ ["WARNING", LogLevels.warn],
31
+ ["INFO", LogLevels.info],
32
+ ["DEBUG", LogLevels.debug],
33
+ ["TRACE", LogLevels.trace]
34
+ ];
35
+ function nameOfLogLevel(level) {
36
+ for (const [name, minLevel] of levelNames) {
37
+ if (level >= minLevel) return name;
38
+ }
39
+ return void 0;
40
+ }
@@ -1,4 +1,4 @@
1
- import type { AbstractPowerSyncDatabase, PowerSyncBackendConnector, PowerSyncConnectionOptions, SyncStatus, UploadQueueStats } from '@powersync/web';
1
+ import type { CommonPowerSyncDatabase, PowerSyncBackendConnector, SyncOptions, SyncStatus, UploadQueueStats } from '@powersync/common';
2
2
  import type { ComputedRef, Ref } from 'vue';
3
3
  export type BucketRow = {
4
4
  name: string;
@@ -33,9 +33,9 @@ type ReadonlyRef<T> = Readonly<Ref<T>>;
33
33
  * Uses named types so the signature stays readable in docs and IDE.
34
34
  */
35
35
  export interface UsePowerSyncInspectorDiagnosticsReturn {
36
- db: Ref<AbstractPowerSyncDatabase> | undefined;
36
+ db: Ref<CommonPowerSyncDatabase> | undefined;
37
37
  connector: ComputedRef<PowerSyncBackendConnector | null>;
38
- connectionOptions: ComputedRef<PowerSyncConnectionOptions | null>;
38
+ connectionOptions: ComputedRef<SyncOptions | null>;
39
39
  isDiagnosticSchemaSetup: ReadonlyRef<boolean>;
40
40
  /** Current sync status. Typed as SyncStatus for a concise doc signature; at runtime it may be a readonly proxy. */
41
41
  syncStatus: ReadonlyRef<SyncStatus>;
@@ -73,12 +73,12 @@ export function usePowerSyncInspectorDiagnostics() {
73
73
  const hasSynced = ref(syncStatus.value?.hasSynced || false);
74
74
  const isConnected = ref(syncStatus.value?.connected || false);
75
75
  const isSyncing = ref(false);
76
- const isDownloading = ref(syncStatus.value?.dataFlowStatus.downloading || false);
77
- const isUploading = ref(syncStatus.value?.dataFlowStatus.uploading || false);
76
+ const isDownloading = ref(syncStatus.value?.downloading || false);
77
+ const isUploading = ref(syncStatus.value?.uploading || false);
78
78
  const lastSyncedAt = ref(syncStatus.value?.lastSyncedAt || null);
79
- const uploadError = ref(syncStatus.value?.dataFlowStatus.uploadError || null);
80
- const downloadError = ref(syncStatus.value?.dataFlowStatus.downloadError || null);
81
- const downloadProgressDetails = ref(syncStatus.value?.dataFlowStatus.downloadProgress || null);
79
+ const uploadError = ref(syncStatus.value?.uploadError || null);
80
+ const downloadError = ref(syncStatus.value?.downloadError || null);
81
+ const downloadProgressDetails = ref(syncStatus.value?.downloadProgress || null);
82
82
  const bucketRows = ref(null);
83
83
  const tableRows = ref(null);
84
84
  const uploadQueueStats = ref(null);
@@ -111,7 +111,7 @@ export function usePowerSyncInspectorDiagnostics() {
111
111
  const uploadQueueSize = computed(() => formatBytes(uploadQueueStats.value?.size ?? 0));
112
112
  const uploadQueueCount = computed(() => uploadQueueStats.value?.count ?? 0);
113
113
  const clearData = async () => {
114
- await db.value?.syncStreamImplementation?.disconnect();
114
+ await db.value?.disconnect();
115
115
  const connector2 = db.value.connector;
116
116
  const connectionOptions2 = db.value.connectionOptions;
117
117
  await db.value?.disconnectAndClear();
@@ -126,7 +126,7 @@ export function usePowerSyncInspectorDiagnostics() {
126
126
  "SELECT powersync_last_synced_at() as synced_at"
127
127
  );
128
128
  uploadQueueStats.value = await db.value?.getUploadQueueStats(true);
129
- if (synced_at != null && !syncStatus.value?.dataFlowStatus.downloading) {
129
+ if (synced_at != null && !syncStatus.value?.downloading) {
130
130
  bucketRows.value = await db.value.getAll(BUCKETS_QUERY);
131
131
  tableRows.value = await db.value.getAll(TABLES_QUERY);
132
132
  } else if (synced_at != null) {
@@ -146,16 +146,16 @@ export function usePowerSyncInspectorDiagnostics() {
146
146
  statusChanged: (newStatus) => {
147
147
  hasSynced.value = !!newStatus.hasSynced;
148
148
  isConnected.value = !!newStatus.connected;
149
- isDownloading.value = !!newStatus.dataFlowStatus.downloading;
150
- isUploading.value = !!newStatus.dataFlowStatus.uploading;
149
+ isDownloading.value = !!newStatus.downloading;
150
+ isUploading.value = !!newStatus.uploading;
151
151
  lastSyncedAt.value = newStatus.lastSyncedAt || null;
152
- uploadError.value = newStatus.dataFlowStatus.uploadError || null;
153
- downloadError.value = newStatus.dataFlowStatus.downloadError || null;
154
- downloadProgressDetails.value = newStatus.dataFlowStatus.downloadProgress || null;
152
+ uploadError.value = newStatus.uploadError || null;
153
+ downloadError.value = newStatus.downloadError || null;
154
+ downloadProgressDetails.value = newStatus.downloadProgress || null;
155
155
  if (newStatus?.hasSynced === void 0 || newStatus?.priorityStatusEntries?.length && newStatus.priorityStatusEntries.length > 0) {
156
156
  hasSynced.value = newStatus?.priorityStatusEntries.every((entry) => entry.hasSynced) ?? false;
157
157
  }
158
- if (newStatus?.dataFlowStatus.downloading || newStatus?.dataFlowStatus.uploading) {
158
+ if (newStatus?.downloading || newStatus?.uploading) {
159
159
  isSyncing.value = true;
160
160
  } else {
161
161
  isSyncing.value = false;
@@ -169,7 +169,6 @@ export function usePowerSyncInspectorDiagnostics() {
169
169
  }
170
170
  },
171
171
  {
172
- rawTableNames: true,
173
172
  tables: ["ps_oplog", "ps_buckets", "ps_data_local__local_bucket_data", "ps_crud"],
174
173
  throttleMs: 500
175
174
  }
@@ -1,6 +1,6 @@
1
1
  import type { DBAdapter } from '@powersync/web';
2
2
  import { Schema } from '@powersync/web';
3
- import type { SyncDataBucketJSON } from '@powersync/common/internal/sync_protocol';
3
+ import type { SyncDataBucketJSON } from '@powersync/shared-internals/internal/sync_protocol';
4
4
  /**
5
5
  * Record fields from downloaded data, then build a schema from it.
6
6
  */
@@ -1,4 +1,4 @@
1
- import { Column, ColumnType, Schema, Table } from "@powersync/web";
1
+ import { Column, ColumnType, ResolvedTable, Schema } from "@powersync/web";
2
2
  import { DiagnosticsAppSchema as AppSchema } from "./AppSchema.js";
3
3
  import { JsSchemaGenerator } from "./JsSchemaGenerator.js";
4
4
  export class DynamicSchemaManager {
@@ -62,7 +62,7 @@ export class DynamicSchemaManager {
62
62
  const base = AppSchema;
63
63
  const tables = [...base.tables];
64
64
  for (const [key, value] of Object.entries(this.tables)) {
65
- const table = new Table({
65
+ const table = new ResolvedTable({
66
66
  name: key,
67
67
  columns: Object.entries(value).map(
68
68
  ([cname, ctype]) => new Column({
@@ -1,4 +1,17 @@
1
- import { PowerSyncDatabase, type DisconnectAndClearOptions, type PowerSyncBackendConnector, type PowerSyncConnectionOptions, type RequiredAdditionalConnectionOptions, type StreamingSyncImplementation, type WebPowerSyncDatabaseOptions } from '@powersync/web';
1
+ import { WebPowerSyncDatabase, type DisconnectAndClearOptions, type PowerSyncBackendConnector, type WebPowerSyncDatabaseOptions, type SyncOptions, type CommonPowerSyncDatabase, type PowerSyncDatabaseConstructor } from '@powersync/web';
2
+ import { type StreamingSyncImplementation, type CreateSyncImplementationOptions } from '@powersync/shared-internals';
3
+ export declare class NuxtDatabaseImplementation extends WebPowerSyncDatabase {
4
+ private schemaManager;
5
+ private _connector;
6
+ private useDiagnostics;
7
+ get dbOptions(): WebPowerSyncDatabaseOptions;
8
+ get connector(): PowerSyncBackendConnector | null;
9
+ constructor(options: WebPowerSyncDatabaseOptions);
10
+ protected generateSyncStreamImplementation(connector: PowerSyncBackendConnector, options: CreateSyncImplementationOptions): StreamingSyncImplementation;
11
+ connect(connector: PowerSyncBackendConnector, options?: SyncOptions): Promise<void>;
12
+ disconnect(): Promise<void>;
13
+ disconnectAndClear(options?: DisconnectAndClearOptions): Promise<void>;
14
+ }
2
15
  /**
3
16
  * An extended PowerSync database class that includes diagnostic capabilities for use with the PowerSync Inspector.
4
17
  *
@@ -24,17 +37,6 @@ import { PowerSyncDatabase, type DisconnectAndClearOptions, type PowerSyncBacken
24
37
  * - Automatically configures logging when diagnostics are enabled
25
38
  * - When diagnostics are disabled, behaves like a standard `PowerSyncDatabase`
26
39
  */
27
- export declare class NuxtPowerSyncDatabase extends PowerSyncDatabase {
28
- private schemaManager;
29
- private _connector;
30
- private _connectionOptions;
31
- private useDiagnostics;
32
- get dbOptions(): WebPowerSyncDatabaseOptions;
33
- get connector(): PowerSyncBackendConnector | null;
34
- get connectionOptions(): PowerSyncConnectionOptions | null;
35
- constructor(options: WebPowerSyncDatabaseOptions);
36
- protected generateSyncStreamImplementation(connector: PowerSyncBackendConnector, options: RequiredAdditionalConnectionOptions): StreamingSyncImplementation;
37
- connect(connector: PowerSyncBackendConnector, options?: PowerSyncConnectionOptions): Promise<void>;
38
- disconnect(): Promise<void>;
39
- disconnectAndClear(options?: DisconnectAndClearOptions): Promise<void>;
40
+ export declare const NuxtPowerSyncDatabase: PowerSyncDatabaseConstructor<WebPowerSyncDatabaseOptions>;
41
+ export interface NuxtPowerSyncDatabase extends CommonPowerSyncDatabase {
40
42
  }
@@ -1,19 +1,19 @@
1
1
  import {
2
- PowerSyncDatabase,
2
+ WebPowerSyncDatabase,
3
3
  Schema,
4
4
  SharedWebStreamingSyncImplementation,
5
5
  WebRemote,
6
- WebStreamingSyncImplementation
6
+ WebStreamingSyncImplementation,
7
+ LogLevels
7
8
  } from "@powersync/web";
8
9
  import { usePowerSyncInspector } from "../composables/usePowerSyncInspector.js";
9
10
  import { useDiagnosticsLogger } from "../composables/useDiagnosticsLogger.js";
10
11
  import { shallowRef } from "vue";
11
12
  import { useRuntimeConfig } from "#app";
12
13
  import { RustClientInterceptor } from "./RustClientInterceptor.js";
13
- export class NuxtPowerSyncDatabase extends PowerSyncDatabase {
14
+ export class NuxtDatabaseImplementation extends WebPowerSyncDatabase {
14
15
  schemaManager;
15
16
  _connector = null;
16
- _connectionOptions = null;
17
17
  useDiagnostics = false;
18
18
  get dbOptions() {
19
19
  return this.options;
@@ -21,20 +21,16 @@ export class NuxtPowerSyncDatabase extends PowerSyncDatabase {
21
21
  get connector() {
22
22
  return this._connector ?? super.connector;
23
23
  }
24
- get connectionOptions() {
25
- return this._connectionOptions ?? super.connectionOptions;
26
- }
27
24
  constructor(options) {
28
25
  const useDiagnostics = useRuntimeConfig().public.powerSyncModuleOptions.useDiagnostics ?? false;
29
26
  if (useDiagnostics) {
30
27
  const { logger } = useDiagnosticsLogger();
31
28
  const { getCurrentSchemaManager, diagnosticsSchema } = usePowerSyncInspector();
32
29
  const currentSchemaManager = getCurrentSchemaManager();
33
- options.flags = {
34
- ...options.flags,
35
- enableMultiTabs: true,
36
- broadcastLogs: true
37
- };
30
+ if ("database" in options) {
31
+ options.database.enableMultiTabs = true;
32
+ options.broadcastLogs = true;
33
+ }
38
34
  options.logger = logger;
39
35
  options.schema = new Schema([...options.schema.tables, ...diagnosticsSchema.tables]);
40
36
  super(options);
@@ -55,13 +51,13 @@ export class NuxtPowerSyncDatabase extends PowerSyncDatabase {
55
51
  shallowRef(this),
56
52
  shallowRef(schemaManager)
57
53
  );
58
- if (this.options.flags?.enableMultiTabs) {
59
- if (!this.resolvedFlags.broadcastLogs) {
54
+ if (this.resolvedOpenOptions.enableMultiTabs) {
55
+ if (!this.enableBroadcastLogs) {
60
56
  const warning = `
61
57
  Multiple tabs are enabled, but broadcasting of logs is disabled.
62
58
  Logs for shared sync worker will only be available in the shared worker context
63
59
  `;
64
- logger ? logger.warn(warning) : console.warn(warning);
60
+ logger ? logger.log({ level: LogLevels.warn, message: warning }) : console.warn(warning);
65
61
  }
66
62
  return new SharedWebStreamingSyncImplementation({
67
63
  ...options,
@@ -72,7 +68,9 @@ export class NuxtPowerSyncDatabase extends PowerSyncDatabase {
72
68
  await connector.uploadData(this);
73
69
  },
74
70
  logger,
75
- db: this.database
71
+ db: this.database,
72
+ logLevel: this.resolvedOpenOptions.databaseWorkerLogLevel ?? LogLevels.info,
73
+ enableBroadcastLogs: this.enableBroadcastLogs
76
74
  });
77
75
  } else {
78
76
  return new WebStreamingSyncImplementation({
@@ -83,7 +81,7 @@ export class NuxtPowerSyncDatabase extends PowerSyncDatabase {
83
81
  await this.waitForReady();
84
82
  await connector.uploadData(this);
85
83
  },
86
- identifier: "dbFilename" in this.options.database ? this.options.database.dbFilename : "diagnostics-sync",
84
+ identifier: "database" in this.options ? this.options.database.dbFilename : "diagnostics-sync",
87
85
  logger
88
86
  });
89
87
  }
@@ -93,17 +91,15 @@ export class NuxtPowerSyncDatabase extends PowerSyncDatabase {
93
91
  }
94
92
  async connect(connector, options) {
95
93
  this._connector = connector;
96
- this._connectionOptions = options ?? null;
97
94
  await super.connect(connector, options);
98
95
  }
99
96
  async disconnect() {
100
97
  this._connector = null;
101
- this._connectionOptions = null;
102
98
  await super.disconnect();
103
99
  }
104
100
  async disconnectAndClear(options) {
105
101
  this._connector = null;
106
- this._connectionOptions = null;
107
102
  await super.disconnectAndClear(options);
108
103
  }
109
104
  }
105
+ export const NuxtPowerSyncDatabase = NuxtDatabaseImplementation;
@@ -1,5 +1,5 @@
1
1
  import type { ColumnType, PowerSyncDatabase } from '@powersync/web';
2
- import { PowerSyncControlCommand, SqliteBucketStorage } from '@powersync/web';
2
+ import { PowerSyncControlCommand, SqliteBucketStorage } from '@powersync/shared-internals';
3
3
  import type { DynamicSchemaManager } from './DynamicSchemaManager.js';
4
4
  import type { ShallowRef } from 'vue';
5
5
  /**
@@ -1,7 +1,7 @@
1
- import { AbstractPowerSyncDatabase, PowerSyncControlCommand, SqliteBucketStorage } from "@powersync/web";
1
+ import { BasePowerSyncDatabase, PowerSyncControlCommand, SqliteBucketStorage } from "@powersync/shared-internals";
2
2
  export class RustClientInterceptor extends SqliteBucketStorage {
3
3
  constructor(db, schemaManager) {
4
- super(db.value.database, AbstractPowerSyncDatabase.transactionMutex);
4
+ super(db.value.database, BasePowerSyncDatabase.transactionMutex);
5
5
  this.schemaManager = schemaManager;
6
6
  this.rdb = db.value.database;
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powersync/nuxt",
3
- "version": "0.0.0-dev-20260504100448",
3
+ "version": "0.0.0-dev-20260630141119",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -53,9 +53,10 @@
53
53
  },
54
54
  "peerDependencies": {
55
55
  "@journeyapps/wa-sqlite": "^1.7.0",
56
- "@powersync/kysely-driver": "1.3.3",
57
- "@powersync/vue": "0.5.1",
58
- "@powersync/web": "0.0.0-dev-20260504100448"
56
+ "@powersync/kysely-driver": "0.0.0-dev-20260630141119",
57
+ "@powersync/vue": "0.0.0-dev-20260630141119",
58
+ "@powersync/web": "0.0.0-dev-20260630141119",
59
+ "@powersync/shared-internals": "1.0.0"
59
60
  },
60
61
  "peerDependenciesMeta": {
61
62
  "@powersync/kysely-driver": {
@@ -66,16 +67,16 @@
66
67
  "@journeyapps/wa-sqlite": "^1.7.0",
67
68
  "@nuxt/module-builder": "^1.0.2",
68
69
  "@nuxt/schema": "^4.3.1",
69
- "@nuxt/test-utils": "^4.0.0",
70
+ "@nuxt/test-utils": "^4.0.3",
70
71
  "comlink": "^4.4.2",
71
72
  "nuxt": "^4.3.1",
72
- "vitest": "^3.2.4",
73
+ "vitest": "^4.1.8",
73
74
  "vue": "^3.5.30",
74
75
  "vue-tsc": "^3.2.5",
75
- "@powersync/kysely-driver": "1.3.3",
76
- "@powersync/vue": "0.5.1",
77
- "@powersync/web": "0.0.0-dev-20260504100448",
78
- "@powersync/common": "0.0.0-dev-20260504100448"
76
+ "@powersync/kysely-driver": "0.0.0-dev-20260630141119",
77
+ "@powersync/vue": "0.0.0-dev-20260630141119",
78
+ "@powersync/web": "0.0.0-dev-20260630141119",
79
+ "@powersync/common": "0.0.0-dev-20260630141119"
79
80
  },
80
81
  "scripts": {
81
82
  "prebuild": "nuxt-module-build prepare",