@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.
- package/dist/core/graph/origin/entity.d.ts +2 -2
- package/dist/core/graph/origin/entity.d.ts.map +1 -1
- package/dist/core/graph/origin/exporter.d.ts +3 -3
- package/dist/core/graph/origin/exporter.d.ts.map +1 -1
- package/dist/core/graph/origin/exporter.js +1 -1
- package/dist/core/graph/origin/exporter.js.map +1 -1
- package/dist/core/graph/origin/external.d.ts +10 -0
- package/dist/core/graph/origin/external.d.ts.map +1 -0
- package/dist/core/graph/origin/external.js +18 -0
- package/dist/core/graph/origin/external.js.map +1 -0
- package/dist/core/graph/origin/index.d.ts +1 -0
- package/dist/core/graph/origin/index.d.ts.map +1 -1
- package/dist/core/graph/origin/index.js +1 -0
- package/dist/core/graph/origin/index.js.map +1 -1
- package/dist/core/graph/origin/kind-map/index.d.ts +1 -2
- package/dist/core/graph/origin/kind-map/index.d.ts.map +1 -1
- package/dist/core/graph/origin/kind-map/index.js +3 -5
- package/dist/core/graph/origin/kind-map/index.js.map +1 -1
- package/dist/core/graph/origin/node.d.ts +3 -3
- package/dist/core/graph/origin/node.d.ts.map +1 -1
- package/dist/core/graph/origin/node.js.map +1 -1
- package/dist/core/graph/origin/tracker.d.ts +2 -0
- package/dist/core/graph/origin/tracker.d.ts.map +1 -1
- package/dist/core/graph/origin/tracker.js +10 -0
- package/dist/core/graph/origin/tracker.js.map +1 -1
- package/dist/core/graph/resource/api-kind/index.d.ts +4 -2
- package/dist/core/graph/resource/api-kind/index.d.ts.map +1 -1
- package/dist/core/graph/resource/api-kind/index.js +9 -2
- package/dist/core/graph/resource/api-kind/index.js.map +1 -1
- package/dist/core/graph/resource/entity.d.ts +3 -0
- package/dist/core/graph/resource/entity.d.ts.map +1 -1
- package/dist/core/graph/resource/entity.js +3 -0
- package/dist/core/graph/resource/entity.js.map +1 -1
- package/dist/core/graph/resource/external/base.d.ts +19 -0
- package/dist/core/graph/resource/external/base.d.ts.map +1 -0
- package/dist/core/graph/resource/external/base.js +44 -0
- package/dist/core/graph/resource/external/base.js.map +1 -0
- package/dist/core/graph/resource/external/features.d.ts +11 -0
- package/dist/core/graph/resource/external/features.d.ts.map +1 -0
- package/dist/core/graph/resource/external/features.js +3 -0
- package/dist/core/graph/resource/external/features.js.map +1 -0
- package/dist/core/graph/resource/external/index.d.ts +4 -0
- package/dist/core/graph/resource/external/index.d.ts.map +1 -0
- package/dist/core/graph/resource/external/index.js +20 -0
- package/dist/core/graph/resource/external/index.js.map +1 -0
- package/dist/core/graph/resource/external/props.d.ts +15 -0
- package/dist/core/graph/resource/external/props.d.ts.map +1 -0
- package/dist/core/graph/resource/external/props.js +3 -0
- package/dist/core/graph/resource/external/props.js.map +1 -0
- package/dist/core/graph/resource/field.d.ts +2 -0
- package/dist/core/graph/resource/field.d.ts.map +1 -0
- package/dist/core/graph/resource/field.js +3 -0
- package/dist/core/graph/resource/field.js.map +1 -0
- package/dist/core/graph/resource/index.d.ts +2 -0
- package/dist/core/graph/resource/index.d.ts.map +1 -1
- package/dist/core/graph/resource/index.js +2 -0
- package/dist/core/graph/resource/index.js.map +1 -1
- package/dist/core/graph/resource/node.d.ts +2 -1
- package/dist/core/graph/resource/node.d.ts.map +1 -1
- package/dist/core/graph/resource/node.js +14 -4
- package/dist/core/graph/resource/node.js.map +1 -1
- package/dist/core/graph/resource/ref-key/ref-key.d.ts +12 -2
- package/dist/core/graph/resource/ref-key/ref-key.d.ts.map +1 -1
- package/dist/core/graph/resource/ref-key/ref-key.js +15 -4
- package/dist/core/graph/resource/ref-key/ref-key.js.map +1 -1
- package/dist/core/graph/resource/reference/fw-ref-exports.d.ts +4 -4
- package/dist/core/graph/resource/reference/fw-ref-exports.d.ts.map +1 -1
- package/dist/core/graph/resource/reference/fw-ref.d.ts +5 -5
- package/dist/core/graph/resource/reference/fw-ref.d.ts.map +1 -1
- package/dist/core/graph/resource/reference/fw-ref.js.map +1 -1
- package/dist/core/graph/resource/reference/index.d.ts +1 -1
- package/dist/core/graph/resource/reference/index.d.ts.map +1 -1
- package/dist/core/graph/resource/reference/refable.d.ts +10 -5
- package/dist/core/graph/resource/reference/refable.d.ts.map +1 -1
- package/dist/core/graph/resource/top.d.ts +3 -1
- package/dist/core/graph/resource/top.d.ts.map +1 -1
- package/dist/core/graph/resource/top.js +11 -0
- package/dist/core/graph/resource/top.js.map +1 -1
- package/dist/expressions/data-sources/base.d.ts +7 -0
- package/dist/expressions/data-sources/base.d.ts.map +1 -0
- package/dist/expressions/data-sources/base.js +15 -0
- package/dist/expressions/data-sources/base.js.map +1 -0
- package/dist/expressions/data-sources/env-var.d.ts +7 -0
- package/dist/expressions/data-sources/env-var.d.ts.map +1 -0
- package/dist/expressions/data-sources/env-var.js +23 -0
- package/dist/expressions/data-sources/env-var.js.map +1 -0
- package/dist/expressions/data-sources/index.d.ts +4 -35
- package/dist/expressions/data-sources/index.d.ts.map +1 -1
- package/dist/expressions/data-sources/index.js +17 -119
- package/dist/expressions/data-sources/index.js.map +1 -1
- package/dist/expressions/data-sources/interface.d.ts +7 -0
- package/dist/expressions/data-sources/interface.d.ts.map +1 -0
- package/dist/expressions/data-sources/interface.js +3 -0
- package/dist/expressions/data-sources/interface.js.map +1 -0
- package/dist/expressions/data-sources/local-file.d.ts +13 -0
- package/dist/expressions/data-sources/local-file.d.ts.map +1 -0
- package/dist/expressions/data-sources/local-file.js +54 -0
- package/dist/expressions/data-sources/local-file.js.map +1 -0
- package/dist/utils/tagged-template.d.ts +2 -0
- package/dist/utils/tagged-template.d.ts.map +1 -0
- package/dist/utils/tagged-template.js +10 -0
- package/dist/utils/tagged-template.js.map +1 -0
- package/package.json +6 -4
- package/src/core/graph/origin/entity.ts +2 -2
- package/src/core/graph/origin/exporter.ts +5 -5
- package/src/core/graph/origin/external.ts +18 -0
- package/src/core/graph/origin/index.ts +1 -0
- package/src/core/graph/origin/kind-map/index.ts +6 -11
- package/src/core/graph/origin/node.ts +2 -2
- package/src/core/graph/origin/tracker.ts +12 -1
- package/src/core/graph/resource/api-kind/index.ts +16 -4
- package/src/core/graph/resource/entity.ts +3 -1
- package/src/core/graph/resource/external/base.ts +47 -0
- package/src/core/graph/resource/external/features.ts +16 -0
- package/src/core/graph/resource/external/index.ts +3 -0
- package/src/core/graph/resource/external/props.ts +16 -0
- package/src/core/graph/resource/field.ts +0 -0
- package/src/core/graph/resource/index.ts +2 -0
- package/src/core/graph/resource/node.ts +15 -4
- package/src/core/graph/resource/ref-key/ref-key.ts +32 -4
- package/src/core/graph/resource/reference/fw-ref-exports.ts +5 -5
- package/src/core/graph/resource/reference/fw-ref.ts +6 -7
- package/src/core/graph/resource/reference/index.ts +1 -6
- package/src/core/graph/resource/reference/refable.ts +15 -8
- package/src/core/graph/resource/top.ts +11 -1
- package/src/expressions/data-sources/base.ts +14 -0
- package/src/expressions/data-sources/env-var.ts +17 -0
- package/src/expressions/data-sources/index.ts +4 -147
- package/src/expressions/data-sources/interface.ts +13 -0
- package/src/expressions/data-sources/local-file.ts +49 -0
- 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
|
|
24
|
-
|
|
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,
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
|
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 {
|
|
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
|
|
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
|
|
12
|
-
|
|
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
|
|
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 {
|
|
5
|
+
import type { Ref2_Of } from "./refable"
|
|
6
6
|
|
|
7
|
-
export type FwReference<T extends
|
|
8
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
8
|
+
Ref2_Of<K>
|
|
9
9
|
> & {
|
|
10
|
-
prototype:
|
|
10
|
+
prototype: Ref2_Of<K>
|
|
11
11
|
}
|
|
12
|
-
export type
|
|
12
|
+
export type Ref2_Of<
|
|
13
13
|
Kind extends Kind.IdentParent = Kind.IdentParent,
|
|
14
14
|
Name extends string = string
|
|
15
|
-
> =
|
|
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
|
-
> =
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
+
}
|