@powersync/service-core 0.0.0-dev-20260224151854 → 0.0.0-dev-20260225093637

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.
Files changed (29) hide show
  1. package/CHANGELOG.md +7 -5
  2. package/dist/entry/commands/config-command.js +2 -2
  3. package/dist/entry/commands/config-command.js.map +1 -1
  4. package/dist/util/config/collectors/config-collector.js +13 -0
  5. package/dist/util/config/collectors/config-collector.js.map +1 -1
  6. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.d.ts +1 -1
  7. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js +4 -4
  8. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -1
  9. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.d.ts +1 -1
  10. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js +2 -2
  11. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
  12. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.d.ts +1 -1
  13. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js +3 -3
  14. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js.map +1 -1
  15. package/dist/util/config/types.d.ts +1 -1
  16. package/dist/util/config/types.js.map +1 -1
  17. package/dist/util/env.d.ts +1 -0
  18. package/dist/util/env.js +5 -0
  19. package/dist/util/env.js.map +1 -1
  20. package/package.json +5 -5
  21. package/src/entry/commands/config-command.ts +3 -3
  22. package/src/util/config/collectors/config-collector.ts +16 -0
  23. package/src/util/config/sync-rules/impl/base64-sync-rules-collector.ts +5 -5
  24. package/src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts +3 -3
  25. package/src/util/config/sync-rules/impl/inline-sync-rules-collector.ts +4 -4
  26. package/src/util/config/types.ts +1 -2
  27. package/src/util/env.ts +5 -0
  28. package/test/src/config.test.ts +115 -0
  29. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,11 +1,12 @@
1
1
  # @powersync/service-core
2
2
 
3
- ## 0.0.0-dev-20260224151854
3
+ ## 0.0.0-dev-20260225093637
4
4
 
5
5
  ### Minor Changes
6
6
 
7
7
  - 0998251: For errors related to a sync configuration, report a source offset.
8
8
  - 8a4c34e: Refactor `BucketStorageFactory` and `PersistedSyncRulesContent` to be abstract classes instead of interfaces.
9
+ - d4ae5b5: Added the ability to specify sync configuration in the PowerSync service configuration `sync_config` field.
9
10
  - 8bd83e8: Introduce storage versions.
10
11
 
11
12
  ### Patch Changes
@@ -23,13 +24,14 @@
23
24
  - Updated dependencies [1c45667]
24
25
  - Updated dependencies [8785a3f]
25
26
  - Updated dependencies [d7ff4ad]
27
+ - Updated dependencies [d4ae5b5]
26
28
  - Updated dependencies [8bd83e8]
27
29
  - Updated dependencies [79a9729]
28
30
  - Updated dependencies [5edd95f]
29
- - @powersync/service-types@0.0.0-dev-20260224151854
30
- - @powersync/service-sync-rules@0.0.0-dev-20260224151854
31
- - @powersync/lib-services-framework@0.0.0-dev-20260224151854
32
- - @powersync/service-rsocket-router@0.0.0-dev-20260224151854
31
+ - @powersync/service-types@0.0.0-dev-20260225093637
32
+ - @powersync/service-sync-rules@0.0.0-dev-20260225093637
33
+ - @powersync/lib-services-framework@0.0.0-dev-20260225093637
34
+ - @powersync/service-rsocket-router@0.0.0-dev-20260225093637
33
35
 
34
36
  ## 1.19.2
35
37
 
@@ -6,7 +6,7 @@ export function wrapConfigCommand(command) {
6
6
  return command
7
7
  .option(`-c, --config-path [path]`, 'Path (inside container) to YAML config file. Defaults to process.env.POWERSYNC_CONFIG_PATH', util.env.POWERSYNC_CONFIG_PATH)
8
8
  .option(`-c64, --config-base64 [base64]`, 'Base64 encoded YAML or JSON config file. Defaults to process.env.POWERSYNC_CONFIG_B64', util.env.POWERSYNC_CONFIG_B64)
9
- .option(`-sync64, --sync-base64 [base64]`, 'Base64 encoded YAML Sync Rules. Defaults to process.env.POWERSYNC_SYNC_RULES_B64', util.env.POWERSYNC_SYNC_RULES_B64);
9
+ .option(`-sync64, --sync-base64 [base64]`, 'Base64 encoded YAML Sync Rules. Defaults to process.env.POWERSYNC_SYNC_CONFIG_B64 or process.env.POWERSYNC_SYNC_RULES_B64 for backwards compatility.', util.env.POWERSYNC_SYNC_CONFIG_B64 || util.env.POWERSYNC_SYNC_RULES_B64);
10
10
  }
11
11
  /**
12
12
  * Extracts runner configuration params from Command options.
@@ -15,7 +15,7 @@ export function extractRunnerOptions(options) {
15
15
  return {
16
16
  config_path: options.configPath,
17
17
  config_base64: options.configBase64,
18
- sync_rules_base64: options.syncBase64
18
+ sync_config_base64: options.syncBase64
19
19
  };
20
20
  }
21
21
  //# sourceMappingURL=config-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-command.js","sourceRoot":"","sources":["../../../src/entry/commands/config-command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,0BAA0B,CAAC;AAEjD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,OAAO,OAAO;SACX,MAAM,CACL,0BAA0B,EAC1B,4FAA4F,EAC5F,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAC/B;SACA,MAAM,CACL,gCAAgC,EAChC,uFAAuF,EACvF,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAC9B;SACA,MAAM,CACL,iCAAiC,EACjC,kFAAkF,EAClF,IAAI,CAAC,GAAG,CAAC,wBAAwB,CAClC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAY;IAC/C,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,UAAU;QAC/B,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,iBAAiB,EAAE,OAAO,CAAC,UAAU;KACtC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config-command.js","sourceRoot":"","sources":["../../../src/entry/commands/config-command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,0BAA0B,CAAC;AAEjD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,OAAO,OAAO;SACX,MAAM,CACL,0BAA0B,EAC1B,4FAA4F,EAC5F,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAC/B;SACA,MAAM,CACL,gCAAgC,EAChC,uFAAuF,EACvF,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAC9B;SACA,MAAM,CACL,iCAAiC,EACjC,sJAAsJ,EACtJ,IAAI,CAAC,GAAG,CAAC,yBAAyB,IAAI,IAAI,CAAC,GAAG,CAAC,wBAAwB,CACxE,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAY;IAC/C,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,UAAU;QAC/B,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,kBAAkB,EAAE,OAAO,CAAC,UAAU;KACvC,CAAC;AACJ,CAAC"}
@@ -26,6 +26,16 @@ export class ConfigCollector {
26
26
  */
27
27
  const decoded = this.decode(serialized);
28
28
  this.validate(decoded);
29
+ /**
30
+ * For internal convenience, we duplicate sync_rules and sync_config. Making them interchangeable.
31
+ * Note, we only do this after validation (which only allows one option to be present)
32
+ */
33
+ if (decoded.sync_config) {
34
+ decoded.sync_rules = decoded.sync_config;
35
+ }
36
+ else if (decoded.sync_rules) {
37
+ decoded.sync_config = decoded.sync_rules;
38
+ }
29
39
  return decoded;
30
40
  }
31
41
  /**
@@ -37,6 +47,9 @@ export class ConfigCollector {
37
47
  if (!valid.valid) {
38
48
  throw new Error(`Failed to validate PowerSync config: ${valid.errors.join(', ')}`);
39
49
  }
50
+ if (config.sync_config && config.sync_rules) {
51
+ throw new Error('Both `sync_config` and `sync_rules` are present in the service configuration. Please consolidate into one sync_config.');
52
+ }
40
53
  }
41
54
  decode(encoded) {
42
55
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"config-collector.js","sourceRoot":"","sources":["../../../../src/util/config/collectors/config-collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-collector.js","sourceRoot":"","sources":["../../../../src/util/config/collectors/config-collector.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
+ import { configFile } from '@powersync/service-types';
1
2
  import { RunnerConfig, SyncRulesConfig } from '../../types.js';
2
3
  import { SyncRulesCollector } from '../sync-collector.js';
3
- import { configFile } from '@powersync/service-types';
4
4
  export declare class Base64SyncRulesCollector extends SyncRulesCollector {
5
5
  get name(): string;
6
6
  collect(baseConfig: configFile.PowerSyncConfig, runnerConfig: RunnerConfig): Promise<SyncRulesConfig | null>;
@@ -4,14 +4,14 @@ export class Base64SyncRulesCollector extends SyncRulesCollector {
4
4
  return 'Base64';
5
5
  }
6
6
  async collect(baseConfig, runnerConfig) {
7
- const { sync_rules_base64 } = runnerConfig;
8
- if (!sync_rules_base64) {
7
+ const { sync_config_base64 } = runnerConfig;
8
+ if (!sync_config_base64) {
9
9
  return null;
10
10
  }
11
11
  return {
12
12
  present: true,
13
- exit_on_error: baseConfig.sync_rules?.exit_on_error ?? true,
14
- content: Buffer.from(sync_rules_base64, 'base64').toString()
13
+ exit_on_error: baseConfig.sync_config?.exit_on_error ?? true,
14
+ content: Buffer.from(sync_config_base64, 'base64').toString()
15
15
  };
16
16
  }
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base64-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/base64-sync-rules-collector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAC9D,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC,EAAE,YAA0B;QAC9E,MAAM,EAAE,iBAAiB,EAAE,GAAG,YAAY,CAAC;QAC3C,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU,CAAC,UAAU,EAAE,aAAa,IAAI,IAAI;YAC3D,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE;SAC7D,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"base64-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/base64-sync-rules-collector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAC9D,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC,EAAE,YAA0B;QAC9E,MAAM,EAAE,kBAAkB,EAAE,GAAG,YAAY,CAAC;QAC5C,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU,CAAC,WAAW,EAAE,aAAa,IAAI,IAAI;YAC5D,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE;SAC9D,CAAC;IACJ,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
+ import { configFile } from '@powersync/service-types';
1
2
  import { RunnerConfig, SyncRulesConfig } from '../../types.js';
2
3
  import { SyncRulesCollector } from '../sync-collector.js';
3
- import { configFile } from '@powersync/service-types';
4
4
  export declare class FileSystemSyncRulesCollector extends SyncRulesCollector {
5
5
  get name(): string;
6
6
  collect(baseConfig: configFile.PowerSyncConfig, runnerConfig: RunnerConfig): Promise<SyncRulesConfig | null>;
@@ -5,7 +5,7 @@ export class FileSystemSyncRulesCollector extends SyncRulesCollector {
5
5
  return 'FileSystem';
6
6
  }
7
7
  async collect(baseConfig, runnerConfig) {
8
- const sync_path = baseConfig.sync_rules?.path;
8
+ const sync_path = baseConfig.sync_config?.path;
9
9
  if (!sync_path) {
10
10
  return null;
11
11
  }
@@ -14,7 +14,7 @@ export class FileSystemSyncRulesCollector extends SyncRulesCollector {
14
14
  // Only persist the path here, and load on demand using `loadSyncRules()`.
15
15
  return {
16
16
  present: true,
17
- exit_on_error: baseConfig.sync_rules?.exit_on_error ?? true,
17
+ exit_on_error: baseConfig.sync_config?.exit_on_error ?? true,
18
18
  path: config_path ? path.resolve(path.dirname(config_path), sync_path) : sync_path
19
19
  };
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,OAAO,4BAA6B,SAAQ,kBAAkB;IAClE,IAAI,IAAI;QACN,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC,EAAE,YAA0B;QAC9E,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC;QAErC,0EAA0E;QAC1E,0EAA0E;QAC1E,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU,CAAC,UAAU,EAAE,aAAa,IAAI,IAAI;YAC3D,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;SACnF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"filesystem-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,OAAO,4BAA6B,SAAQ,kBAAkB;IAClE,IAAI,IAAI;QACN,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC,EAAE,YAA0B;QAC9E,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC;QAErC,0EAA0E;QAC1E,0EAA0E;QAC1E,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU,CAAC,WAAW,EAAE,aAAa,IAAI,IAAI;YAC5D,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;SACnF,CAAC;IACJ,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
+ import { configFile } from '@powersync/service-types';
1
2
  import { SyncRulesConfig } from '../../types.js';
2
3
  import { SyncRulesCollector } from '../sync-collector.js';
3
- import { configFile } from '@powersync/service-types';
4
4
  export declare class InlineSyncRulesCollector extends SyncRulesCollector {
5
5
  get name(): string;
6
6
  collect(baseConfig: configFile.PowerSyncConfig): Promise<SyncRulesConfig | null>;
@@ -4,14 +4,14 @@ export class InlineSyncRulesCollector extends SyncRulesCollector {
4
4
  return 'Inline';
5
5
  }
6
6
  async collect(baseConfig) {
7
- const content = baseConfig.sync_rules?.content;
7
+ const content = baseConfig?.sync_config?.content;
8
8
  if (!content) {
9
9
  return null;
10
10
  }
11
11
  return {
12
12
  present: true,
13
- exit_on_error: true,
14
- ...baseConfig.sync_rules
13
+ exit_on_error: baseConfig.sync_config?.exit_on_error ?? true,
14
+ ...baseConfig.sync_config
15
15
  };
16
16
  }
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"inline-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/inline-sync-rules-collector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAC9D,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC;QAClD,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,IAAI;YACnB,GAAG,UAAU,CAAC,UAAU;SACzB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"inline-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/inline-sync-rules-collector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAC9D,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC;QAClD,MAAM,OAAO,GAAG,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU,CAAC,WAAW,EAAE,aAAa,IAAI,IAAI;YAC5D,GAAG,UAAU,CAAC,WAAW;SAC1B,CAAC;IACJ,CAAC;CACF"}
@@ -9,7 +9,7 @@ export declare enum ServiceRunner {
9
9
  export type RunnerConfig = {
10
10
  config_path?: string;
11
11
  config_base64?: string;
12
- sync_rules_base64?: string;
12
+ sync_config_base64?: string;
13
13
  };
14
14
  export type MigrationContext = {
15
15
  runner_config: RunnerConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/util/config/types.ts"],"names":[],"mappings":"AAKA,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4BAAW,CAAA;IACX,8BAAa,CAAA;AACf,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/util/config/types.ts"],"names":[],"mappings":"AAIA,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4BAAW,CAAA;IACX,8BAAa,CAAA;AACf,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"}
@@ -3,6 +3,7 @@ export declare const env: {
3
3
  POWERSYNC_CONFIG_PATH?: string | undefined;
4
4
  POWERSYNC_CONFIG_B64?: string | undefined;
5
5
  POWERSYNC_SYNC_RULES_B64?: string | undefined;
6
+ POWERSYNC_SYNC_CONFIG_B64?: string | undefined;
6
7
  NODE_ENV?: string | undefined;
7
8
  };
8
9
  export type Env = typeof env;
package/dist/util/env.js CHANGED
@@ -10,9 +10,14 @@ export const env = utils.collectEnvironmentVariables({
10
10
  */
11
11
  POWERSYNC_CONFIG_B64: utils.type.string.optional(),
12
12
  /**
13
+ * @deprecated use POWERSYNC_SYNC_CONFIG_B64 instead.
13
14
  * Base64 encoded contents of sync rules YAML
14
15
  */
15
16
  POWERSYNC_SYNC_RULES_B64: utils.type.string.optional(),
17
+ /**
18
+ * Base64 encoded contents of sync rules YAML
19
+ */
20
+ POWERSYNC_SYNC_CONFIG_B64: utils.type.string.optional(),
16
21
  /**
17
22
  * Runner to be started in this process
18
23
  */
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/util/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,2BAA2B,CAAC;IACnD;;OAEG;IACH,qBAAqB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACnD;;OAEG;IACH,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IAClD;;OAEG;IACH,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACtD;;OAEG;IACH,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;IAEhE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/util/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,2BAA2B,CAAC;IACnD;;OAEG;IACH,qBAAqB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACnD;;OAEG;IACH,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IAClD;;;OAGG;IACH,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACtD;;OAEG;IACH,yBAAyB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACvD;;OAEG;IACH,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;IAEhE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC"}
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
8
- "version": "0.0.0-dev-20260224151854",
8
+ "version": "0.0.0-dev-20260225093637",
9
9
  "main": "dist/index.js",
10
10
  "license": "FSL-1.1-ALv2",
11
11
  "type": "module",
@@ -33,11 +33,11 @@
33
33
  "uuid": "^11.1.0",
34
34
  "winston": "^3.13.0",
35
35
  "yaml": "^2.3.2",
36
- "@powersync/lib-services-framework": "0.0.0-dev-20260224151854",
36
+ "@powersync/lib-services-framework": "0.0.0-dev-20260225093637",
37
37
  "@powersync/service-jsonbig": "0.17.12",
38
- "@powersync/service-rsocket-router": "0.0.0-dev-20260224151854",
39
- "@powersync/service-sync-rules": "0.0.0-dev-20260224151854",
40
- "@powersync/service-types": "0.0.0-dev-20260224151854"
38
+ "@powersync/service-rsocket-router": "0.0.0-dev-20260225093637",
39
+ "@powersync/service-sync-rules": "0.0.0-dev-20260225093637",
40
+ "@powersync/service-types": "0.0.0-dev-20260225093637"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/async": "^3.2.24",
@@ -19,8 +19,8 @@ export function wrapConfigCommand(command: Command) {
19
19
  )
20
20
  .option(
21
21
  `-sync64, --sync-base64 [base64]`,
22
- 'Base64 encoded YAML Sync Rules. Defaults to process.env.POWERSYNC_SYNC_RULES_B64',
23
- util.env.POWERSYNC_SYNC_RULES_B64
22
+ 'Base64 encoded YAML Sync Rules. Defaults to process.env.POWERSYNC_SYNC_CONFIG_B64 or process.env.POWERSYNC_SYNC_RULES_B64 for backwards compatility.',
23
+ util.env.POWERSYNC_SYNC_CONFIG_B64 || util.env.POWERSYNC_SYNC_RULES_B64
24
24
  );
25
25
  }
26
26
 
@@ -31,6 +31,6 @@ export function extractRunnerOptions(options: any): util.RunnerConfig {
31
31
  return {
32
32
  config_path: options.configPath,
33
33
  config_base64: options.configBase64,
34
- sync_rules_base64: options.syncBase64
34
+ sync_config_base64: options.syncBase64
35
35
  };
36
36
  }
@@ -40,6 +40,16 @@ export abstract class ConfigCollector {
40
40
  */
41
41
  const decoded = this.decode(serialized);
42
42
  this.validate(decoded);
43
+
44
+ /**
45
+ * For internal convenience, we duplicate sync_rules and sync_config. Making them interchangeable.
46
+ * Note, we only do this after validation (which only allows one option to be present)
47
+ */
48
+ if (decoded.sync_config) {
49
+ decoded.sync_rules = decoded.sync_config;
50
+ } else if (decoded.sync_rules) {
51
+ decoded.sync_config = decoded.sync_rules;
52
+ }
43
53
  return decoded;
44
54
  }
45
55
 
@@ -52,6 +62,12 @@ export abstract class ConfigCollector {
52
62
  if (!valid.valid) {
53
63
  throw new Error(`Failed to validate PowerSync config: ${valid.errors.join(', ')}`);
54
64
  }
65
+
66
+ if (config.sync_config && config.sync_rules) {
67
+ throw new Error(
68
+ 'Both `sync_config` and `sync_rules` are present in the service configuration. Please consolidate into one sync_config.'
69
+ );
70
+ }
55
71
  }
56
72
 
57
73
  decode(encoded: configFile.SerializedPowerSyncConfig): configFile.PowerSyncConfig {
@@ -1,6 +1,6 @@
1
+ import { configFile } from '@powersync/service-types';
1
2
  import { RunnerConfig, SyncRulesConfig } from '../../types.js';
2
3
  import { SyncRulesCollector } from '../sync-collector.js';
3
- import { configFile } from '@powersync/service-types';
4
4
 
5
5
  export class Base64SyncRulesCollector extends SyncRulesCollector {
6
6
  get name(): string {
@@ -8,15 +8,15 @@ export class Base64SyncRulesCollector extends SyncRulesCollector {
8
8
  }
9
9
 
10
10
  async collect(baseConfig: configFile.PowerSyncConfig, runnerConfig: RunnerConfig): Promise<SyncRulesConfig | null> {
11
- const { sync_rules_base64 } = runnerConfig;
12
- if (!sync_rules_base64) {
11
+ const { sync_config_base64 } = runnerConfig;
12
+ if (!sync_config_base64) {
13
13
  return null;
14
14
  }
15
15
 
16
16
  return {
17
17
  present: true,
18
- exit_on_error: baseConfig.sync_rules?.exit_on_error ?? true,
19
- content: Buffer.from(sync_rules_base64, 'base64').toString()
18
+ exit_on_error: baseConfig.sync_config?.exit_on_error ?? true,
19
+ content: Buffer.from(sync_config_base64, 'base64').toString()
20
20
  };
21
21
  }
22
22
  }
@@ -1,7 +1,7 @@
1
+ import { configFile } from '@powersync/service-types';
1
2
  import * as path from 'path';
2
3
  import { RunnerConfig, SyncRulesConfig } from '../../types.js';
3
4
  import { SyncRulesCollector } from '../sync-collector.js';
4
- import { configFile } from '@powersync/service-types';
5
5
 
6
6
  export class FileSystemSyncRulesCollector extends SyncRulesCollector {
7
7
  get name(): string {
@@ -9,7 +9,7 @@ export class FileSystemSyncRulesCollector extends SyncRulesCollector {
9
9
  }
10
10
 
11
11
  async collect(baseConfig: configFile.PowerSyncConfig, runnerConfig: RunnerConfig): Promise<SyncRulesConfig | null> {
12
- const sync_path = baseConfig.sync_rules?.path;
12
+ const sync_path = baseConfig.sync_config?.path;
13
13
  if (!sync_path) {
14
14
  return null;
15
15
  }
@@ -20,7 +20,7 @@ export class FileSystemSyncRulesCollector extends SyncRulesCollector {
20
20
  // Only persist the path here, and load on demand using `loadSyncRules()`.
21
21
  return {
22
22
  present: true,
23
- exit_on_error: baseConfig.sync_rules?.exit_on_error ?? true,
23
+ exit_on_error: baseConfig.sync_config?.exit_on_error ?? true,
24
24
  path: config_path ? path.resolve(path.dirname(config_path), sync_path) : sync_path
25
25
  };
26
26
  }
@@ -1,6 +1,6 @@
1
+ import { configFile } from '@powersync/service-types';
1
2
  import { SyncRulesConfig } from '../../types.js';
2
3
  import { SyncRulesCollector } from '../sync-collector.js';
3
- import { configFile } from '@powersync/service-types';
4
4
 
5
5
  export class InlineSyncRulesCollector extends SyncRulesCollector {
6
6
  get name(): string {
@@ -8,15 +8,15 @@ export class InlineSyncRulesCollector extends SyncRulesCollector {
8
8
  }
9
9
 
10
10
  async collect(baseConfig: configFile.PowerSyncConfig): Promise<SyncRulesConfig | null> {
11
- const content = baseConfig.sync_rules?.content;
11
+ const content = baseConfig?.sync_config?.content;
12
12
  if (!content) {
13
13
  return null;
14
14
  }
15
15
 
16
16
  return {
17
17
  present: true,
18
- exit_on_error: true,
19
- ...baseConfig.sync_rules
18
+ exit_on_error: baseConfig.sync_config?.exit_on_error ?? true,
19
+ ...baseConfig.sync_config
20
20
  };
21
21
  }
22
22
  }
@@ -1,6 +1,5 @@
1
1
  import { configFile } from '@powersync/service-types';
2
2
  import { CompoundKeyCollector } from '../../auth/CompoundKeyCollector.js';
3
- import { KeySpec } from '../../auth/KeySpec.js';
4
3
  import { KeyStore } from '../../auth/KeyStore.js';
5
4
 
6
5
  export enum ServiceRunner {
@@ -12,7 +11,7 @@ export enum ServiceRunner {
12
11
  export type RunnerConfig = {
13
12
  config_path?: string;
14
13
  config_base64?: string;
15
- sync_rules_base64?: string;
14
+ sync_config_base64?: string;
16
15
  };
17
16
 
18
17
  export type MigrationContext = {
package/src/util/env.ts CHANGED
@@ -12,9 +12,14 @@ export const env = utils.collectEnvironmentVariables({
12
12
  */
13
13
  POWERSYNC_CONFIG_B64: utils.type.string.optional(),
14
14
  /**
15
+ * @deprecated use POWERSYNC_SYNC_CONFIG_B64 instead.
15
16
  * Base64 encoded contents of sync rules YAML
16
17
  */
17
18
  POWERSYNC_SYNC_RULES_B64: utils.type.string.optional(),
19
+ /**
20
+ * Base64 encoded contents of sync rules YAML
21
+ */
22
+ POWERSYNC_SYNC_CONFIG_B64: utils.type.string.optional(),
18
23
  /**
19
24
  * Runner to be started in this process
20
25
  */
@@ -69,6 +69,7 @@ describe('Config', () => {
69
69
 
70
70
  expect(config.api_parameters.max_buckets_per_connection).toBe(1);
71
71
  });
72
+
72
73
  it('should throw YAML validation error for invalid base64 config', {}, async () => {
73
74
  const yamlConfig = /* yaml */ `
74
75
  # PowerSync config
@@ -86,4 +87,118 @@ describe('Config', () => {
86
87
  })
87
88
  ).rejects.toThrow(/YAML Error:[\s\S]*Attempting to substitute environment variable INVALID_VAR/);
88
89
  });
90
+
91
+ it('should resolve inline sync config', async () => {
92
+ const yamlConfig = /* yaml */ `
93
+ # PowerSync config
94
+ replication:
95
+ connections: []
96
+ storage:
97
+ type: mongodb
98
+ sync_config:
99
+ content: |
100
+ config:
101
+ edition: 2
102
+ streams:
103
+ a:
104
+ query: SELECT * FROM users
105
+ `;
106
+
107
+ const collector = new CompoundConfigCollector();
108
+
109
+ const result = await collector.collectConfig({
110
+ config_base64: Buffer.from(yamlConfig, 'utf-8').toString('base64')
111
+ });
112
+
113
+ expect(result.sync_rules).toEqual({
114
+ present: true,
115
+ exit_on_error: true,
116
+ content: expect.stringContaining('edition: 2')
117
+ });
118
+ });
119
+
120
+ it('should still resolve inline sync rules', async () => {
121
+ const yamlConfig = /* yaml */ `
122
+ # PowerSync config
123
+ replication:
124
+ connections: []
125
+ storage:
126
+ type: mongodb
127
+ sync_rules:
128
+ content: |
129
+ config:
130
+ edition: 2
131
+ streams:
132
+ a:
133
+ query: SELECT * FROM users
134
+ `;
135
+
136
+ const collector = new CompoundConfigCollector();
137
+
138
+ const result = await collector.collectConfig({
139
+ config_base64: Buffer.from(yamlConfig, 'utf-8').toString('base64')
140
+ });
141
+
142
+ expect(result.sync_rules).toEqual({
143
+ present: true,
144
+ exit_on_error: true,
145
+ content: expect.stringContaining('edition: 2')
146
+ });
147
+ });
148
+
149
+ it('should resolve base64 sync config', async () => {
150
+ const yamlConfig = /* yaml */ `
151
+ # PowerSync config
152
+ replication:
153
+ connections: []
154
+ storage:
155
+ type: mongodb
156
+ `;
157
+ const yamlSyncConfig = /* yaml */ `
158
+ config:
159
+ edition: 2
160
+ streams:
161
+ a:
162
+ query: SELECT * FROM users
163
+ `;
164
+
165
+ const collector = new CompoundConfigCollector();
166
+
167
+ const result = await collector.collectConfig({
168
+ config_base64: Buffer.from(yamlConfig, 'utf-8').toString('base64'),
169
+ sync_config_base64: Buffer.from(yamlSyncConfig, 'utf-8').toString('base64')
170
+ });
171
+
172
+ expect(result.sync_rules).toEqual({
173
+ present: true,
174
+ exit_on_error: true,
175
+ content: expect.stringContaining('edition: 2')
176
+ });
177
+ });
178
+
179
+ it('should not allow both sync_config and sync_rules', async () => {
180
+ const yamlConfig = /* yaml */ `
181
+ # PowerSync config
182
+ replication:
183
+ connections: []
184
+ storage:
185
+ type: mongodb
186
+ sync_config:
187
+ content: |
188
+ config:
189
+ edition: 2
190
+ sync_rules:
191
+ content: |
192
+ config:
193
+ edition: 2
194
+ `;
195
+
196
+ const collector = new CompoundConfigCollector();
197
+
198
+ await expect(
199
+ collector.collectConfig({
200
+ config_base64: Buffer.from(yamlConfig, 'utf-8').toString('base64')
201
+ })
202
+ ).rejects.toThrow(/Both `sync_config` and `sync_rules` are present/);
203
+ });
89
204
  });