@k8ts/instruments 0.6.2 → 0.9.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.
Files changed (131) hide show
  1. package/dist/core/graph/origin/entity.d.ts +2 -2
  2. package/dist/core/graph/origin/entity.d.ts.map +1 -1
  3. package/dist/core/graph/origin/exporter.d.ts +3 -3
  4. package/dist/core/graph/origin/exporter.d.ts.map +1 -1
  5. package/dist/core/graph/origin/exporter.js +1 -1
  6. package/dist/core/graph/origin/exporter.js.map +1 -1
  7. package/dist/core/graph/origin/external.d.ts +10 -0
  8. package/dist/core/graph/origin/external.d.ts.map +1 -0
  9. package/dist/core/graph/origin/external.js +18 -0
  10. package/dist/core/graph/origin/external.js.map +1 -0
  11. package/dist/core/graph/origin/index.d.ts +1 -0
  12. package/dist/core/graph/origin/index.d.ts.map +1 -1
  13. package/dist/core/graph/origin/index.js +1 -0
  14. package/dist/core/graph/origin/index.js.map +1 -1
  15. package/dist/core/graph/origin/kind-map/index.d.ts +1 -2
  16. package/dist/core/graph/origin/kind-map/index.d.ts.map +1 -1
  17. package/dist/core/graph/origin/kind-map/index.js +3 -5
  18. package/dist/core/graph/origin/kind-map/index.js.map +1 -1
  19. package/dist/core/graph/origin/node.d.ts +3 -3
  20. package/dist/core/graph/origin/node.d.ts.map +1 -1
  21. package/dist/core/graph/origin/node.js.map +1 -1
  22. package/dist/core/graph/origin/tracker.d.ts +2 -0
  23. package/dist/core/graph/origin/tracker.d.ts.map +1 -1
  24. package/dist/core/graph/origin/tracker.js +10 -0
  25. package/dist/core/graph/origin/tracker.js.map +1 -1
  26. package/dist/core/graph/resource/api-kind/index.d.ts +4 -2
  27. package/dist/core/graph/resource/api-kind/index.d.ts.map +1 -1
  28. package/dist/core/graph/resource/api-kind/index.js +9 -2
  29. package/dist/core/graph/resource/api-kind/index.js.map +1 -1
  30. package/dist/core/graph/resource/entity.d.ts +3 -0
  31. package/dist/core/graph/resource/entity.d.ts.map +1 -1
  32. package/dist/core/graph/resource/entity.js +3 -0
  33. package/dist/core/graph/resource/entity.js.map +1 -1
  34. package/dist/core/graph/resource/external/base.d.ts +19 -0
  35. package/dist/core/graph/resource/external/base.d.ts.map +1 -0
  36. package/dist/core/graph/resource/external/base.js +44 -0
  37. package/dist/core/graph/resource/external/base.js.map +1 -0
  38. package/dist/core/graph/resource/external/features.d.ts +11 -0
  39. package/dist/core/graph/resource/external/features.d.ts.map +1 -0
  40. package/dist/core/graph/resource/external/features.js +3 -0
  41. package/dist/core/graph/resource/external/features.js.map +1 -0
  42. package/dist/core/graph/resource/external/index.d.ts +4 -0
  43. package/dist/core/graph/resource/external/index.d.ts.map +1 -0
  44. package/dist/core/graph/resource/external/index.js +20 -0
  45. package/dist/core/graph/resource/external/index.js.map +1 -0
  46. package/dist/core/graph/resource/external/props.d.ts +15 -0
  47. package/dist/core/graph/resource/external/props.d.ts.map +1 -0
  48. package/dist/core/graph/resource/external/props.js +3 -0
  49. package/dist/core/graph/resource/external/props.js.map +1 -0
  50. package/dist/core/graph/resource/field.d.ts +2 -0
  51. package/dist/core/graph/resource/field.d.ts.map +1 -0
  52. package/dist/core/graph/resource/field.js +3 -0
  53. package/dist/core/graph/resource/field.js.map +1 -0
  54. package/dist/core/graph/resource/index.d.ts +2 -0
  55. package/dist/core/graph/resource/index.d.ts.map +1 -1
  56. package/dist/core/graph/resource/index.js +2 -0
  57. package/dist/core/graph/resource/index.js.map +1 -1
  58. package/dist/core/graph/resource/node.d.ts +2 -1
  59. package/dist/core/graph/resource/node.d.ts.map +1 -1
  60. package/dist/core/graph/resource/node.js +14 -4
  61. package/dist/core/graph/resource/node.js.map +1 -1
  62. package/dist/core/graph/resource/ref-key/ref-key.d.ts +12 -2
  63. package/dist/core/graph/resource/ref-key/ref-key.d.ts.map +1 -1
  64. package/dist/core/graph/resource/ref-key/ref-key.js +15 -4
  65. package/dist/core/graph/resource/ref-key/ref-key.js.map +1 -1
  66. package/dist/core/graph/resource/reference/fw-ref-exports.d.ts +4 -4
  67. package/dist/core/graph/resource/reference/fw-ref-exports.d.ts.map +1 -1
  68. package/dist/core/graph/resource/reference/fw-ref.d.ts +5 -5
  69. package/dist/core/graph/resource/reference/fw-ref.d.ts.map +1 -1
  70. package/dist/core/graph/resource/reference/fw-ref.js.map +1 -1
  71. package/dist/core/graph/resource/reference/index.d.ts +1 -1
  72. package/dist/core/graph/resource/reference/index.d.ts.map +1 -1
  73. package/dist/core/graph/resource/reference/refable.d.ts +10 -5
  74. package/dist/core/graph/resource/reference/refable.d.ts.map +1 -1
  75. package/dist/core/graph/resource/top.d.ts +3 -1
  76. package/dist/core/graph/resource/top.d.ts.map +1 -1
  77. package/dist/core/graph/resource/top.js +11 -0
  78. package/dist/core/graph/resource/top.js.map +1 -1
  79. package/dist/expressions/data-sources/base.d.ts +7 -0
  80. package/dist/expressions/data-sources/base.d.ts.map +1 -0
  81. package/dist/expressions/data-sources/base.js +15 -0
  82. package/dist/expressions/data-sources/base.js.map +1 -0
  83. package/dist/expressions/data-sources/env-var.d.ts +7 -0
  84. package/dist/expressions/data-sources/env-var.d.ts.map +1 -0
  85. package/dist/expressions/data-sources/env-var.js +23 -0
  86. package/dist/expressions/data-sources/env-var.js.map +1 -0
  87. package/dist/expressions/data-sources/index.d.ts +4 -35
  88. package/dist/expressions/data-sources/index.d.ts.map +1 -1
  89. package/dist/expressions/data-sources/index.js +17 -119
  90. package/dist/expressions/data-sources/index.js.map +1 -1
  91. package/dist/expressions/data-sources/interface.d.ts +7 -0
  92. package/dist/expressions/data-sources/interface.d.ts.map +1 -0
  93. package/dist/expressions/data-sources/interface.js +3 -0
  94. package/dist/expressions/data-sources/interface.js.map +1 -0
  95. package/dist/expressions/data-sources/local-file.d.ts +13 -0
  96. package/dist/expressions/data-sources/local-file.d.ts.map +1 -0
  97. package/dist/expressions/data-sources/local-file.js +54 -0
  98. package/dist/expressions/data-sources/local-file.js.map +1 -0
  99. package/dist/utils/tagged-template.d.ts +2 -0
  100. package/dist/utils/tagged-template.d.ts.map +1 -0
  101. package/dist/utils/tagged-template.js +10 -0
  102. package/dist/utils/tagged-template.js.map +1 -0
  103. package/package.json +6 -4
  104. package/src/core/graph/origin/entity.ts +2 -2
  105. package/src/core/graph/origin/exporter.ts +5 -5
  106. package/src/core/graph/origin/external.ts +18 -0
  107. package/src/core/graph/origin/index.ts +1 -0
  108. package/src/core/graph/origin/kind-map/index.ts +6 -11
  109. package/src/core/graph/origin/node.ts +2 -2
  110. package/src/core/graph/origin/tracker.ts +12 -1
  111. package/src/core/graph/resource/api-kind/index.ts +16 -4
  112. package/src/core/graph/resource/entity.ts +3 -1
  113. package/src/core/graph/resource/external/base.ts +47 -0
  114. package/src/core/graph/resource/external/features.ts +16 -0
  115. package/src/core/graph/resource/external/index.ts +3 -0
  116. package/src/core/graph/resource/external/props.ts +16 -0
  117. package/src/core/graph/resource/field.ts +0 -0
  118. package/src/core/graph/resource/index.ts +2 -0
  119. package/src/core/graph/resource/node.ts +15 -4
  120. package/src/core/graph/resource/ref-key/ref-key.ts +32 -4
  121. package/src/core/graph/resource/reference/fw-ref-exports.ts +5 -5
  122. package/src/core/graph/resource/reference/fw-ref.ts +6 -7
  123. package/src/core/graph/resource/reference/index.ts +1 -6
  124. package/src/core/graph/resource/reference/refable.ts +15 -8
  125. package/src/core/graph/resource/top.ts +11 -1
  126. package/src/expressions/data-sources/base.ts +14 -0
  127. package/src/expressions/data-sources/env-var.ts +17 -0
  128. package/src/expressions/data-sources/index.ts +4 -147
  129. package/src/expressions/data-sources/interface.ts +13 -0
  130. package/src/expressions/data-sources/local-file.ts +49 -0
  131. package/src/utils/tagged-template.ts +6 -0
@@ -20,8 +20,12 @@ import { RefKey } from "./ref-key"
20
20
  if (format !== "lowkey") {
21
21
  kindName = chalk.bold(kindName)
22
22
  }
23
- const resourceName = chalk.blueBright(resource.name)
24
- const mainPart = `${kindName}/${resourceName}`
23
+ const parts = [kindName]
24
+ if (resource.namespace) {
25
+ parts.push(chalk.yellowBright(resource.namespace))
26
+ }
27
+ parts.push(chalk.blueBright(resource.name))
28
+ const mainPart = parts.join("/")
25
29
  let originPart = `${Displayers.get(resource.origin).prefix!()}`
26
30
  let text = ""
27
31
 
@@ -40,7 +44,10 @@ export class Resource_Node extends Node<Resource_Node, Resource_Entity> {
40
44
  return [this.kind.dns, this.namespace, this.name].filter(Boolean).join("/")
41
45
  }
42
46
  get key(): RefKey {
43
- return new RefKey(this.kind, this.name)
47
+ return new RefKey(this.kind, {
48
+ name: this.name,
49
+ namespace: this.namespace
50
+ })
44
51
  }
45
52
  get kind() {
46
53
  return this.entity.kind
@@ -63,7 +70,7 @@ export class Resource_Node extends Node<Resource_Node, Resource_Entity> {
63
70
  }
64
71
 
65
72
  get isExternal() {
66
- return this.origins.some(x => x.name === "EXTERNAL").pull()
73
+ return this.meta?.tryGet("#k8ts.org/is-external") ?? false
67
74
  }
68
75
 
69
76
  when<EntityType extends Resource_Entity>(
@@ -97,6 +104,10 @@ export class Resource_Node extends Node<Resource_Node, Resource_Entity> {
97
104
  })
98
105
  }
99
106
 
107
+ get disabled() {
108
+ return "disabled" in this.entity ? !!this.entity.disabled : false
109
+ }
110
+
100
111
  get shortFqn() {
101
112
  return `${this.origin.name}:${this.key}`
102
113
  }
@@ -1,5 +1,7 @@
1
+ import type { Ref2_Of } from ".."
1
2
  import { InstrumentsError } from "../../../../error"
2
3
  import type { Kind } from "../api-kind"
4
+ import { External_Base, type External_Props, type External_WithFeatures } from "../external"
3
5
 
4
6
  export type RefKey_Input = RefKey | RefKey["string"]
5
7
  export type RefKey_sFormat<Kind extends string, Name extends string> = `${Kind}/${Name}`
@@ -36,14 +38,30 @@ export function tryParse(ref: string): RefKey_Parsed | undefined {
36
38
  name
37
39
  }
38
40
  }
41
+
42
+ type nsKind = Kind<"", "v1", "Namespace">
43
+
44
+ export interface RefKey_Options<Name extends string = string> {
45
+ name: Name
46
+ namespace?: RefKey<nsKind> | string | Ref2_Of<nsKind>
47
+ }
48
+
39
49
  export class RefKey<K extends Kind.IdentParent = Kind.IdentParent, Name extends string = string> {
50
+ readonly name: string
51
+ readonly namespace: string | undefined
40
52
  constructor(
41
53
  readonly kind: K,
42
- readonly name: Name
43
- ) {}
54
+ options: RefKey_Options<Name>
55
+ ) {
56
+ this.name = options.name
57
+ this.namespace =
58
+ typeof options.namespace === "string" ? options.namespace : options.namespace?.name
59
+ }
44
60
 
45
61
  get string(): RefKey_sFormat<K["name"], Name> {
46
- return [this.kind.name, this.name].join(separator) as RefKey_sFormat<K["name"], Name>
62
+ return [this.kind.name, this.namespace, this.name]
63
+ .filter(x => !!x)
64
+ .join(separator) as RefKey_sFormat<K["name"], Name>
47
65
  }
48
66
 
49
67
  equals(other: RefKey): boolean {
@@ -53,10 +71,20 @@ export class RefKey<K extends Kind.IdentParent = Kind.IdentParent, Name extends
53
71
  if (typeof other !== "object") {
54
72
  return false
55
73
  }
56
- return this.kind.equals(other.kind) && this.name === other.name
74
+ return (
75
+ this.kind.equals(other.kind) &&
76
+ this.name === other.name &&
77
+ this.namespace === other.namespace
78
+ )
57
79
  }
58
80
 
59
81
  toString() {
60
82
  return this.string
61
83
  }
84
+
85
+ External<const P extends External_Props<K> = External_Props<K>>(
86
+ options?: P
87
+ ): External_WithFeatures<K, P> {
88
+ return new External_Base(this, options ?? {}) as any
89
+ }
62
90
  }
@@ -1,19 +1,19 @@
1
1
  import { seq } from "doddle"
2
- import type { Resource_Core_Ref } from "."
2
+ import type { Ref2_Of } from "."
3
3
  import { FwReference } from "."
4
4
  import type { Origin_Exporter } from "../../origin"
5
5
  import { ProxyOperationError } from "./error"
6
6
 
7
- export type FwRef_Exports_ByKey<Exports extends Resource_Core_Ref = Resource_Core_Ref> = {
7
+ export type FwRef_Exports_ByKey<Exports extends Ref2_Of = Ref2_Of> = {
8
8
  [E in Exports as `${E["kind"]["name"]}/${E["name"]}`]: FwReference<E>
9
9
  }
10
10
 
11
- export type FwRef_Exports<Exported extends Resource_Core_Ref = Resource_Core_Ref> =
12
- FxRef_Exports_Proxied & FwRef_Exports_ByKey<Exported>
11
+ export type FwRef_Exports<Exported extends Ref2_Of = Ref2_Of> = FxRef_Exports_Proxied &
12
+ FwRef_Exports_ByKey<Exported>
13
13
 
14
14
  export type FwRef_Exports_Brand = FxRef_Exports_Proxied
15
15
 
16
- export function FwRef_Exports<Exported extends Resource_Core_Ref>(
16
+ export function FwRef_Exports<Exported extends Ref2_Of>(
17
17
  entity: Origin_Exporter
18
18
  ): FwRef_Exports<Exported> {
19
19
  const proxied = new FxRef_Exports_Proxied(entity)
@@ -2,11 +2,10 @@ import type { Doddle } from "doddle"
2
2
  import type { AnyCtor } from "what-are-you"
3
3
  import type { RefKey } from "../ref-key"
4
4
  import { ProxyOperationError } from "./error"
5
- import type { Resource_Core_Ref } from "./refable"
5
+ import type { Ref2_Of } from "./refable"
6
6
 
7
- export type FwReference<T extends Resource_Core_Ref = Resource_Core_Ref> = FwReference_Proxied<T> &
8
- T
9
- export function FwReference<Referenced extends Resource_Core_Ref>(
7
+ export type FwReference<T extends Ref2_Of = Ref2_Of> = FwReference_Proxied<T> & T
8
+ export function FwReference<Referenced extends Ref2_Of>(
10
9
  props: FwReference_Props<Referenced>
11
10
  ): FwReference<Referenced> {
12
11
  const core = new FwReference_Proxied(props)
@@ -17,7 +16,7 @@ export namespace FwReference {
17
16
  return FwReference_Proxied.is(obj)
18
17
  }
19
18
  }
20
- export interface FwReference_Props<Referenced extends Resource_Core_Ref> {
19
+ export interface FwReference_Props<Referenced extends Ref2_Of> {
21
20
  readonly class?: AnyCtor<Referenced>
22
21
  readonly key: RefKey
23
22
  readonly namespace?: string
@@ -25,7 +24,7 @@ export interface FwReference_Props<Referenced extends Resource_Core_Ref> {
25
24
  readonly resolver: Doddle<Referenced>
26
25
  }
27
26
 
28
- class FwReference_Proxied<To extends Resource_Core_Ref> {
27
+ class FwReference_Proxied<To extends Ref2_Of> {
29
28
  readonly #props: FwReference_Props<To>
30
29
  constructor(props: FwReference_Props<To>) {
31
30
  this.#props = props
@@ -44,7 +43,7 @@ class FwReference_Proxied<To extends Resource_Core_Ref> {
44
43
  }
45
44
  }
46
45
 
47
- class FwRef_Handler<T extends Resource_Core_Ref> implements ProxyHandler<T> {
46
+ class FwRef_Handler<T extends Ref2_Of> implements ProxyHandler<T> {
48
47
  get _props() {
49
48
  return this._subject["__reference_props__"]()
50
49
  }
@@ -1,8 +1,3 @@
1
1
  export { FwReference } from "./fw-ref"
2
2
  export { FwRef_Exports, type FwRef_Exports_Brand } from "./fw-ref-exports"
3
- export type {
4
- Resource_Core_Ref,
5
- Resource_Ctor_Of,
6
- Resource_Full_Ref,
7
- Resource_Min_Ref
8
- } from "./refable"
3
+ export type * from "./refable"
@@ -3,22 +3,29 @@ import type { Kind } from "../api-kind"
3
3
  import type { Resource_Entity } from "../entity"
4
4
  import type { Resource_Node } from "../node"
5
5
 
6
- export type Resource_Min_Ref<K extends Kind.IdentParent = Kind.IdentParent> = { kind: K }
6
+ export type Resource_Ref_Min<K extends Kind.IdentParent = Kind.IdentParent> = { kind: K }
7
7
  export type Resource_Ctor_Of<K extends Kind.IdentParent = Kind.IdentParent> = AnyCtor<
8
- Resource_Core_Ref<K>
8
+ Ref2_Of<K>
9
9
  > & {
10
- prototype: Resource_Core_Ref<K>
10
+ prototype: Ref2_Of<K>
11
11
  }
12
- export type Resource_Core_Ref<
12
+ export type Ref2_Of<
13
13
  Kind extends Kind.IdentParent = Kind.IdentParent,
14
14
  Name extends string = string
15
- > = Resource_Min_Ref<Kind> & {
15
+ > = Resource_Ref_Min<Kind> & {
16
16
  name: Name
17
17
  equals(other: any): boolean
18
18
  node: Resource_Node
19
19
  }
20
-
21
- export type Resource_Full_Ref<
20
+ export type Resource_Ref_Full<
22
21
  _Kind extends Kind.IdentParent = Kind.IdentParent,
23
22
  _Name extends string = string
24
- > = Resource_Core_Ref<_Kind, _Name> & Resource_Entity<_Name>
23
+ > = Ref2_Of<_Kind, _Name> & Resource_Entity<_Name>
24
+
25
+ export type Resource_Ref_Keys_Of<X extends Resource_Ref_Min, Else = never> = [X] extends [
26
+ {
27
+ keys: (infer K extends string)[]
28
+ }
29
+ ]
30
+ ? K
31
+ : Else
@@ -10,10 +10,20 @@ export abstract class Resource_Top<
10
10
  Name extends string = string,
11
11
  Props extends object = object
12
12
  > extends Resource_Entity<Name, Props> {
13
- readonly _origin: Origin_Entity
13
+ private readonly _origin: Origin_Entity
14
14
  readonly meta: Meta
15
15
  abstract readonly kind: Kind.IdentParent
16
16
 
17
+ get disabled() {
18
+ return this.meta.tryGet("#k8ts.org/disabled", "") !== ""
19
+ }
20
+ set disabled(v: boolean) {
21
+ if (!v) {
22
+ this.meta.delete("#k8ts.org/disabled")
23
+ } else {
24
+ this.meta.add("#k8ts.org/disabled", "true")
25
+ }
26
+ }
17
27
  constructor(name: Name, props: Props) {
18
28
  super(name, props)
19
29
  this.meta = Meta.make({
@@ -0,0 +1,14 @@
1
+ import { doddle, type DoddleAsync } from "doddle"
2
+
3
+ export declare const DATA_SOURCE: unique symbol
4
+
5
+ export class DataSource_Lazy<T = any> {
6
+ private readonly _data: DoddleAsync<T>
7
+ constructor(getter: () => T | Promise<T>) {
8
+ this._data = doddle(async () => getter())
9
+ }
10
+
11
+ get() {
12
+ return this._data.pull()
13
+ }
14
+ }
@@ -0,0 +1,17 @@
1
+ import { DataSource_Lazy } from "./base"
2
+
3
+ export class DataSource_EnvVar extends DataSource_Lazy<string> {
4
+ constructor(public readonly name: string) {
5
+ super(async () => {
6
+ const value = process.env[this.name]
7
+ if (value === undefined) {
8
+ throw new Error(`Environment variable "${this.name}" is not set`)
9
+ }
10
+ return value
11
+ })
12
+ }
13
+ }
14
+
15
+ export function localRefEnvVar(name: string) {
16
+ return new DataSource_EnvVar(name)
17
+ }
@@ -1,147 +1,4 @@
1
- import { doddle, DoddleAsync, seq, type Doddle } from "doddle"
2
- import { readFile } from "fs/promises"
3
- import { dirname, join, resolve } from "path"
4
- import StackTracey from "stacktracey"
5
- import { InstrumentsError } from "../../error"
6
- export type DataSource_LocalFile_Mode = "text" | "binary"
7
-
8
- export interface DataSource_LocalFile_Props<Mode extends DataSource_LocalFile_Mode = "text"> {
9
- pointOfCall: StackTracey
10
- path: string
11
- cwd?: string
12
- mode?: Mode
13
- }
14
- export class DataSource_LocalFile<Mode extends DataSource_LocalFile_Mode = "text"> {
15
- constructor(private readonly _props: DataSource_LocalFile_Props<Mode>) {}
16
-
17
- get cwd() {
18
- if (this._props.cwd) {
19
- return this._props.cwd
20
- }
21
- const where = this._props.pointOfCall.at(0)
22
- return dirname(where.file)
23
- }
24
-
25
- get path() {
26
- const where = this._props.pointOfCall.at(0)
27
- const joined = join(dirname(where.file), this._props.path)
28
- return resolve(joined)
29
- }
30
-
31
- contents = doddle(async () => {
32
- const mode = this._props.mode ?? "text"
33
- if (mode === "binary") {
34
- const data = await readFile(this.path, null)
35
- return data
36
- }
37
- return readFile(this.path, "utf-8")
38
- }) as DoddleAsync<Mode extends "text" ? string : Uint8Array>
39
- }
40
-
41
- export function localFile<Mode extends DataSource_LocalFile_Mode = "text">(
42
- path: string,
43
- props?: Pick<DataSource_LocalFile_Props<Mode>, "cwd" | "mode">
44
- ): DataSource_LocalFile<Mode>
45
- export function localFile(
46
- args: TemplateStringsArray,
47
- ...params: any[]
48
- ): DataSource_LocalFile<"text">
49
- export function localFile(args: any, ...params: any[]) {
50
- if (typeof args === "string") {
51
- const options = params[0] ?? {}
52
- return new DataSource_LocalFile({
53
- pointOfCall: new StackTracey().slice(1),
54
- path: args,
55
- ...(options ?? {})
56
- })
57
- }
58
- const path = String.raw(args, ...params)
59
- return new DataSource_LocalFile({
60
- pointOfCall: new StackTracey().slice(1),
61
- path
62
- })
63
- }
64
-
65
- export interface TypedArrayLike {
66
- buffer: ArrayBuffer
67
- byteLength: number
68
- }
69
- export type DataSource_Text = DataSource_LocalFile<"text"> | string
70
- export type DataSource_Binary = DataSource_LocalFile<"binary"> | TypedArrayLike | ArrayBuffer
71
- export type DataSourceRecord_Text = Record<string, DataSource_Text>
72
- export type DataSourceRecord_Binary = Record<string, DataSource_Binary>
73
- export type DataSourceRecord = DataSourceRecord_Text | DataSourceRecord_Binary
74
- export function isTypedArray(data: DataSource_Binary): data is TypedArrayLike {
75
- return (
76
- typeof data === "object" &&
77
- "buffer" in data &&
78
- "byteSize" in data &&
79
- typeof data.byteSize === "number"
80
- )
81
- }
82
- export function isArrayBuffer(data: DataSource_Binary): data is ArrayBuffer {
83
- return data instanceof ArrayBuffer
84
- }
85
- export interface DataSourceResolvedRecord {
86
- data: Record<string, string>
87
- binaryData: Record<string, Uint8Array>
88
- }
89
- type MaybePromise<T> = T | Promise<T>
90
- async function promiseAllMap<K, V>(m: Map<K, Doddle<MaybePromise<V>>>): Promise<Map<K, V>> {
91
- const promises = seq(m)
92
- .map(async x => [x[0], await x[1].pull()] as [K, V])
93
- .toArray()
94
- .pull()
95
- const res = await Promise.all(promises)
96
- return new Map(res)
97
- }
98
- export async function resolveText(record: DataSourceRecord_Text) {
99
- const mp = seq(Object.entries(record))
100
- .map(([k, v]) => {
101
- return [
102
- k,
103
- doddle(async () => {
104
- let resolved = v
105
- if (v instanceof DataSource_LocalFile) {
106
- resolved = await v.contents.pull()
107
- }
108
- if (typeof resolved !== "string") {
109
- throw new InstrumentsError(
110
- `Got an invalid data value ${v} for key ${k}. Must be a string.`
111
- )
112
- }
113
- return resolved
114
- })
115
- ] as const
116
- })
117
- .toMap(x => x)
118
- .pull()
119
- return promiseAllMap(mp)
120
- }
121
- export async function resolveBinary(record: DataSourceRecord_Binary) {
122
- const mp = seq(Object.entries(record))
123
- .map(([k, v]) => {
124
- return [
125
- k,
126
- doddle(async () => {
127
- let resolved = v as any
128
- if (v instanceof DataSource_LocalFile) {
129
- resolved = await v.contents.pull()
130
- }
131
- if (isTypedArray(resolved)) {
132
- return new Uint8Array(resolved.buffer)
133
- } else if (isArrayBuffer(resolved)) {
134
- return new Uint8Array(resolved)
135
- } else {
136
- throw new InstrumentsError(
137
- `Got an invalid data value ${v} for key ${k}. Must be binary data.`
138
- )
139
- }
140
- })
141
- ] as const
142
- })
143
- .toMap(x => x)
144
- .pull()
145
-
146
- return promiseAllMap(mp)
147
- }
1
+ export * from "./base"
2
+ export * from "./env-var"
3
+ export * from "./interface"
4
+ export * from "./local-file"
@@ -0,0 +1,13 @@
1
+ export type DataSource_Type_Name = "string" | "binary"
2
+ export type DataSource_Value<Name extends DataSource_Type_Name> = Name extends "string"
3
+ ? string
4
+ : Name extends "binary"
5
+ ? Uint8Array
6
+ : DataSource_Type_Name
7
+ export interface DataSource_Object<TypeName extends DataSource_Type_Name = DataSource_Type_Name> {
8
+ get(): DataSource_Value<TypeName> | Promise<DataSource_Value<TypeName>>
9
+ }
10
+
11
+ export type DataSource<Only extends DataSource_Type_Name = DataSource_Type_Name> =
12
+ | DataSource_Object<Only>
13
+ | DataSource_Value<Only>
@@ -0,0 +1,49 @@
1
+ import Path from "pathlib-js"
2
+ import StackTracey from "stacktracey"
3
+ import type { TypedArray } from "what-are-you"
4
+ import { DataSource_Lazy } from "./base"
5
+ export type DataSource_Allowed = string | Uint8Array | TypedArray
6
+ export class DataSource_LocalFile_Path {
7
+ readonly path: Path
8
+ constructor(
9
+ private readonly _cwd: Path,
10
+ relPath: string
11
+ ) {
12
+ this.path = this._cwd.join(relPath)
13
+ }
14
+
15
+ as(mode: "text", encoding?: BufferEncoding): DataSource_Lazy<string>
16
+ as(mode: "binary"): DataSource_Lazy<Uint8Array>
17
+ as(mode: "text" | "binary", encoding?: BufferEncoding): DataSource_Lazy {
18
+ if (mode === "text") {
19
+ return new DataSource_LocalFile_Text(this, encoding)
20
+ } else {
21
+ return new DataSource_LocalFile_Binary(this)
22
+ }
23
+ }
24
+ }
25
+ class DataSource_LocalFile_Text extends DataSource_Lazy<string> {
26
+ constructor(
27
+ private readonly _parent: DataSource_LocalFile_Path,
28
+ readonly encoding: BufferEncoding = "utf-8"
29
+ ) {
30
+ super(async () => {
31
+ return this._parent.path.readFile(this.encoding)
32
+ })
33
+ }
34
+ }
35
+
36
+ class DataSource_LocalFile_Binary extends DataSource_Lazy<Uint8Array> {
37
+ constructor(private readonly _parent: DataSource_LocalFile_Path) {
38
+ super(async () => {
39
+ const x = await this._parent.path.readFile()
40
+ return new Uint8Array(x)
41
+ })
42
+ }
43
+ }
44
+
45
+ export function localRefFile(path: string) {
46
+ const trace = new StackTracey().slice(1)
47
+ const callerFile = trace.at(0).file
48
+ return new DataSource_LocalFile_Path(new Path(callerFile).parent(), path)
49
+ }
@@ -0,0 +1,6 @@
1
+ export function createTaggedTemplate<DataSource_T>(f: (joined: string) => DataSource_T) {
2
+ return (tArgs: TemplateStringsArray, ...params: any[]) => {
3
+ const joined = String.raw(tArgs, ...params)
4
+ return f(joined)
5
+ }
6
+ }