@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/meta.d.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  import type { InputMeta, MetaInputParts } from "./input/dict-input";
2
- import { ValueKey } from "./key/repr";
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
- class Meta implements Iterable<[ValueKey, string]>, MetaLike {
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
- [Symbol.iterator](): Generator<[ValueKey, string], void, unknown>;
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
- delete(ns: Key.Section, key: string): Meta;
23
- delete(ns: Key.Section): Meta;
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
- add(key: Key.Section, value: MetaInputParts.Nested): Meta;
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
- section(key: string): Map<string, string>;
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
- overwrite(key: Key.Section, value: MetaInputParts.Nested): Meta;
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
- has<X extends Key.Value>(key: X): boolean;
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 _matchSectionKeys;
36
- pick(...keySpecs: Key.Key[]): Meta;
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 keys(): ValueKey[];
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
- function make(key: Key.Section, value: MetaInputParts.Nested): Meta;
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
@@ -1 +1 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"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"}