@k8ts/metadata 0.7.3 → 0.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/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/input/dict-input.d.ts +4 -4
- package/dist/input/dict-input.d.ts.map +1 -1
- package/dist/input/parse-dict.js +2 -2
- package/dist/input/parse-dict.js.map +1 -1
- package/dist/key/index.d.ts +1 -1
- package/dist/key/index.d.ts.map +1 -1
- package/dist/key/index.js +3 -3
- package/dist/key/index.js.map +1 -1
- package/dist/key/parse-key.d.ts +4 -4
- package/dist/key/parse-key.d.ts.map +1 -1
- package/dist/key/parse-key.js +5 -5
- package/dist/key/parse-key.js.map +1 -1
- package/dist/key/repr.d.ts +18 -12
- package/dist/key/repr.d.ts.map +1 -1
- package/dist/key/repr.js +42 -26
- package/dist/key/repr.js.map +1 -1
- package/dist/key/types.d.ts +8 -6
- package/dist/key/types.d.ts.map +1 -1
- package/dist/key/types.js +4 -1
- package/dist/key/types.js.map +1 -1
- package/dist/meta.d.ts +263 -29
- package/dist/meta.d.ts.map +1 -1
- package/dist/meta.js +164 -73
- package/dist/meta.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +2 -1
- package/src/input/dict-input.ts +4 -4
- package/src/input/parse-dict.ts +3 -3
- package/src/key/index.ts +1 -1
- package/src/key/parse-key.ts +6 -6
- package/src/key/repr.ts +47 -22
- package/src/key/types.ts +8 -7
- package/src/meta.ts +305 -94
package/dist/meta.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { InputMeta, MetaInputParts } from "./input/dict-input";
|
|
2
|
-
import {
|
|
2
|
+
import { MetadataKey } from "./key/repr";
|
|
3
3
|
import { Key } from "./key/types";
|
|
4
4
|
export type Meta = Meta.Meta;
|
|
5
|
-
export type MutableMeta = Meta.MutableMeta;
|
|
6
5
|
declare const MetaMarker: unique symbol;
|
|
7
6
|
export interface MetaLike {
|
|
8
7
|
readonly [MetaMarker]: true;
|
|
@@ -11,56 +10,291 @@ export declare namespace Meta {
|
|
|
11
10
|
function _checkNameValue(what: string, v: string): void;
|
|
12
11
|
function _checkValue(key: string, v: string): void;
|
|
13
12
|
type Input = InputMeta;
|
|
14
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Mutable storage for k8s metadata. K8s metadata includes labels, annotations, and core fields.
|
|
15
|
+
* These are addressed using `CharPrefix`.
|
|
16
|
+
*
|
|
17
|
+
* - **Labels**: `%key` → `metadata.labels.key`
|
|
18
|
+
* - **Annotations**: `^key` → `metadata.annotations.key`
|
|
19
|
+
* - **Comments**: `#key` → Build-time metadata, not manifested in k8s objects.
|
|
20
|
+
* - **Core metadata**: `key` → `metadata.key` (e.g., `name`, `namespace`, etc.)
|
|
21
|
+
*
|
|
22
|
+
* In addition, you can address different metadata keys under the same domain using a
|
|
23
|
+
* `DomainKey`, of the form `example.com/`. When using a `DomainKey`, you use a `CharPrefix` on
|
|
24
|
+
* the inner keys.
|
|
25
|
+
*
|
|
26
|
+
* This lets you add different kinds of metadata under the same domain with ease.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* meta.add("%app", "my-app") // adds label 'app' with value 'my-app'
|
|
30
|
+
* meta.add("example.section/", {
|
|
31
|
+
* "%label1": "value1", // adds `%example.section/label1` with value 'value1'
|
|
32
|
+
* "^annotation1": "value2" // adds `^example.section/annotation1` with value 'value2'
|
|
33
|
+
* })
|
|
34
|
+
*/
|
|
35
|
+
class Meta implements Iterable<[MetadataKey, string]>, MetaLike {
|
|
15
36
|
private readonly _dict;
|
|
16
37
|
readonly [MetaMarker] = true;
|
|
38
|
+
/**
|
|
39
|
+
* Constructs a new Meta instance from a map of key-value pairs. Validates all keys and
|
|
40
|
+
* values during construction.
|
|
41
|
+
*
|
|
42
|
+
* @param _dict Internal map storing metadata key-value pairs
|
|
43
|
+
* @throws {MetadataError} If any key or value is invalid
|
|
44
|
+
*/
|
|
17
45
|
constructor(_dict: Map<string, string>);
|
|
18
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Makes Meta instances iterable, yielding [ValueKey, string] pairs.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* for (const [key, value] of meta) {
|
|
51
|
+
* console.log(key.str, value)
|
|
52
|
+
* }
|
|
53
|
+
*/
|
|
54
|
+
[Symbol.iterator](): Generator<[MetadataKey, string], void, unknown>;
|
|
19
55
|
protected _create(raw: Map<string, string>): Meta;
|
|
56
|
+
/**
|
|
57
|
+
* Creates a deep clone of this object.
|
|
58
|
+
*
|
|
59
|
+
* @returns
|
|
60
|
+
*/
|
|
20
61
|
clone(): Meta;
|
|
62
|
+
/**
|
|
63
|
+
* Deletes a single value key from the metadata.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* meta.delete("name") // deletes core metadata 'name'
|
|
67
|
+
* meta.delete("%app") // deletes label 'app'
|
|
68
|
+
*
|
|
69
|
+
* @param key The value key to delete
|
|
70
|
+
*/
|
|
21
71
|
delete(key: Key.Value): Meta;
|
|
22
|
-
|
|
23
|
-
|
|
72
|
+
/**
|
|
73
|
+
* Deletes specific keys under a domain prefix.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* meta.delete("example.com/", "key1", "key2") // deletes specific keys in section
|
|
77
|
+
*
|
|
78
|
+
* @param ns The section key namespace
|
|
79
|
+
* @param keys Specific value keys within the section to delete
|
|
80
|
+
*/
|
|
81
|
+
delete(ns: Key.Domain, ...keys: Key.Value[]): Meta;
|
|
82
|
+
/**
|
|
83
|
+
* Deletes all keys within a section namespace.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* meta.delete("example.com/") // deletes all keys in section
|
|
87
|
+
*
|
|
88
|
+
* @param ns The section key namespace to delete
|
|
89
|
+
*/
|
|
90
|
+
delete(ns: Key.Domain): Meta;
|
|
91
|
+
/**
|
|
92
|
+
* Adds a single key-value pair to the metadata. Throws if the key already exists.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* meta.add("%app", "my-app") // adds label
|
|
96
|
+
* meta.add("name", "my-resource") // adds core metadata
|
|
97
|
+
*
|
|
98
|
+
* @param key The value key to add
|
|
99
|
+
* @param value The value to associate with the key
|
|
100
|
+
*/
|
|
24
101
|
add(key: Key.Value, value?: string): Meta;
|
|
25
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Adds a nested object of key-value pairs within a section namespace. Throws if any key
|
|
104
|
+
* already exists.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* meta.add("example.com/", { "%label": "value", "^annotation": "data" })
|
|
108
|
+
*
|
|
109
|
+
* @param key The section key namespace
|
|
110
|
+
* @param value Nested object containing key-value pairs
|
|
111
|
+
*/
|
|
112
|
+
add(key: Key.Domain, value: MetaInputParts.Nested): Meta;
|
|
113
|
+
/**
|
|
114
|
+
* Adds multiple key-value pairs from an input object. Throws if any key already exists.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* meta.add({ "%app": "my-app", name: "my-resource" })
|
|
118
|
+
*
|
|
119
|
+
* @param input Object or map containing key-value pairs to add
|
|
120
|
+
*/
|
|
26
121
|
add(input: InputMeta): Meta;
|
|
122
|
+
/**
|
|
123
|
+
* Compares this Meta instance to another for equality. Two instances are equal if they
|
|
124
|
+
* contain the same key-value pairs.
|
|
125
|
+
*
|
|
126
|
+
* @param other The other Meta instance or input to compare against
|
|
127
|
+
* @returns Whether the two Meta instances are equal
|
|
128
|
+
*/
|
|
27
129
|
equals(other: Meta.Input): boolean;
|
|
28
|
-
|
|
130
|
+
/**
|
|
131
|
+
* Overwrites a single key-value pair, replacing any existing value.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* meta.overwrite("%app", "new-app") // replaces existing label value
|
|
135
|
+
*
|
|
136
|
+
* @param key The value key to overwrite
|
|
137
|
+
* @param value The new value (undefined removes the key)
|
|
138
|
+
*/
|
|
29
139
|
overwrite(key: Key.Value, value: string | undefined): Meta;
|
|
30
|
-
|
|
140
|
+
/**
|
|
141
|
+
* Overwrites key-value pairs within a section namespace.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* meta.overwrite("example.com/", { "%label": "new-value" })
|
|
145
|
+
*
|
|
146
|
+
* @param key The section key namespace
|
|
147
|
+
* @param value Nested object containing key-value pairs to overwrite
|
|
148
|
+
*/
|
|
149
|
+
overwrite(key: Key.Domain, value: MetaInputParts.Nested): Meta;
|
|
150
|
+
/**
|
|
151
|
+
* Overwrites multiple key-value pairs from an input object.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* meta.overwrite({ "%app": "new-app", name: "new-name" })
|
|
155
|
+
*
|
|
156
|
+
* @param input Object or map containing key-value pairs to overwrite
|
|
157
|
+
*/
|
|
31
158
|
overwrite(input?: InputMeta): Meta;
|
|
32
|
-
|
|
159
|
+
/**
|
|
160
|
+
* Checks if a key with a given domain prefix exists in the metadata.
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* meta.has("example.com/") // Checks for any key with this domain
|
|
164
|
+
* meta.has("%app") // Checks for the label 'app'
|
|
165
|
+
*
|
|
166
|
+
* @param domainPrefix The domain prefix to check for
|
|
167
|
+
* @returns True if any keys exist under the specified domain prefix, false otherwise
|
|
168
|
+
*/
|
|
169
|
+
has(domainPrefix: Key.Domain): boolean;
|
|
170
|
+
/** @param key */
|
|
171
|
+
has(key: Key.Value): boolean;
|
|
172
|
+
/**
|
|
173
|
+
* Retrieves the value for the specified key. Throws if the key doesn't exist.
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* const appName = meta.get("%app")
|
|
177
|
+
*
|
|
178
|
+
* @param key The value key to retrieve
|
|
179
|
+
* @returns The value associated with the key
|
|
180
|
+
* @throws {MetadataError} If the key is not found
|
|
181
|
+
*/
|
|
33
182
|
get(key: Key.Value): string;
|
|
183
|
+
/**
|
|
184
|
+
* Attempts to retrieve the value for the specified key, returning a fallback if not found.
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* const appName = meta.tryGet("%app", "default-app")
|
|
188
|
+
*
|
|
189
|
+
* @param key The value key to retrieve
|
|
190
|
+
* @param fallback Optional fallback value if key doesn't exist
|
|
191
|
+
* @returns The value associated with the key, or the fallback value
|
|
192
|
+
* @throws {MetadataError} If a domain key is provided instead of a value key
|
|
193
|
+
*/
|
|
34
194
|
tryGet(key: Key.Value, fallback?: string): string | undefined;
|
|
35
|
-
private
|
|
36
|
-
|
|
195
|
+
private _matchDomainPrefixes;
|
|
196
|
+
/**
|
|
197
|
+
* Creates a new Meta instance containing only some of the keys. You can pass both entire
|
|
198
|
+
* keys and domain prefixes to include all keys under that domain.
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* const subset = meta.pick("%app", "name", "example.com/")
|
|
202
|
+
*
|
|
203
|
+
* @param keySpecs Keys or domain prefixes to include in the result
|
|
204
|
+
* @returns A new Meta instance with only the picked keys
|
|
205
|
+
*/
|
|
206
|
+
pick(...keySpecs: (Key.Domain | Key.Value)[]): Meta;
|
|
37
207
|
private _prefixed;
|
|
208
|
+
/**
|
|
209
|
+
* Returns all labels as a plain object that can be embedded into a k8s manifest, with keys
|
|
210
|
+
* in canonical order.
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* const labels = Meta.make({
|
|
214
|
+
* "%app": "my-app",
|
|
215
|
+
* "%tier": "backend"
|
|
216
|
+
* }).labels
|
|
217
|
+
* // { app: "my-app", tier: "backend" }
|
|
218
|
+
*/
|
|
38
219
|
get labels(): Record<string, any>;
|
|
220
|
+
/**
|
|
221
|
+
* Returns all annotations as a plain object that can be embedded into a k8s manifest, with
|
|
222
|
+
* keys in canonical order.
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* const annotations = Meta.make({
|
|
226
|
+
* "^note": "This is important",
|
|
227
|
+
* "^description": "Detailed info"
|
|
228
|
+
* }).annotations
|
|
229
|
+
* // { note: "This is important", description: "Detailed info" }
|
|
230
|
+
*/
|
|
39
231
|
get annotations(): Record<string, any>;
|
|
232
|
+
/**
|
|
233
|
+
* Returns all comments (build-time metadata) as a plain object, with keys in canonical
|
|
234
|
+
* order.
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* const comments = Meta.make({
|
|
238
|
+
* "#note": "Internal use only"
|
|
239
|
+
* }).comments
|
|
240
|
+
* // { note: "Internal use only" }
|
|
241
|
+
*/
|
|
40
242
|
get comments(): Record<string, any>;
|
|
243
|
+
/**
|
|
244
|
+
* Returns all core metadata fields (`name` and `namespace`) as a plain object that can be
|
|
245
|
+
* embedded into a k8s manifest, with keys in canonical order.
|
|
246
|
+
*
|
|
247
|
+
* @example
|
|
248
|
+
* const core = meta.core // { name: "my-resource", namespace: "default" }
|
|
249
|
+
*/
|
|
250
|
+
get core(): { [key in Key.Special]?: string; };
|
|
251
|
+
/**
|
|
252
|
+
* Returns all metadata key-value pairs as a flat JavaScript object, with each key prefixed
|
|
253
|
+
* appropriately.
|
|
254
|
+
*
|
|
255
|
+
* @example
|
|
256
|
+
* const all = Meta.make({
|
|
257
|
+
* "%app": "my-app",
|
|
258
|
+
* "^note": "This is important",
|
|
259
|
+
* name: "my-resource"
|
|
260
|
+
* }).values
|
|
261
|
+
* // { "%app": "my-app", "^note": "This is important", "name": "my-resource" }
|
|
262
|
+
*/
|
|
41
263
|
get values(): {
|
|
42
264
|
[k: string]: string;
|
|
43
265
|
};
|
|
44
|
-
get
|
|
45
|
-
get core(): { [key in Key.Special]?: string; };
|
|
46
|
-
remove(key: Key.Value): this;
|
|
47
|
-
remove(ns: Key.Section, key: string): this;
|
|
48
|
-
remove(ns: Key.Section): this;
|
|
49
|
-
expand(): {
|
|
50
|
-
labels: Record<string, any>;
|
|
51
|
-
annotations: Record<string, any>;
|
|
52
|
-
namespace?: string | undefined;
|
|
53
|
-
name?: string | undefined;
|
|
54
|
-
};
|
|
266
|
+
private get _keys();
|
|
55
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* Creates a Meta instance with a single key-value pair.
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* const meta = Meta.make("%app", "my-app")
|
|
273
|
+
*
|
|
274
|
+
* @param key The value key
|
|
275
|
+
* @param value The value to associate with the key
|
|
276
|
+
*/
|
|
56
277
|
function make(key: Key.Value, value: string): Meta;
|
|
57
|
-
|
|
278
|
+
/**
|
|
279
|
+
* Creates a Meta instance with key-value pairs within a section namespace.
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* const meta = Meta.make("example.com/", { "%label": "value" })
|
|
283
|
+
*
|
|
284
|
+
* @param key The section key namespace
|
|
285
|
+
* @param value Nested object containing key-value pairs
|
|
286
|
+
*/
|
|
287
|
+
function make(key: Key.Domain, value: MetaInputParts.Nested): Meta;
|
|
288
|
+
/**
|
|
289
|
+
* Creates a Meta instance from an input object or returns an empty Meta if no input provided.
|
|
290
|
+
*
|
|
291
|
+
* @example
|
|
292
|
+
* const meta = Meta.make({ "%app": "my-app", name: "resource" })
|
|
293
|
+
* const empty = Meta.make()
|
|
294
|
+
*
|
|
295
|
+
* @param input Object or map containing key-value pairs
|
|
296
|
+
*/
|
|
58
297
|
function make(input?: InputMeta): Meta;
|
|
59
|
-
function splat(...input: InputMeta[]): Meta;
|
|
60
|
-
function is(value: any): value is Meta;
|
|
61
|
-
class MutableMeta extends Meta {
|
|
62
|
-
constructor(...args: any[]);
|
|
63
|
-
}
|
|
64
298
|
}
|
|
65
299
|
export {};
|
|
66
300
|
//# sourceMappingURL=meta.d.ts.map
|
package/dist/meta.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnE,OAAO,EAAmB,
|
|
1
|
+
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"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"}
|