@smplkit/sdk 1.3.39 → 1.3.40
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 +148 -27
- package/dist/index.cjs +163 -70
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +149 -42
- package/dist/index.d.ts +149 -42
- package/dist/index.js +160 -70
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ The official TypeScript SDK for [smplkit](https://www.smplkit.com) — simple ap
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install smplkit
|
|
10
|
+
npm install @smplkit/sdk
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## Requirements
|
|
@@ -17,7 +17,7 @@ npm install smplkit-sdk
|
|
|
17
17
|
## Quick Start
|
|
18
18
|
|
|
19
19
|
```typescript
|
|
20
|
-
import { SmplClient } from "smplkit
|
|
20
|
+
import { SmplClient } from "@smplkit/sdk";
|
|
21
21
|
|
|
22
22
|
// Option 1: Explicit API key
|
|
23
23
|
const client = new SmplClient({ apiKey: "sk_api_..." });
|
|
@@ -32,29 +32,6 @@ const client2 = new SmplClient();
|
|
|
32
32
|
const client3 = new SmplClient();
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
```typescript
|
|
36
|
-
import { SmplClient } from "smplkit-sdk";
|
|
37
|
-
|
|
38
|
-
const client = new SmplClient({ apiKey: "sk_api_..." });
|
|
39
|
-
|
|
40
|
-
// Get a config by key
|
|
41
|
-
const config = await client.config.getByKey("user_service");
|
|
42
|
-
|
|
43
|
-
// List all configs
|
|
44
|
-
const configs = await client.config.list();
|
|
45
|
-
|
|
46
|
-
// Create a config
|
|
47
|
-
const newConfig = await client.config.create({
|
|
48
|
-
name: "My Service",
|
|
49
|
-
key: "my_service",
|
|
50
|
-
description: "Configuration for my service",
|
|
51
|
-
values: { timeout: 30, retries: 3 },
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
// Delete a config
|
|
55
|
-
await client.config.delete(newConfig.id);
|
|
56
|
-
```
|
|
57
|
-
|
|
58
35
|
## Configuration
|
|
59
36
|
|
|
60
37
|
The API key is resolved using the following priority:
|
|
@@ -79,15 +56,159 @@ const client = new SmplClient({
|
|
|
79
56
|
});
|
|
80
57
|
```
|
|
81
58
|
|
|
59
|
+
## Config
|
|
60
|
+
|
|
61
|
+
### Runtime (resolve config values)
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// Resolve config values for a service
|
|
65
|
+
const config = await client.config.get("my-service");
|
|
66
|
+
console.log(config.getString("timeout"));
|
|
67
|
+
console.log(config.getNumber("retries"));
|
|
68
|
+
|
|
69
|
+
// Subscribe to live updates
|
|
70
|
+
client.config.subscribe("my-service", (config) => {
|
|
71
|
+
console.log("Config updated:", config.getString("timeout"));
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Management (CRUD)
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// Create a config
|
|
79
|
+
const cfg = client.config.management.new("my-service", {
|
|
80
|
+
name: "My Service",
|
|
81
|
+
description: "Configuration for my service",
|
|
82
|
+
});
|
|
83
|
+
await cfg.save();
|
|
84
|
+
|
|
85
|
+
// List configs
|
|
86
|
+
const configs = await client.config.management.list();
|
|
87
|
+
|
|
88
|
+
// Get a config by id
|
|
89
|
+
const fetched = await client.config.management.get("my-service");
|
|
90
|
+
|
|
91
|
+
// Delete a config
|
|
92
|
+
await client.config.management.delete("my-service");
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Flags
|
|
96
|
+
|
|
97
|
+
### Runtime (evaluate flags)
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
import { SmplClient, Rule } from "@smplkit/sdk";
|
|
101
|
+
|
|
102
|
+
const client = new SmplClient({ environment: "production", service: "my-service" });
|
|
103
|
+
|
|
104
|
+
// Declare a flag
|
|
105
|
+
const checkoutFlag = client.flags.booleanFlag("checkout-v2", { default: false });
|
|
106
|
+
|
|
107
|
+
// Start the client (connects and fetches flags)
|
|
108
|
+
await client.flags.initialize();
|
|
109
|
+
|
|
110
|
+
// Evaluate with context
|
|
111
|
+
const enabled = await checkoutFlag.get({ user: { plan: "enterprise" } });
|
|
112
|
+
console.log("checkout-v2:", enabled);
|
|
113
|
+
|
|
114
|
+
client.close();
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Management (CRUD)
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
// Create flags
|
|
121
|
+
const boolFlag = client.flags.management.newBooleanFlag("checkout-v2", {
|
|
122
|
+
default: false,
|
|
123
|
+
description: "Controls rollout of the new checkout experience.",
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Add targeting rules
|
|
127
|
+
boolFlag.addRule(
|
|
128
|
+
new Rule("Enable for enterprise users")
|
|
129
|
+
.environment("production")
|
|
130
|
+
.when("user.plan", "==", "enterprise")
|
|
131
|
+
.serve(true)
|
|
132
|
+
.build(),
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
// Configure environments
|
|
136
|
+
boolFlag.setEnvironmentEnabled("production", true);
|
|
137
|
+
boolFlag.setEnvironmentDefault("production", false);
|
|
138
|
+
|
|
139
|
+
await boolFlag.save();
|
|
140
|
+
|
|
141
|
+
// Other factory methods
|
|
142
|
+
const strFlag = client.flags.management.newStringFlag("banner-color", {
|
|
143
|
+
default: "red",
|
|
144
|
+
values: [{ name: "Red", value: "red" }, { name: "Blue", value: "blue" }],
|
|
145
|
+
});
|
|
146
|
+
const numFlag = client.flags.management.newNumberFlag("max-retries", { default: 3 });
|
|
147
|
+
const jsonFlag = client.flags.management.newJsonFlag("ui-theme", {
|
|
148
|
+
default: { mode: "light" },
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// List / get / delete
|
|
152
|
+
const flags = await client.flags.management.list();
|
|
153
|
+
const flag = await client.flags.management.get("checkout-v2");
|
|
154
|
+
await client.flags.management.delete("checkout-v2");
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Logging
|
|
158
|
+
|
|
159
|
+
### Runtime (live log level management)
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
const client = new SmplClient({ environment: "production", service: "my-service" });
|
|
163
|
+
|
|
164
|
+
// Register an adapter for your logging library
|
|
165
|
+
client.logging.registerAdapter(myAdapter);
|
|
166
|
+
|
|
167
|
+
// Start the logging runtime (connects and fetches log levels)
|
|
168
|
+
await client.logging.start();
|
|
169
|
+
|
|
170
|
+
client.logging.onChange((loggers) => {
|
|
171
|
+
console.log("Log levels updated:", loggers.map((l) => `${l.id}=${l.level}`));
|
|
172
|
+
});
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Management (CRUD)
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// Create a logger
|
|
179
|
+
const logger = client.logging.management.new("sqlalchemy.engine", { managed: true });
|
|
180
|
+
logger.setLevel(LogLevel.WARN);
|
|
181
|
+
logger.setEnvironmentLevel("production", LogLevel.ERROR);
|
|
182
|
+
await logger.save();
|
|
183
|
+
|
|
184
|
+
// Create a log group
|
|
185
|
+
const group = client.logging.management.newGroup("sql", { name: "SQL Loggers" });
|
|
186
|
+
group.setLevel(LogLevel.WARN);
|
|
187
|
+
await group.save();
|
|
188
|
+
|
|
189
|
+
// Assign logger to group
|
|
190
|
+
logger.group = group.id;
|
|
191
|
+
await logger.save();
|
|
192
|
+
|
|
193
|
+
// List / get / delete
|
|
194
|
+
const loggers = await client.logging.management.list();
|
|
195
|
+
const fetched = await client.logging.management.get("Sqlalchemy.Engine");
|
|
196
|
+
await client.logging.management.delete("Sqlalchemy.Engine");
|
|
197
|
+
|
|
198
|
+
const groups = await client.logging.management.listGroups();
|
|
199
|
+
const fetchedGroup = await client.logging.management.getGroup(group.id);
|
|
200
|
+
await client.logging.management.deleteGroup(group.id);
|
|
201
|
+
```
|
|
202
|
+
|
|
82
203
|
## Error Handling
|
|
83
204
|
|
|
84
205
|
All SDK errors extend `SmplError`:
|
|
85
206
|
|
|
86
207
|
```typescript
|
|
87
|
-
import { SmplError, SmplNotFoundError } from "smplkit
|
|
208
|
+
import { SmplError, SmplNotFoundError } from "@smplkit/sdk";
|
|
88
209
|
|
|
89
210
|
try {
|
|
90
|
-
const
|
|
211
|
+
const flag = await client.flags.management.get("nonexistent");
|
|
91
212
|
} catch (err) {
|
|
92
213
|
if (err instanceof SmplNotFoundError) {
|
|
93
214
|
console.log("Not found:", err.message);
|
package/dist/index.cjs
CHANGED
|
@@ -16624,17 +16624,20 @@ __export(index_exports, {
|
|
|
16624
16624
|
BooleanFlag: () => BooleanFlag,
|
|
16625
16625
|
Config: () => Config,
|
|
16626
16626
|
ConfigClient: () => ConfigClient,
|
|
16627
|
+
ConfigManagement: () => ConfigManagement,
|
|
16627
16628
|
Context: () => Context,
|
|
16628
16629
|
Flag: () => Flag,
|
|
16629
16630
|
FlagChangeEvent: () => FlagChangeEvent,
|
|
16630
16631
|
FlagStats: () => FlagStats,
|
|
16631
16632
|
FlagsClient: () => FlagsClient,
|
|
16633
|
+
FlagsManagement: () => FlagsManagement,
|
|
16632
16634
|
JsonFlag: () => JsonFlag,
|
|
16633
16635
|
LiveConfigProxy: () => LiveConfigProxy,
|
|
16634
16636
|
LogGroup: () => LogGroup,
|
|
16635
16637
|
LogLevel: () => LogLevel,
|
|
16636
16638
|
Logger: () => Logger,
|
|
16637
16639
|
LoggingClient: () => LoggingClient,
|
|
16640
|
+
LoggingManagement: () => LoggingManagement,
|
|
16638
16641
|
NumberFlag: () => NumberFlag,
|
|
16639
16642
|
PinoAdapter: () => PinoAdapter,
|
|
16640
16643
|
Rule: () => Rule,
|
|
@@ -17043,6 +17046,27 @@ function buildRequestBody(options) {
|
|
|
17043
17046
|
}
|
|
17044
17047
|
};
|
|
17045
17048
|
}
|
|
17049
|
+
var ConfigManagement = class {
|
|
17050
|
+
constructor(_client) {
|
|
17051
|
+
this._client = _client;
|
|
17052
|
+
}
|
|
17053
|
+
/** Create an unsaved config. Call `.save()` to persist. */
|
|
17054
|
+
new(id, options) {
|
|
17055
|
+
return this._client._mgNew(id, options);
|
|
17056
|
+
}
|
|
17057
|
+
/** Fetch a config by id. */
|
|
17058
|
+
async get(id) {
|
|
17059
|
+
return this._client._getById(id);
|
|
17060
|
+
}
|
|
17061
|
+
/** List all configs. */
|
|
17062
|
+
async list() {
|
|
17063
|
+
return this._client._mgList();
|
|
17064
|
+
}
|
|
17065
|
+
/** Delete a config by id. */
|
|
17066
|
+
async delete(id) {
|
|
17067
|
+
return this._client._mgDelete(id);
|
|
17068
|
+
}
|
|
17069
|
+
};
|
|
17046
17070
|
var ConfigClient = class {
|
|
17047
17071
|
/** @internal */
|
|
17048
17072
|
_apiKey;
|
|
@@ -17054,6 +17078,8 @@ var ConfigClient = class {
|
|
|
17054
17078
|
_getSharedWs;
|
|
17055
17079
|
/** @internal — set by SmplClient after construction. */
|
|
17056
17080
|
_parent = null;
|
|
17081
|
+
/** Management API — CRUD operations on Config models. */
|
|
17082
|
+
management;
|
|
17057
17083
|
_configCache = {};
|
|
17058
17084
|
_initialized = false;
|
|
17059
17085
|
_listeners = [];
|
|
@@ -17082,12 +17108,13 @@ var ConfigClient = class {
|
|
|
17082
17108
|
}
|
|
17083
17109
|
}
|
|
17084
17110
|
});
|
|
17111
|
+
this.management = new ConfigManagement(this);
|
|
17085
17112
|
}
|
|
17086
17113
|
// ------------------------------------------------------------------
|
|
17087
|
-
// Management:
|
|
17114
|
+
// Management: internal implementations (delegated from ConfigManagement)
|
|
17088
17115
|
// ------------------------------------------------------------------
|
|
17089
|
-
/**
|
|
17090
|
-
|
|
17116
|
+
/** @internal */
|
|
17117
|
+
_mgNew(id, options) {
|
|
17091
17118
|
return new Config(this, {
|
|
17092
17119
|
id,
|
|
17093
17120
|
name: options?.name ?? keyToDisplayName(id),
|
|
@@ -17099,15 +17126,8 @@ var ConfigClient = class {
|
|
|
17099
17126
|
updatedAt: null
|
|
17100
17127
|
});
|
|
17101
17128
|
}
|
|
17102
|
-
|
|
17103
|
-
|
|
17104
|
-
// ------------------------------------------------------------------
|
|
17105
|
-
/** Fetch a config by id. */
|
|
17106
|
-
async get(id) {
|
|
17107
|
-
return this._getById(id);
|
|
17108
|
-
}
|
|
17109
|
-
/** List all configs. */
|
|
17110
|
-
async list() {
|
|
17129
|
+
/** @internal */
|
|
17130
|
+
async _mgList() {
|
|
17111
17131
|
let data;
|
|
17112
17132
|
try {
|
|
17113
17133
|
const result = await this._http.GET("/api/v1/configs", {});
|
|
@@ -17119,8 +17139,8 @@ var ConfigClient = class {
|
|
|
17119
17139
|
if (!data) return [];
|
|
17120
17140
|
return data.data.map((r) => resourceToConfig(r, this));
|
|
17121
17141
|
}
|
|
17122
|
-
/**
|
|
17123
|
-
async
|
|
17142
|
+
/** @internal */
|
|
17143
|
+
async _mgDelete(id) {
|
|
17124
17144
|
try {
|
|
17125
17145
|
const result = await this._http.DELETE("/api/v1/configs/{id}", {
|
|
17126
17146
|
params: { path: { id } }
|
|
@@ -17200,12 +17220,12 @@ var ConfigClient = class {
|
|
|
17200
17220
|
// Runtime: resolve and subscribe
|
|
17201
17221
|
// ------------------------------------------------------------------
|
|
17202
17222
|
/**
|
|
17203
|
-
*
|
|
17223
|
+
* Get a config's resolved values for the current environment.
|
|
17204
17224
|
*
|
|
17205
17225
|
* Returns the resolved key-value pairs for the given config.
|
|
17206
17226
|
* Optionally pass a model class to map the resolved values.
|
|
17207
17227
|
*/
|
|
17208
|
-
async
|
|
17228
|
+
async get(id, model) {
|
|
17209
17229
|
await this._ensureInitialized();
|
|
17210
17230
|
const values = this._configCache[id];
|
|
17211
17231
|
if (values === void 0) {
|
|
@@ -17273,13 +17293,13 @@ var ConfigClient = class {
|
|
|
17273
17293
|
*/
|
|
17274
17294
|
async refresh() {
|
|
17275
17295
|
if (!this._initialized) {
|
|
17276
|
-
throw new SmplError("Config not initialized. Call
|
|
17296
|
+
throw new SmplError("Config not initialized. Call get() or subscribe() first.");
|
|
17277
17297
|
}
|
|
17278
17298
|
const environment = this._parent?._environment;
|
|
17279
17299
|
if (!environment) {
|
|
17280
17300
|
throw new SmplError("No environment set.");
|
|
17281
17301
|
}
|
|
17282
|
-
const configs = await this.list();
|
|
17302
|
+
const configs = await this.management.list();
|
|
17283
17303
|
const newCache = {};
|
|
17284
17304
|
for (const cfg of configs) {
|
|
17285
17305
|
const chain = await cfg._buildChain(configs);
|
|
@@ -17299,7 +17319,7 @@ var ConfigClient = class {
|
|
|
17299
17319
|
if (!environment) {
|
|
17300
17320
|
throw new SmplError("No environment set. Ensure SmplClient is configured.");
|
|
17301
17321
|
}
|
|
17302
|
-
const configs = await this.list();
|
|
17322
|
+
const configs = await this.management.list();
|
|
17303
17323
|
const cache = {};
|
|
17304
17324
|
for (const cfg of configs) {
|
|
17305
17325
|
const chain = await cfg._buildChain(configs);
|
|
@@ -17315,7 +17335,7 @@ var ConfigClient = class {
|
|
|
17315
17335
|
/** @internal — called by SmplClient for backward compat. */
|
|
17316
17336
|
async _connectInternal(environment) {
|
|
17317
17337
|
if (this._initialized) return;
|
|
17318
|
-
const configs = await this.list();
|
|
17338
|
+
const configs = await this.management.list();
|
|
17319
17339
|
const cache = {};
|
|
17320
17340
|
for (const cfg of configs) {
|
|
17321
17341
|
const chain = await cfg._buildChain(configs);
|
|
@@ -17694,6 +17714,39 @@ var ContextRegistrationBuffer = class {
|
|
|
17694
17714
|
return this._pending.length;
|
|
17695
17715
|
}
|
|
17696
17716
|
};
|
|
17717
|
+
var FlagsManagement = class {
|
|
17718
|
+
constructor(_client) {
|
|
17719
|
+
this._client = _client;
|
|
17720
|
+
}
|
|
17721
|
+
/** Create an unsaved boolean flag. Call `.save()` to persist. */
|
|
17722
|
+
newBooleanFlag(id, options) {
|
|
17723
|
+
return this._client._mgNewBooleanFlag(id, options);
|
|
17724
|
+
}
|
|
17725
|
+
/** Create an unsaved string flag. Call `.save()` to persist. */
|
|
17726
|
+
newStringFlag(id, options) {
|
|
17727
|
+
return this._client._mgNewStringFlag(id, options);
|
|
17728
|
+
}
|
|
17729
|
+
/** Create an unsaved number flag. Call `.save()` to persist. */
|
|
17730
|
+
newNumberFlag(id, options) {
|
|
17731
|
+
return this._client._mgNewNumberFlag(id, options);
|
|
17732
|
+
}
|
|
17733
|
+
/** Create an unsaved JSON flag. Call `.save()` to persist. */
|
|
17734
|
+
newJsonFlag(id, options) {
|
|
17735
|
+
return this._client._mgNewJsonFlag(id, options);
|
|
17736
|
+
}
|
|
17737
|
+
/** Fetch a flag by id. */
|
|
17738
|
+
async get(id) {
|
|
17739
|
+
return this._client._mgGet(id);
|
|
17740
|
+
}
|
|
17741
|
+
/** List all flags. */
|
|
17742
|
+
async list() {
|
|
17743
|
+
return this._client._mgList();
|
|
17744
|
+
}
|
|
17745
|
+
/** Delete a flag by id. */
|
|
17746
|
+
async delete(id) {
|
|
17747
|
+
return this._client._mgDelete(id);
|
|
17748
|
+
}
|
|
17749
|
+
};
|
|
17697
17750
|
var FlagsClient = class {
|
|
17698
17751
|
/** @internal */
|
|
17699
17752
|
_apiKey;
|
|
@@ -17718,6 +17771,8 @@ var FlagsClient = class {
|
|
|
17718
17771
|
_ensureWs;
|
|
17719
17772
|
/** @internal — set by SmplClient after construction. */
|
|
17720
17773
|
_parent = null;
|
|
17774
|
+
/** Management API — CRUD operations on Flag models. */
|
|
17775
|
+
management;
|
|
17721
17776
|
/** @internal */
|
|
17722
17777
|
constructor(apiKey, ensureWs, timeout) {
|
|
17723
17778
|
this._apiKey = apiKey;
|
|
@@ -17753,12 +17808,13 @@ var FlagsClient = class {
|
|
|
17753
17808
|
},
|
|
17754
17809
|
fetch: fetchWithTimeout
|
|
17755
17810
|
});
|
|
17811
|
+
this.management = new FlagsManagement(this);
|
|
17756
17812
|
}
|
|
17757
17813
|
// ------------------------------------------------------------------
|
|
17758
|
-
// Management:
|
|
17814
|
+
// Management: internal implementations (delegated from FlagsManagement)
|
|
17759
17815
|
// ------------------------------------------------------------------
|
|
17760
|
-
/**
|
|
17761
|
-
|
|
17816
|
+
/** @internal */
|
|
17817
|
+
_mgNewBooleanFlag(id, options) {
|
|
17762
17818
|
return new BooleanFlag(this, {
|
|
17763
17819
|
id,
|
|
17764
17820
|
name: options.name ?? keyToDisplayName(id),
|
|
@@ -17774,8 +17830,8 @@ var FlagsClient = class {
|
|
|
17774
17830
|
updatedAt: null
|
|
17775
17831
|
});
|
|
17776
17832
|
}
|
|
17777
|
-
/**
|
|
17778
|
-
|
|
17833
|
+
/** @internal */
|
|
17834
|
+
_mgNewStringFlag(id, options) {
|
|
17779
17835
|
return new StringFlag(this, {
|
|
17780
17836
|
id,
|
|
17781
17837
|
name: options.name ?? keyToDisplayName(id),
|
|
@@ -17788,8 +17844,8 @@ var FlagsClient = class {
|
|
|
17788
17844
|
updatedAt: null
|
|
17789
17845
|
});
|
|
17790
17846
|
}
|
|
17791
|
-
/**
|
|
17792
|
-
|
|
17847
|
+
/** @internal */
|
|
17848
|
+
_mgNewNumberFlag(id, options) {
|
|
17793
17849
|
return new NumberFlag(this, {
|
|
17794
17850
|
id,
|
|
17795
17851
|
name: options.name ?? keyToDisplayName(id),
|
|
@@ -17802,8 +17858,8 @@ var FlagsClient = class {
|
|
|
17802
17858
|
updatedAt: null
|
|
17803
17859
|
});
|
|
17804
17860
|
}
|
|
17805
|
-
/**
|
|
17806
|
-
|
|
17861
|
+
/** @internal */
|
|
17862
|
+
_mgNewJsonFlag(id, options) {
|
|
17807
17863
|
return new JsonFlag(this, {
|
|
17808
17864
|
id,
|
|
17809
17865
|
name: options.name ?? keyToDisplayName(id),
|
|
@@ -17816,11 +17872,8 @@ var FlagsClient = class {
|
|
|
17816
17872
|
updatedAt: null
|
|
17817
17873
|
});
|
|
17818
17874
|
}
|
|
17819
|
-
|
|
17820
|
-
|
|
17821
|
-
// ------------------------------------------------------------------
|
|
17822
|
-
/** Fetch a flag by id. */
|
|
17823
|
-
async get(id) {
|
|
17875
|
+
/** @internal */
|
|
17876
|
+
async _mgGet(id) {
|
|
17824
17877
|
let data;
|
|
17825
17878
|
try {
|
|
17826
17879
|
const result = await this._http.GET("/api/v1/flags/{id}", {
|
|
@@ -17837,8 +17890,8 @@ var FlagsClient = class {
|
|
|
17837
17890
|
}
|
|
17838
17891
|
return this._resourceToModel(data.data);
|
|
17839
17892
|
}
|
|
17840
|
-
/**
|
|
17841
|
-
async
|
|
17893
|
+
/** @internal */
|
|
17894
|
+
async _mgList() {
|
|
17842
17895
|
let data;
|
|
17843
17896
|
try {
|
|
17844
17897
|
const result = await this._http.GET("/api/v1/flags", {});
|
|
@@ -17850,8 +17903,8 @@ var FlagsClient = class {
|
|
|
17850
17903
|
if (!data) return [];
|
|
17851
17904
|
return data.data.map((r) => this._resourceToModel(r));
|
|
17852
17905
|
}
|
|
17853
|
-
/**
|
|
17854
|
-
async
|
|
17906
|
+
/** @internal */
|
|
17907
|
+
async _mgDelete(id) {
|
|
17855
17908
|
try {
|
|
17856
17909
|
const result = await this._http.DELETE("/api/v1/flags/{id}", {
|
|
17857
17910
|
params: { path: { id } }
|
|
@@ -18498,6 +18551,43 @@ function wrapFetchError3(err) {
|
|
|
18498
18551
|
`Request failed: ${err instanceof Error ? err.message : String(err)}`
|
|
18499
18552
|
);
|
|
18500
18553
|
}
|
|
18554
|
+
var LoggingManagement = class {
|
|
18555
|
+
constructor(_client) {
|
|
18556
|
+
this._client = _client;
|
|
18557
|
+
}
|
|
18558
|
+
/** Create an unsaved logger. Call `.save()` to persist. */
|
|
18559
|
+
new(id, options) {
|
|
18560
|
+
return this._client._mgNew(id, options);
|
|
18561
|
+
}
|
|
18562
|
+
/** Fetch a logger by id. */
|
|
18563
|
+
async get(id) {
|
|
18564
|
+
return this._client._mgGet(id);
|
|
18565
|
+
}
|
|
18566
|
+
/** List all loggers. */
|
|
18567
|
+
async list() {
|
|
18568
|
+
return this._client._mgList();
|
|
18569
|
+
}
|
|
18570
|
+
/** Delete a logger by id. */
|
|
18571
|
+
async delete(id) {
|
|
18572
|
+
return this._client._mgDelete(id);
|
|
18573
|
+
}
|
|
18574
|
+
/** Create an unsaved log group. Call `.save()` to persist. */
|
|
18575
|
+
newGroup(id, options) {
|
|
18576
|
+
return this._client._mgNewGroup(id, options);
|
|
18577
|
+
}
|
|
18578
|
+
/** Fetch a log group by id. */
|
|
18579
|
+
async getGroup(id) {
|
|
18580
|
+
return this._client._mgGetGroup(id);
|
|
18581
|
+
}
|
|
18582
|
+
/** List all log groups. */
|
|
18583
|
+
async listGroups() {
|
|
18584
|
+
return this._client._mgListGroups();
|
|
18585
|
+
}
|
|
18586
|
+
/** Delete a log group by id. */
|
|
18587
|
+
async deleteGroup(id) {
|
|
18588
|
+
return this._client._mgDeleteGroup(id);
|
|
18589
|
+
}
|
|
18590
|
+
};
|
|
18501
18591
|
var LoggingClient = class {
|
|
18502
18592
|
/** @internal */
|
|
18503
18593
|
_apiKey;
|
|
@@ -18507,6 +18597,8 @@ var LoggingClient = class {
|
|
|
18507
18597
|
_http;
|
|
18508
18598
|
/** @internal — set by SmplClient after construction. */
|
|
18509
18599
|
_parent = null;
|
|
18600
|
+
/** Management API — CRUD operations on Logger and LogGroup models. */
|
|
18601
|
+
management;
|
|
18510
18602
|
_ensureWs;
|
|
18511
18603
|
_wsManager = null;
|
|
18512
18604
|
_started = false;
|
|
@@ -18540,6 +18632,7 @@ var LoggingClient = class {
|
|
|
18540
18632
|
}
|
|
18541
18633
|
}
|
|
18542
18634
|
});
|
|
18635
|
+
this.management = new LoggingManagement(this);
|
|
18543
18636
|
}
|
|
18544
18637
|
// ------------------------------------------------------------------
|
|
18545
18638
|
// Adapter registration
|
|
@@ -18558,10 +18651,10 @@ var LoggingClient = class {
|
|
|
18558
18651
|
this._adapters.push(adapter);
|
|
18559
18652
|
}
|
|
18560
18653
|
// ------------------------------------------------------------------
|
|
18561
|
-
// Management:
|
|
18654
|
+
// Management: internal implementations (delegated from LoggingManagement)
|
|
18562
18655
|
// ------------------------------------------------------------------
|
|
18563
|
-
/**
|
|
18564
|
-
|
|
18656
|
+
/** @internal */
|
|
18657
|
+
_mgNew(id, options) {
|
|
18565
18658
|
return new Logger(this, {
|
|
18566
18659
|
id,
|
|
18567
18660
|
name: options?.name ?? keyToDisplayName(id),
|
|
@@ -18574,11 +18667,8 @@ var LoggingClient = class {
|
|
|
18574
18667
|
updatedAt: null
|
|
18575
18668
|
});
|
|
18576
18669
|
}
|
|
18577
|
-
|
|
18578
|
-
|
|
18579
|
-
// ------------------------------------------------------------------
|
|
18580
|
-
/** Fetch a logger by id. */
|
|
18581
|
-
async get(id) {
|
|
18670
|
+
/** @internal */
|
|
18671
|
+
async _mgGet(id) {
|
|
18582
18672
|
let data;
|
|
18583
18673
|
try {
|
|
18584
18674
|
const result = await this._http.GET("/api/v1/loggers/{id}", {
|
|
@@ -18595,8 +18685,8 @@ var LoggingClient = class {
|
|
|
18595
18685
|
}
|
|
18596
18686
|
return this._loggerToModel(data.data);
|
|
18597
18687
|
}
|
|
18598
|
-
/**
|
|
18599
|
-
async
|
|
18688
|
+
/** @internal */
|
|
18689
|
+
async _mgList() {
|
|
18600
18690
|
let data;
|
|
18601
18691
|
try {
|
|
18602
18692
|
const result = await this._http.GET("/api/v1/loggers", {});
|
|
@@ -18608,8 +18698,8 @@ var LoggingClient = class {
|
|
|
18608
18698
|
if (!data) return [];
|
|
18609
18699
|
return data.data.map((r) => this._loggerToModel(r));
|
|
18610
18700
|
}
|
|
18611
|
-
/**
|
|
18612
|
-
async
|
|
18701
|
+
/** @internal */
|
|
18702
|
+
async _mgDelete(id) {
|
|
18613
18703
|
try {
|
|
18614
18704
|
const result = await this._http.DELETE("/api/v1/loggers/{id}", {
|
|
18615
18705
|
params: { path: { id } }
|
|
@@ -18620,11 +18710,8 @@ var LoggingClient = class {
|
|
|
18620
18710
|
wrapFetchError3(err);
|
|
18621
18711
|
}
|
|
18622
18712
|
}
|
|
18623
|
-
|
|
18624
|
-
|
|
18625
|
-
// ------------------------------------------------------------------
|
|
18626
|
-
/** Create an unsaved log group. Call `.save()` to persist. */
|
|
18627
|
-
newGroup(id, options) {
|
|
18713
|
+
/** @internal */
|
|
18714
|
+
_mgNewGroup(id, options) {
|
|
18628
18715
|
return new LogGroup(this, {
|
|
18629
18716
|
id,
|
|
18630
18717
|
name: options?.name ?? keyToDisplayName(id),
|
|
@@ -18635,20 +18722,17 @@ var LoggingClient = class {
|
|
|
18635
18722
|
updatedAt: null
|
|
18636
18723
|
});
|
|
18637
18724
|
}
|
|
18638
|
-
|
|
18639
|
-
|
|
18640
|
-
|
|
18641
|
-
/** Fetch a log group by id. */
|
|
18642
|
-
async getGroup(id) {
|
|
18643
|
-
const groups = await this.listGroups();
|
|
18725
|
+
/** @internal */
|
|
18726
|
+
async _mgGetGroup(id) {
|
|
18727
|
+
const groups = await this.management.listGroups();
|
|
18644
18728
|
const match = groups.find((g) => g.id === id);
|
|
18645
18729
|
if (!match) {
|
|
18646
18730
|
throw new SmplNotFoundError(`LogGroup with id '${id}' not found`);
|
|
18647
18731
|
}
|
|
18648
18732
|
return match;
|
|
18649
18733
|
}
|
|
18650
|
-
/**
|
|
18651
|
-
async
|
|
18734
|
+
/** @internal */
|
|
18735
|
+
async _mgListGroups() {
|
|
18652
18736
|
let data;
|
|
18653
18737
|
try {
|
|
18654
18738
|
const result = await this._http.GET("/api/v1/log_groups", {});
|
|
@@ -18661,9 +18745,9 @@ var LoggingClient = class {
|
|
|
18661
18745
|
if (!data) return [];
|
|
18662
18746
|
return data.data.map((r) => this._groupToModel(r));
|
|
18663
18747
|
}
|
|
18664
|
-
/**
|
|
18665
|
-
async
|
|
18666
|
-
const group = await this.getGroup(id);
|
|
18748
|
+
/** @internal */
|
|
18749
|
+
async _mgDeleteGroup(id) {
|
|
18750
|
+
const group = await this.management.getGroup(id);
|
|
18667
18751
|
try {
|
|
18668
18752
|
const result = await this._http.DELETE("/api/v1/log_groups/{id}", {
|
|
18669
18753
|
params: { path: { id: group.id } }
|
|
@@ -18805,14 +18889,20 @@ var LoggingClient = class {
|
|
|
18805
18889
|
}
|
|
18806
18890
|
for (const { name, level } of discovered) {
|
|
18807
18891
|
try {
|
|
18808
|
-
const logger = this.new(name, { managed: true });
|
|
18892
|
+
const logger = this.management.new(name, { managed: true });
|
|
18809
18893
|
logger.setLevel(level);
|
|
18810
18894
|
await logger.save();
|
|
18811
|
-
} catch {
|
|
18895
|
+
} catch (err) {
|
|
18896
|
+
console.warn(
|
|
18897
|
+
`[smplkit] Failed to register logger "${name}": ${err instanceof Error ? err.message : String(err)}`
|
|
18898
|
+
);
|
|
18812
18899
|
}
|
|
18813
18900
|
}
|
|
18814
18901
|
try {
|
|
18815
|
-
const [serverLoggers] = await Promise.all([
|
|
18902
|
+
const [serverLoggers] = await Promise.all([
|
|
18903
|
+
this.management.list(),
|
|
18904
|
+
this.management.listGroups()
|
|
18905
|
+
]);
|
|
18816
18906
|
this._applyLevels(serverLoggers);
|
|
18817
18907
|
} catch {
|
|
18818
18908
|
}
|
|
@@ -18911,7 +19001,7 @@ var LoggingClient = class {
|
|
|
18911
19001
|
}
|
|
18912
19002
|
/** Called by adapter hooks when a new logger is created in the framework. */
|
|
18913
19003
|
_onAdapterNewLogger(_name, _level) {
|
|
18914
|
-
const logger = this.new(_name, { managed: true });
|
|
19004
|
+
const logger = this.management.new(_name, { managed: true });
|
|
18915
19005
|
logger.setLevel(_level);
|
|
18916
19006
|
logger.save().catch(() => {
|
|
18917
19007
|
});
|
|
@@ -19728,17 +19818,20 @@ var PinoAdapter = class {
|
|
|
19728
19818
|
BooleanFlag,
|
|
19729
19819
|
Config,
|
|
19730
19820
|
ConfigClient,
|
|
19821
|
+
ConfigManagement,
|
|
19731
19822
|
Context,
|
|
19732
19823
|
Flag,
|
|
19733
19824
|
FlagChangeEvent,
|
|
19734
19825
|
FlagStats,
|
|
19735
19826
|
FlagsClient,
|
|
19827
|
+
FlagsManagement,
|
|
19736
19828
|
JsonFlag,
|
|
19737
19829
|
LiveConfigProxy,
|
|
19738
19830
|
LogGroup,
|
|
19739
19831
|
LogLevel,
|
|
19740
19832
|
Logger,
|
|
19741
19833
|
LoggingClient,
|
|
19834
|
+
LoggingManagement,
|
|
19742
19835
|
NumberFlag,
|
|
19743
19836
|
PinoAdapter,
|
|
19744
19837
|
Rule,
|