@rudderjs/core 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/providers-discover.d.ts +14 -1
- package/dist/commands/providers-discover.d.ts.map +1 -1
- package/dist/commands/providers-discover.js +55 -3
- package/dist/commands/providers-discover.js.map +1 -1
- package/dist/default-providers.d.ts +9 -3
- package/dist/default-providers.d.ts.map +1 -1
- package/dist/default-providers.js +80 -14
- package/dist/default-providers.js.map +1 -1
- package/dist/provider-registry.d.ts +18 -1
- package/dist/provider-registry.d.ts.map +1 -1
- package/dist/provider-registry.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,11 +1,24 @@
|
|
|
1
|
-
import type { ProviderEntry } from '../provider-registry.js';
|
|
1
|
+
import type { ManifestFingerprint, ProviderEntry } from '../provider-registry.js';
|
|
2
2
|
/**
|
|
3
3
|
* Scan node_modules for packages that declare a `rudderjs` field in their
|
|
4
4
|
* package.json and return sorted provider entries.
|
|
5
5
|
*/
|
|
6
6
|
export declare function scanProviders(cwd: string): ProviderEntry[];
|
|
7
|
+
/**
|
|
8
|
+
* Fingerprint the dependency state the scan ran against, so the boot path can
|
|
9
|
+
* detect a stale manifest. `depsHash` catches package.json edits (add/remove);
|
|
10
|
+
* the lockfile stat (size/mtime only — the multi-MB file is never read)
|
|
11
|
+
* catches in-range updates that swap an installed package's `rudderjs` field.
|
|
12
|
+
* Absent inputs are omitted; the staleness check skips missing fields.
|
|
13
|
+
*/
|
|
14
|
+
export declare function computeFingerprint(cwd: string): ManifestFingerprint;
|
|
15
|
+
/** A manifest is stale when any fingerprint field that exists on both sides differs. */
|
|
16
|
+
export declare function isFingerprintStale(stored: ManifestFingerprint | undefined, current: ManifestFingerprint): boolean;
|
|
7
17
|
/**
|
|
8
18
|
* Write the provider manifest to bootstrap/cache/providers.json.
|
|
19
|
+
*
|
|
20
|
+
* Atomic (tmp + rename) so a concurrently booting process never reads a
|
|
21
|
+
* half-written manifest — the boot path may now write this file too.
|
|
9
22
|
*/
|
|
10
23
|
export declare function writeProviderManifest(cwd: string, sorted: ProviderEntry[]): string;
|
|
11
24
|
//# sourceMappingURL=providers-discover.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers-discover.d.ts","sourceRoot":"","sources":["../../src/commands/providers-discover.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"providers-discover.d.ts","sourceRoot":"","sources":["../../src/commands/providers-discover.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAoB,MAAM,yBAAyB,CAAA;AAWnG;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,CAI1D;AAKD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CA0BnE;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,SAAS,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAQjH;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAelF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
1
|
+
import { readFileSync, readdirSync, writeFileSync, mkdirSync, renameSync, statSync } from 'node:fs';
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
3
|
import path from 'node:path';
|
|
3
4
|
import { sortByStageAndDepends } from '../provider-sort.js';
|
|
4
5
|
/**
|
|
@@ -10,19 +11,70 @@ export function scanProviders(cwd) {
|
|
|
10
11
|
const entries = scanNodeModules(nodeModules);
|
|
11
12
|
return sortByStageAndDepends(entries);
|
|
12
13
|
}
|
|
14
|
+
/** Lockfiles checked (in order) when fingerprinting the dependency state. */
|
|
15
|
+
const LOCKFILES = ['pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lock', 'bun.lockb'];
|
|
16
|
+
/**
|
|
17
|
+
* Fingerprint the dependency state the scan ran against, so the boot path can
|
|
18
|
+
* detect a stale manifest. `depsHash` catches package.json edits (add/remove);
|
|
19
|
+
* the lockfile stat (size/mtime only — the multi-MB file is never read)
|
|
20
|
+
* catches in-range updates that swap an installed package's `rudderjs` field.
|
|
21
|
+
* Absent inputs are omitted; the staleness check skips missing fields.
|
|
22
|
+
*/
|
|
23
|
+
export function computeFingerprint(cwd) {
|
|
24
|
+
const fingerprint = {};
|
|
25
|
+
try {
|
|
26
|
+
const pkg = JSON.parse(readFileSync(path.join(cwd, 'package.json'), 'utf-8'));
|
|
27
|
+
fingerprint.depsHash = createHash('sha256')
|
|
28
|
+
.update(JSON.stringify({ dependencies: pkg.dependencies ?? {}, devDependencies: pkg.devDependencies ?? {} }))
|
|
29
|
+
.digest('hex');
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// No readable package.json — fingerprint stays partial.
|
|
33
|
+
}
|
|
34
|
+
for (const name of LOCKFILES) {
|
|
35
|
+
try {
|
|
36
|
+
const stat = statSync(path.join(cwd, name));
|
|
37
|
+
fingerprint.lockfile = { name, size: stat.size, mtimeMs: stat.mtimeMs };
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// try the next lockfile
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return fingerprint;
|
|
45
|
+
}
|
|
46
|
+
/** A manifest is stale when any fingerprint field that exists on both sides differs. */
|
|
47
|
+
export function isFingerprintStale(stored, current) {
|
|
48
|
+
if (!stored)
|
|
49
|
+
return true; // legacy v2 manifest — no fingerprint to trust
|
|
50
|
+
if (stored.depsHash && current.depsHash && stored.depsHash !== current.depsHash)
|
|
51
|
+
return true;
|
|
52
|
+
if (stored.lockfile && current.lockfile) {
|
|
53
|
+
const a = stored.lockfile, b = current.lockfile;
|
|
54
|
+
if (a.name !== b.name || a.size !== b.size || a.mtimeMs !== b.mtimeMs)
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
13
59
|
/**
|
|
14
60
|
* Write the provider manifest to bootstrap/cache/providers.json.
|
|
61
|
+
*
|
|
62
|
+
* Atomic (tmp + rename) so a concurrently booting process never reads a
|
|
63
|
+
* half-written manifest — the boot path may now write this file too.
|
|
15
64
|
*/
|
|
16
65
|
export function writeProviderManifest(cwd, sorted) {
|
|
17
66
|
const manifest = {
|
|
18
|
-
version:
|
|
67
|
+
version: 3,
|
|
19
68
|
generated: new Date().toISOString(),
|
|
69
|
+
fingerprint: computeFingerprint(cwd),
|
|
20
70
|
providers: sorted,
|
|
21
71
|
};
|
|
22
72
|
const cacheDir = path.join(cwd, 'bootstrap/cache');
|
|
23
73
|
mkdirSync(cacheDir, { recursive: true });
|
|
24
74
|
const manifestPath = path.join(cacheDir, 'providers.json');
|
|
25
|
-
|
|
75
|
+
const tmpPath = path.join(cacheDir, `.providers.json.${randomUUID()}.tmp`);
|
|
76
|
+
writeFileSync(tmpPath, JSON.stringify(manifest, null, 2) + '\n');
|
|
77
|
+
renameSync(tmpPath, manifestPath);
|
|
26
78
|
return manifestPath;
|
|
27
79
|
}
|
|
28
80
|
function scanNodeModules(nodeModules) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers-discover.js","sourceRoot":"","sources":["../../src/commands/providers-discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"providers-discover.js","sourceRoot":"","sources":["../../src/commands/providers-discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,9 +8,15 @@ export interface DefaultProvidersOptions {
|
|
|
8
8
|
/**
|
|
9
9
|
* Returns the framework's default provider classes, sorted by stage + depends.
|
|
10
10
|
*
|
|
11
|
-
* Resolution order:
|
|
12
|
-
* 1. `bootstrap/cache/providers.json` manifest
|
|
13
|
-
*
|
|
11
|
+
* Resolution order (self-healing — no manual `providers:discover` needed):
|
|
12
|
+
* 1. `bootstrap/cache/providers.json` manifest, when its fingerprint matches the
|
|
13
|
+
* current dependency state.
|
|
14
|
+
* 2. Manifest missing or stale → scan node_modules at boot. In development the
|
|
15
|
+
* manifest is rewritten; in production a stale manifest is still honored
|
|
16
|
+
* (deterministic boots) with a warning, and a missing one is scanned in
|
|
17
|
+
* memory with a warning — bake the manifest via `rudder providers:discover`
|
|
18
|
+
* in your build step for bundled/serverless deploys.
|
|
19
|
+
* 3. Built-in minimal registry as a last resort (no node_modules to scan).
|
|
14
20
|
*
|
|
15
21
|
* Each entry's `package` is dynamically imported via `resolveOptionalPeer`.
|
|
16
22
|
* Missing non-optional packages log a warning and are skipped; missing optional
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-providers.d.ts","sourceRoot":"","sources":["../src/default-providers.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAK5D,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,EAAE,WAAW,KAAK,eAAe,CAAA;AAErE,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAcD
|
|
1
|
+
{"version":3,"file":"default-providers.d.ts","sourceRoot":"","sources":["../src/default-providers.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAK5D,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,EAAE,WAAW,KAAK,eAAe,CAAA;AAErE,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAwHtG"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// module stays safe to include in browser bundles. Vite externalizes node:* in
|
|
3
3
|
// client builds, and a top-level import would crash the browser the moment any
|
|
4
4
|
// client code transitively touches @rudderjs/core's barrel export.
|
|
5
|
-
import { resolveOptionalPeer, config } from '@rudderjs/support';
|
|
5
|
+
import { resolveOptionalPeer, config, Env } from '@rudderjs/support';
|
|
6
6
|
import { BUILTIN_REGISTRY } from './provider-registry.js';
|
|
7
7
|
import { sortByStageAndDepends } from './provider-sort.js';
|
|
8
8
|
// Cached on globalThis (not a module-level let) because Vite SSR can isolate the
|
|
@@ -17,9 +17,15 @@ export function getLastLoadedProviderEntries() {
|
|
|
17
17
|
/**
|
|
18
18
|
* Returns the framework's default provider classes, sorted by stage + depends.
|
|
19
19
|
*
|
|
20
|
-
* Resolution order:
|
|
21
|
-
* 1. `bootstrap/cache/providers.json` manifest
|
|
22
|
-
*
|
|
20
|
+
* Resolution order (self-healing — no manual `providers:discover` needed):
|
|
21
|
+
* 1. `bootstrap/cache/providers.json` manifest, when its fingerprint matches the
|
|
22
|
+
* current dependency state.
|
|
23
|
+
* 2. Manifest missing or stale → scan node_modules at boot. In development the
|
|
24
|
+
* manifest is rewritten; in production a stale manifest is still honored
|
|
25
|
+
* (deterministic boots) with a warning, and a missing one is scanned in
|
|
26
|
+
* memory with a warning — bake the manifest via `rudder providers:discover`
|
|
27
|
+
* in your build step for bundled/serverless deploys.
|
|
28
|
+
* 3. Built-in minimal registry as a last resort (no node_modules to scan).
|
|
23
29
|
*
|
|
24
30
|
* Each entry's `package` is dynamically imported via `resolveOptionalPeer`.
|
|
25
31
|
* Missing non-optional packages log a warning and are skipped; missing optional
|
|
@@ -54,22 +60,82 @@ export async function defaultProviders(options = {}) {
|
|
|
54
60
|
// Lazy-load node:* so this module stays browser-safe at the top level.
|
|
55
61
|
const { readFileSync } = await import('node:fs');
|
|
56
62
|
const path = await import('node:path');
|
|
57
|
-
|
|
58
|
-
|
|
63
|
+
const cwd = process.cwd();
|
|
64
|
+
// Same env derivation as Application (APP_ENV, defaulting to production —
|
|
65
|
+
// the safe side: production never auto-rewrites the manifest).
|
|
66
|
+
const isProduction = Env.get('APP_ENV', 'production') === 'production';
|
|
67
|
+
// 1. Read the manifest (cached fast path)
|
|
68
|
+
let manifest;
|
|
59
69
|
try {
|
|
60
|
-
|
|
61
|
-
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
62
|
-
entries = manifest.providers;
|
|
70
|
+
manifest = JSON.parse(readFileSync(path.join(cwd, 'bootstrap/cache/providers.json'), 'utf-8'));
|
|
63
71
|
}
|
|
64
72
|
catch {
|
|
65
|
-
//
|
|
66
|
-
entries = sortByStageAndDepends(BUILTIN_REGISTRY);
|
|
73
|
+
// missing or unreadable — handled below
|
|
67
74
|
}
|
|
68
|
-
//
|
|
75
|
+
// 2. Self-heal: scan node_modules when the manifest is missing or stale.
|
|
76
|
+
// commands/providers-discover.js has top-level node:* imports, so it is
|
|
77
|
+
// lazy-loaded here to keep this module browser-safe at eval time.
|
|
78
|
+
let entries = manifest?.providers;
|
|
79
|
+
if (manifest) {
|
|
80
|
+
try {
|
|
81
|
+
const { computeFingerprint, isFingerprintStale, scanProviders, writeProviderManifest } = await import('./commands/providers-discover.js');
|
|
82
|
+
if (isFingerprintStale(manifest.fingerprint, computeFingerprint(cwd))) {
|
|
83
|
+
if (isProduction) {
|
|
84
|
+
// Honor the manifest — deterministic boots win in production. Legacy
|
|
85
|
+
// v2 manifests (no fingerprint) are used silently; a genuinely stale
|
|
86
|
+
// v3 fingerprint warns.
|
|
87
|
+
if (manifest.version >= 3) {
|
|
88
|
+
console.warn('[RudderJS] provider manifest is stale (dependencies changed since it was generated). ' +
|
|
89
|
+
'Using it anyway — run `rudder providers:discover` in your build step to refresh.');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const scanned = scanProviders(cwd);
|
|
94
|
+
if (scanned.length > 0) {
|
|
95
|
+
entries = scanned;
|
|
96
|
+
try {
|
|
97
|
+
writeProviderManifest(cwd, scanned);
|
|
98
|
+
}
|
|
99
|
+
catch { /* read-only fs — in-memory result still used */ }
|
|
100
|
+
console.log('[RudderJS] provider manifest regenerated (dependencies changed)');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Fingerprint check failed — use the manifest as-is.
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
try {
|
|
111
|
+
const { scanProviders, writeProviderManifest } = await import('./commands/providers-discover.js');
|
|
112
|
+
const scanned = scanProviders(cwd);
|
|
113
|
+
if (scanned.length > 0) {
|
|
114
|
+
entries = scanned;
|
|
115
|
+
try {
|
|
116
|
+
writeProviderManifest(cwd, scanned);
|
|
117
|
+
}
|
|
118
|
+
catch { /* read-only fs — in-memory result still used */ }
|
|
119
|
+
if (isProduction) {
|
|
120
|
+
console.warn('[RudderJS] no provider manifest found — scanned node_modules at boot. ' +
|
|
121
|
+
'Run `rudder providers:discover` in your build step to bake bootstrap/cache/providers.json.');
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
console.log('[RudderJS] provider manifest generated (bootstrap/cache/providers.json)');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Scan failed — fall through to the built-in registry.
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// 3. Last resort: built-in minimal registry (no manifest, nothing to scan)
|
|
133
|
+
entries ??= sortByStageAndDepends(BUILTIN_REGISTRY);
|
|
134
|
+
// 4. Drop entries explicitly opted out of auto-discovery
|
|
69
135
|
entries = entries.filter(e => e.autoDiscover !== false);
|
|
70
|
-
//
|
|
136
|
+
// 5. Resolve multi-driver collisions (e.g. orm-prisma vs orm-drizzle)
|
|
71
137
|
entries = resolveMultiDriver(entries, '@rudderjs/orm-', 'database.driver');
|
|
72
|
-
//
|
|
138
|
+
// 6. Filter installed + skipped, then resolve each class
|
|
73
139
|
const providers = [];
|
|
74
140
|
const loaded = [];
|
|
75
141
|
for (const entry of entries) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-providers.js","sourceRoot":"","sources":["../src/default-providers.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,+EAA+E;AAC/E,mEAAmE;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"default-providers.js","sourceRoot":"","sources":["../src/default-providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,9 +28,26 @@ export interface ProviderEntry {
|
|
|
28
28
|
*/
|
|
29
29
|
providerSubpath?: string;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Fingerprint of the dependency state a manifest was scanned from. Lets
|
|
33
|
+
* `defaultProviders()` detect a stale manifest (raw `pnpm add/remove/update`
|
|
34
|
+
* without a `providers:discover` run) and self-heal at boot.
|
|
35
|
+
*/
|
|
36
|
+
export interface ManifestFingerprint {
|
|
37
|
+
/** sha256 of JSON({ dependencies, devDependencies }) from the app package.json. */
|
|
38
|
+
depsHash?: string;
|
|
39
|
+
/** Stat of the first lockfile found — size/mtime only, the file is never read. */
|
|
40
|
+
lockfile?: {
|
|
41
|
+
name: string;
|
|
42
|
+
size: number;
|
|
43
|
+
mtimeMs: number;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
31
46
|
export interface ProviderManifest {
|
|
32
|
-
|
|
47
|
+
/** v2 = legacy (no fingerprint); v3 adds `fingerprint`. */
|
|
48
|
+
version: 2 | 3;
|
|
33
49
|
generated: string;
|
|
50
|
+
fingerprint?: ManifestFingerprint;
|
|
34
51
|
providers: ProviderEntry[];
|
|
35
52
|
}
|
|
36
53
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../src/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,gBAAgB,GAAG,SAAS,GAAG,YAAY,CAAA;AAEtF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAQ,MAAM,CAAA;IACrB,QAAQ,EAAO,MAAM,CAAA;IACrB,KAAK,EAAU,aAAa,CAAA;IAC5B,OAAO,CAAC,EAAO,MAAM,EAAE,CAAA;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,EAAM,OAAO,CAAA;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,
|
|
1
|
+
{"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../src/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,gBAAgB,GAAG,SAAS,GAAG,YAAY,CAAA;AAEtF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAQ,MAAM,CAAA;IACrB,QAAQ,EAAO,MAAM,CAAA;IACrB,KAAK,EAAU,aAAa,CAAA;IAC5B,OAAO,CAAC,EAAO,MAAM,EAAE,CAAA;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,EAAM,OAAO,CAAA;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kFAAkF;IAClF,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3D;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,OAAO,EAAO,CAAC,GAAG,CAAC,CAAA;IACnB,SAAS,EAAK,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,mBAAmB,CAAA;IACjC,SAAS,EAAK,aAAa,EAAE,CAAA;CAC9B;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,EAS3C,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../src/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../src/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6CH;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,EAAE,OAAO,EAAE,eAAe,EAAS,QAAQ,EAAE,aAAa,EAAO,KAAK,EAAE,YAAY,EAAM,QAAQ,EAAE,IAAI,EAAE;IAC1G,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC1G,EAAE,OAAO,EAAE,mBAAmB,EAAK,QAAQ,EAAE,iBAAiB,EAAG,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC1G,EAAE,OAAO,EAAE,gBAAgB,EAAQ,QAAQ,EAAE,cAAc,EAAM,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC1G,EAAE,OAAO,EAAE,iBAAiB,EAAO,QAAQ,EAAE,eAAe,EAAK,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI;QACtG,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE;IAC9B,EAAE,OAAO,EAAE,gBAAgB,EAAQ,QAAQ,EAAE,cAAc,EAAM,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI;QACtG,OAAO,EAAE,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,EAAE;CACrD,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rudderjs/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"reflect-metadata": "^0.2.2",
|
|
48
48
|
"zod": "^4.0.0",
|
|
49
49
|
"@rudderjs/console": "^1.4.0",
|
|
50
|
-
"@rudderjs/contracts": "^1.13.0",
|
|
51
50
|
"@rudderjs/router": "^1.8.0",
|
|
51
|
+
"@rudderjs/contracts": "^1.14.0",
|
|
52
52
|
"@rudderjs/support": "^1.6.0"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|