@sorrell/cli-utilities 1.0.41 → 1.0.43

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 (29) hide show
  1. package/Distribution/PackageConfig/Index.Inner.d.ts +8 -0
  2. package/Distribution/PackageConfig/Index.Inner.d.ts.map +1 -0
  3. package/Distribution/PackageConfig/Index.Inner.js +8 -0
  4. package/Distribution/PackageConfig/Index.Inner.js.map +1 -0
  5. package/Distribution/PackageConfig/PackageConfig.Internal.Types.d.ts +16 -0
  6. package/Distribution/PackageConfig/PackageConfig.Internal.Types.d.ts.map +1 -0
  7. package/Distribution/PackageConfig/PackageConfig.Internal.Types.js +8 -0
  8. package/Distribution/PackageConfig/PackageConfig.Internal.Types.js.map +1 -0
  9. package/Distribution/PackageConfig/PackageConfig.Internal.d.ts +17 -0
  10. package/Distribution/PackageConfig/PackageConfig.Internal.d.ts.map +1 -0
  11. package/Distribution/PackageConfig/PackageConfig.Internal.js +88 -0
  12. package/Distribution/PackageConfig/PackageConfig.Internal.js.map +1 -0
  13. package/Distribution/PackageConfig/PackageConfig.Types.d.ts +8 -0
  14. package/Distribution/PackageConfig/PackageConfig.Types.d.ts.map +1 -0
  15. package/Distribution/PackageConfig/PackageConfig.Types.js +8 -0
  16. package/Distribution/PackageConfig/PackageConfig.Types.js.map +1 -0
  17. package/Distribution/PackageConfig/PackageConfig.d.ts +34 -0
  18. package/Distribution/PackageConfig/PackageConfig.d.ts.map +1 -0
  19. package/Distribution/PackageConfig/PackageConfig.js +49 -0
  20. package/Distribution/PackageConfig/PackageConfig.js.map +1 -0
  21. package/Distribution/PackageConfig/index.d.ts +8 -0
  22. package/Distribution/PackageConfig/index.d.ts.map +1 -0
  23. package/Distribution/PackageConfig/index.js +8 -0
  24. package/Distribution/PackageConfig/index.js.map +1 -0
  25. package/Distribution/index.d.ts +1 -0
  26. package/Distribution/index.d.ts.map +1 -1
  27. package/Distribution/index.js +1 -0
  28. package/Distribution/index.js.map +1 -1
  29. package/package.json +4 -3
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file Index.Inner.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ export * from "./PackageConfig.js";
8
+ //# sourceMappingURL=Index.Inner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Index.Inner.d.ts","sourceRoot":"","sources":["../../Source/PackageConfig/Index.Inner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file Index.Inner.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ export * from "./PackageConfig.js";
8
+ //# sourceMappingURL=Index.Inner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Index.Inner.js","sourceRoot":"","sources":["../../Source/PackageConfig/Index.Inner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @file PackageConfig.Internal.Types.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ import type { ConfigError, Effect, ConfigProvider as EffectConfigProvider } from "effect";
8
+ import type { IPackageJson } from "package-json-type";
9
+ /**
10
+ * The base type for the `Record-like` of the desired
11
+ * {@link ConfigProvider!SettingsType | SettingsType}.
12
+ */
13
+ export type FSettingsRecord = Readonly<Record<string, unknown>>;
14
+ export type ELoadResolvedProvider = Effect.Effect<EffectConfigProvider.ConfigProvider, any, never>;
15
+ export type EReadPackageJson = Effect.Effect<IPackageJson, ConfigError.ConfigError>;
16
+ //# sourceMappingURL=PackageConfig.Internal.Types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageConfig.Internal.Types.d.ts","sourceRoot":"","sources":["../../Source/PackageConfig/PackageConfig.Internal.Types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAG1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAGhE,MAAM,MAAM,qBAAqB,GAC7B,MAAM,CAAC,MAAM,CACT,oBAAoB,CAAC,cAAc,EAEnC,GAAG,EACH,KAAK,CACR,CAAC;AAGN,MAAM,MAAM,gBAAgB,GACxB,MAAM,CAAC,MAAM,CACT,YAAY,EACZ,WAAW,CAAC,WAAW,CAC1B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file PackageConfig.Internal.Types.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=PackageConfig.Internal.Types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageConfig.Internal.Types.js","sourceRoot":"","sources":["../../Source/PackageConfig/PackageConfig.Internal.Types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @file PackageConfig.Internal.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ import { ConfigError, ConfigProvider, Effect, Schema } from "effect";
8
+ import type { EReadPackageJson, FSettingsRecord } from "./PackageConfig.Internal.Types.js";
9
+ import { type RootDirectoryNotFoundError } from "@sorrell/utilities/npm";
10
+ export declare function IsRecordLike(Value: unknown): Value is Record<string, unknown>;
11
+ export declare function HasNodeErrorCode(Value: unknown, Code: string): boolean;
12
+ export declare function ErrorToMessage(Value: unknown): string;
13
+ export declare function DecodeSettingsProviderEffect<SettingsType extends FSettingsRecord, EncodedType>(Value: unknown, ConfigPath: ReadonlyArray<string>, SettingsSchema: Schema.Schema<SettingsType, EncodedType, never>): Effect.Effect<ConfigProvider.ConfigProvider, ConfigError.ConfigError>;
14
+ export declare function LoadJsonFileProviderEffect<Settings extends FSettingsRecord, Encoded>(ConfigFilePath: string, ConfigPath: ReadonlyArray<string>, SettingsSchema: Schema.Schema<Settings, Encoded, never>): Effect.Effect<ConfigProvider.ConfigProvider, ConfigError.ConfigError>;
15
+ export declare function BuildResolvedProviderEffect<Settings extends FSettingsRecord, Encoded>(PackageName: string, SettingsSchema: Schema.Schema<Settings, Encoded, never>, DefaultFileName: string | undefined): Effect.Effect<ConfigProvider.ConfigProvider, ConfigError.ConfigError | RootDirectoryNotFoundError>;
16
+ export declare function ReadPackageJsonEffect(PackageName: string): EReadPackageJson;
17
+ //# sourceMappingURL=PackageConfig.Internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageConfig.Internal.d.ts","sourceRoot":"","sources":["../../Source/PackageConfig/PackageConfig.Internal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAS,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAAkB,KAAK,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AASzF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAG7E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQrD;AAED,wBAAgB,4BAA4B,CACxC,YAAY,SAAS,eAAe,EACpC,WAAW,EAEX,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,EACjC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,CAAC,GAChE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,WAAW,CAAC,WAAW,CAAC,CAkBvE;AAED,wBAAgB,0BAA0B,CACtC,QAAQ,SAAS,eAAe,EAChC,OAAO,EAEP,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,EACjC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,GACxD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,WAAW,CAAC,WAAW,CAAC,CA6CvE;AAED,wBAAgB,2BAA2B,CACvC,QAAQ,SAAS,eAAe,EAChC,OAAO,EAEP,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,EACvD,eAAe,EAAE,MAAM,GAAG,SAAS,GACpC,MAAM,CAAC,MAAM,CACZ,cAAc,CAAC,cAAc,EAC7B,WAAW,CAAC,WAAW,GAAG,0BAA0B,CACvD,CAgEA;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAkB3E"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * @file PackageConfig.Internal.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ import { Cause, ConfigError, ConfigProvider, Effect, Schema } from "effect";
8
+ import { GetPackageJson } from "@sorrell/utilities/npm";
9
+ import Fs from "fs/promises";
10
+ import { GetPackageRootDirectory } from "@sorrell/utilities/npm/effect";
11
+ import Path from "path";
12
+ /* eslint-disable jsdoc/require-jsdoc */
13
+ export function IsRecordLike(Value) {
14
+ return typeof Value === "object" && Value !== null && !Array.isArray(Value);
15
+ }
16
+ export function HasNodeErrorCode(Value, Code) {
17
+ return IsRecordLike(Value) && Value["code"] === Code;
18
+ }
19
+ export function ErrorToMessage(Value) {
20
+ if (Value instanceof Error && Value.message.length > 0) {
21
+ return Value.message;
22
+ }
23
+ return String(Value);
24
+ }
25
+ export function DecodeSettingsProviderEffect(Value, ConfigPath, SettingsSchema) {
26
+ return Schema.decodeUnknown(SettingsSchema, {
27
+ errors: "all",
28
+ onExcessProperty: "error"
29
+ })(Value).pipe(Effect.map((Settings) => ConfigProvider.fromJson(Settings)), Effect.mapError((TheParseError) => {
30
+ return ConfigError.InvalidData([...ConfigPath], `Config value does not conform to the settings schema: ${String(TheParseError)}`);
31
+ }));
32
+ }
33
+ export function LoadJsonFileProviderEffect(ConfigFilePath, ConfigPath, SettingsSchema) {
34
+ return Effect.gen(function* () {
35
+ const FileContents = yield* Effect.tryPromise({
36
+ catch: (ErrorCause) => {
37
+ if (HasNodeErrorCode(ErrorCause, "ENOENT")) {
38
+ return ConfigError.MissingData([...ConfigPath], `Config file does not exist: ${ConfigFilePath}`);
39
+ }
40
+ return ConfigError.SourceUnavailable([...ConfigPath], `Could not read config file ${ConfigFilePath}: ${ErrorToMessage(ErrorCause)}`, Cause.fail(ErrorCause));
41
+ },
42
+ try: () => Fs.readFile(ConfigFilePath, "utf-8")
43
+ });
44
+ const JsonValue = yield* Effect.try({
45
+ catch: (ErrorCause) => {
46
+ return ConfigError.InvalidData([...ConfigPath], `Config file is not valid JSON: ${ErrorToMessage(ErrorCause)}`);
47
+ },
48
+ try: () => JSON.parse(FileContents)
49
+ });
50
+ return yield* DecodeSettingsProviderEffect(JsonValue, ConfigPath, SettingsSchema);
51
+ });
52
+ }
53
+ export function BuildResolvedProviderEffect(PackageName, SettingsSchema, DefaultFileName) {
54
+ return Effect.gen(function* () {
55
+ const PackageJson = yield* ReadPackageJsonEffect(PackageName);
56
+ const PackageJsonPath = yield* GetPackageRootDirectory();
57
+ const PackageJsonDirectory = Path.dirname(PackageJsonPath);
58
+ const ConfigSection = PackageJson.config;
59
+ if (IsRecordLike(ConfigSection) && Object.hasOwn(ConfigSection, PackageName)) {
60
+ const PackageConfigValue = ConfigSection[PackageName];
61
+ if (typeof PackageConfigValue === "string") {
62
+ const ConfigFilePath = Path.resolve(PackageJsonDirectory, PackageConfigValue);
63
+ return yield* LoadJsonFileProviderEffect(ConfigFilePath, ["config", PackageName], SettingsSchema);
64
+ }
65
+ if (IsRecordLike(PackageConfigValue)) {
66
+ return yield* DecodeSettingsProviderEffect(PackageConfigValue, ["config", PackageName], SettingsSchema);
67
+ }
68
+ return yield* Effect.fail(ConfigError.Unsupported(["config", PackageName], `Expected package.json config["${PackageName}"] to be ` +
69
+ "either a string path or a JSON object."));
70
+ }
71
+ if (DefaultFileName !== undefined) {
72
+ const DefaultConfigFilePath = Path.resolve(PackageJsonDirectory, DefaultFileName);
73
+ return yield* LoadJsonFileProviderEffect(DefaultConfigFilePath, [DefaultFileName], SettingsSchema);
74
+ }
75
+ return yield* Effect.fail(ConfigError.MissingData(["config", PackageName], `Missing package.json config["${PackageName}"], and no ` +
76
+ "default file name was provided."));
77
+ });
78
+ }
79
+ export function ReadPackageJsonEffect(PackageName) {
80
+ return Effect.tryPromise({
81
+ catch: (ErrorCause) => {
82
+ return ConfigError.SourceUnavailable([PackageName], ("Could not read the package.json for the current " +
83
+ `working directory: ${ErrorToMessage(ErrorCause)}`), Cause.fail(ErrorCause));
84
+ },
85
+ try: () => GetPackageJson()
86
+ });
87
+ }
88
+ //# sourceMappingURL=PackageConfig.Internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageConfig.Internal.js","sourceRoot":"","sources":["../../Source/PackageConfig/PackageConfig.Internal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file PackageConfig.Types.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=PackageConfig.Types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageConfig.Types.d.ts","sourceRoot":"","sources":["../../Source/PackageConfig/PackageConfig.Types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file PackageConfig.Types.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=PackageConfig.Types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageConfig.Types.js","sourceRoot":"","sources":["../../Source/PackageConfig/PackageConfig.Types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @file PackageConfig.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ import type { Schema } from "effect";
8
+ import { ConfigProvider as EffectConfigProvider } from "effect";
9
+ import type { FSettingsRecord } from "./PackageConfig.Internal.Types.js";
10
+ /**
11
+ * Allow dependents to provide configuration, with two supported workflows,
12
+ *
13
+ * 1. Check for a JSON file {@link DefaultFileName} in the root of the dependent,
14
+ * if a {@link DefaultFileName} is given.
15
+ *
16
+ * 2. Check the dependent's `package.json#config` for a `string` property with name
17
+ * {@link PackageName}, whose value is a path to a JSON file, relative to the
18
+ * dependent's root directory.
19
+ *
20
+ * Method (2) is attempted only if method (1) fails.
21
+ *
22
+ * @param PackageName - The name of your package. It is recommended, but not enforced,
23
+ * for this to match your package's name exactly.
24
+ * @param SettingsSchema - The schema against which the found settings will be validated.
25
+ * @param DefaultFileName - The default name of the settings file for which this function
26
+ * will look, if specified.
27
+ *
28
+ * @returns {EffectConfigProvider.ConfigProvider} The {@link EffectConfigProvider.ConfigProvider}
29
+ * containing the desired {@link SettingsType}.
30
+ *
31
+ * @example @TODO
32
+ */
33
+ export declare function ConfigProvider<SettingsType extends FSettingsRecord, EncodedType>(PackageName: string, SettingsSchema: Schema.Schema<SettingsType, EncodedType, never>, DefaultFileName?: `${string}.json`): EffectConfigProvider.ConfigProvider;
34
+ //# sourceMappingURL=PackageConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageConfig.d.ts","sourceRoot":"","sources":["../../Source/PackageConfig/PackageConfig.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAmC,cAAc,IAAI,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AACjG,OAAO,KAAK,EAAyB,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGhG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,cAAc,CAC1B,YAAY,SAAS,eAAe,EACpC,WAAW,EAEX,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,CAAC,EAC/D,eAAe,CAAC,EAAE,GAAI,MAAO,OAAO,GACrC,oBAAoB,CAAC,cAAc,CA+CrC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @file PackageConfig.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ import { ConfigProviderPathPatch, Effect, ConfigProvider as EffectConfigProvider } from "effect";
8
+ import { BuildResolvedProviderEffect } from "./PackageConfig.Internal.js";
9
+ /**
10
+ * Allow dependents to provide configuration, with two supported workflows,
11
+ *
12
+ * 1. Check for a JSON file {@link DefaultFileName} in the root of the dependent,
13
+ * if a {@link DefaultFileName} is given.
14
+ *
15
+ * 2. Check the dependent's `package.json#config` for a `string` property with name
16
+ * {@link PackageName}, whose value is a path to a JSON file, relative to the
17
+ * dependent's root directory.
18
+ *
19
+ * Method (2) is attempted only if method (1) fails.
20
+ *
21
+ * @param PackageName - The name of your package. It is recommended, but not enforced,
22
+ * for this to match your package's name exactly.
23
+ * @param SettingsSchema - The schema against which the found settings will be validated.
24
+ * @param DefaultFileName - The default name of the settings file for which this function
25
+ * will look, if specified.
26
+ *
27
+ * @returns {EffectConfigProvider.ConfigProvider} The {@link EffectConfigProvider.ConfigProvider}
28
+ * containing the desired {@link SettingsType}.
29
+ *
30
+ * @example @TODO
31
+ */
32
+ export function ConfigProvider(PackageName, SettingsSchema, DefaultFileName) {
33
+ const LoadResolvedProvider = BuildResolvedProviderEffect(PackageName, SettingsSchema, DefaultFileName);
34
+ return EffectConfigProvider.make({
35
+ load: (Configuration) => {
36
+ return LoadResolvedProvider.pipe(Effect.flatMap((Provider) => Provider.load(Configuration)));
37
+ },
38
+ flattened: EffectConfigProvider.makeFlat({
39
+ patch: ConfigProviderPathPatch.empty,
40
+ load: (PathSegments, Configuration, Split) => {
41
+ return LoadResolvedProvider.pipe(Effect.flatMap((Provider) => Provider.flattened.load(PathSegments, Configuration, Split)));
42
+ },
43
+ enumerateChildren: (PathSegments) => {
44
+ return LoadResolvedProvider.pipe(Effect.flatMap((Provider) => Provider.flattened.enumerateChildren(PathSegments)));
45
+ }
46
+ })
47
+ });
48
+ }
49
+ //# sourceMappingURL=PackageConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageConfig.js","sourceRoot":"","sources":["../../Source/PackageConfig/PackageConfig.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAEjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,cAAc,CAI1B,WAAmB,EACnB,cAA+D,EAC/D,eAAoC;IAGpC,MAAM,oBAAoB,GAA0B,2BAA2B,CAC3E,WAAW,EACX,cAAc,EACd,eAAe,CAClB,CAAC;IAEF,OAAO,oBAAoB,CAAC,IAAI,CAC5B;QACI,IAAI,EAAE,CAAQ,aAAmC,EAAE,EAAE;YAEjD,OAAO,oBAAoB,CAAC,IAAI,CAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,QAA6C,EAAE,EAAE,CAC7D,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CACpC,CAAC;QACN,CAAC;QAED,SAAS,EAAE,oBAAoB,CAAC,QAAQ,CACpC;YACI,KAAK,EAAE,uBAAuB,CAAC,KAAK;YAEpC,IAAI,EAAE,CACF,YAAmC,EACnC,aAA6C,EAC7C,KAAc,EAChB,EAAE;gBAEA,OAAO,oBAAoB,CAAC,IAAI,CAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,QAA6C,EAAE,EAAE,CAC7D,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,KAAK,CAAC,CAC9D,CACJ,CAAC;YACN,CAAC;YAED,iBAAiB,EAAE,CAAC,YAAmC,EAAE,EAAE;gBAEvD,OAAO,oBAAoB,CAAC,IAAI,CAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,QAA6C,EAAE,EAAE,CAC7D,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC,YAAY,CAAC,CACrD,CACJ,CAAC;YACN,CAAC;SACJ,CACJ;KACJ,CACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file index.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ export * as PackageConfig from "./PackageConfig.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../Source/PackageConfig/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file index.ts
3
+ * @author Gage Sorrell <gage@sorrell.sh>
4
+ * @copyright (c) 2026 Gage Sorrell
5
+ * @license MIT
6
+ */
7
+ export * as PackageConfig from "./PackageConfig.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../Source/PackageConfig/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC"}
@@ -11,4 +11,5 @@ export * as Inquirer from "./Inquirer/index.js";
11
11
  export * as PseudoTerminal from "./PseudoTerminal/index.js";
12
12
  export * as Format from "./Format/index.js";
13
13
  export * as Ora from "./Ora/index.js";
14
+ export * from "./PackageConfig/index.js";
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../Source/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,uBAAuB,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../Source/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,uBAAuB,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,cAAc,0BAA0B,CAAC"}
@@ -11,4 +11,5 @@ export * as Inquirer from "./Inquirer/index.js";
11
11
  export * as PseudoTerminal from "./PseudoTerminal/index.js";
12
12
  export * as Format from "./Format/index.js";
13
13
  export * as Ora from "./Ora/index.js";
14
+ export * from "./PackageConfig/index.js";
14
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../Source/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,uBAAuB,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../Source/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,uBAAuB,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,cAAc,0BAA0B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sorrell/cli-utilities",
3
- "version": "1.0.41",
3
+ "version": "1.0.43",
4
4
  "description": "Utilities for CLI tools.",
5
5
  "keywords": [
6
6
  "cli",
@@ -72,7 +72,8 @@
72
72
  },
73
73
  "devDependencies": {
74
74
  "@types/node": "^25.5.0",
75
- "@typescript/native-preview": "^7.0.0-dev.20260326.1"
75
+ "@typescript/native-preview": "^7.0.0-dev.20260326.1",
76
+ "package-json-type": "^1.1.2"
76
77
  },
77
78
  "dependencies": {
78
79
  "@effect/platform": "^0.96.0",
@@ -81,7 +82,7 @@
81
82
  "@inquirer/type": "^4.0.4",
82
83
  "@listr2/prompt-adapter-enquirer": "^4.2.1",
83
84
  "@sorrell/inquirer-file-selector": "^1.0.4",
84
- "@sorrell/utilities": "^1.1.51",
85
+ "@sorrell/utilities": "^1.1.60",
85
86
  "chalk": "^5.6.2",
86
87
  "cli-table3": "^0.6.5",
87
88
  "clipboardy": "^5.3.1",