@next-box/appsettings 0.0.0-stage → 0.0.2
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/LICENSE +21 -0
- package/README.md +182 -2
- package/bin/appsettings.mjs +7 -0
- package/dist/cjs/cli/cli/command.cjs +2 -0
- package/dist/cjs/cli/cli/command.cjs.map +1 -0
- package/dist/cjs/cli/cli/handler.cjs +2 -0
- package/dist/cjs/cli/cli/handler.cjs.map +1 -0
- package/dist/cjs/cli/cli/index.cjs +2 -0
- package/dist/cjs/cli/cli/index.cjs.map +1 -0
- package/dist/cjs/components/AppSettingsProvider.cjs +3 -0
- package/dist/cjs/components/AppSettingsProvider.cjs.map +1 -0
- package/dist/cjs/components/Setting.cjs +3 -0
- package/dist/cjs/components/Setting.cjs.map +1 -0
- package/dist/cjs/config/AppSettingsImplementation.cjs +2 -0
- package/dist/cjs/config/AppSettingsImplementation.cjs.map +1 -0
- package/dist/cjs/config/ConfigReader.cjs +2 -0
- package/dist/cjs/config/ConfigReader.cjs.map +1 -0
- package/dist/cjs/config/ConfigStore.cjs +2 -0
- package/dist/cjs/config/ConfigStore.cjs.map +1 -0
- package/dist/cjs/config/ScopedSettingsImplementation.cjs +2 -0
- package/dist/cjs/config/ScopedSettingsImplementation.cjs.map +1 -0
- package/dist/cjs/config/helpers/freezeDeep.cjs +2 -0
- package/dist/cjs/config/helpers/freezeDeep.cjs.map +1 -0
- package/dist/cjs/hooks/useAppSetting.cjs +2 -0
- package/dist/cjs/hooks/useAppSetting.cjs.map +1 -0
- package/dist/cjs/hooks/useAppSettings.cjs +2 -0
- package/dist/cjs/hooks/useAppSettings.cjs.map +1 -0
- package/dist/cjs/hooks/useAppSettingsContext.cjs +2 -0
- package/dist/cjs/hooks/useAppSettingsContext.cjs.map +1 -0
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/server/config/ConfigMerger.cjs +2 -0
- package/dist/cjs/server/config/ConfigMerger.cjs.map +1 -0
- package/dist/cjs/server/config/ConfigValidator.cjs +2 -0
- package/dist/cjs/server/config/ConfigValidator.cjs.map +1 -0
- package/dist/cjs/server/config/createAppSettings.cjs +2 -0
- package/dist/cjs/server/config/createAppSettings.cjs.map +1 -0
- package/dist/cjs/server/server.cjs +2 -0
- package/dist/cjs/server/server.cjs.map +1 -0
- package/dist/cjs/server/sources/AppSettingsSource.cjs +2 -0
- package/dist/cjs/server/sources/AppSettingsSource.cjs.map +1 -0
- package/dist/cjs/server/sources/EnvironmentSource.cjs +2 -0
- package/dist/cjs/server/sources/EnvironmentSource.cjs.map +1 -0
- package/dist/cjs/server/sources/MemorySource.cjs +2 -0
- package/dist/cjs/server/sources/MemorySource.cjs.map +1 -0
- package/dist/cjs/server/sources/RemoteSource.cjs +2 -0
- package/dist/cjs/server/sources/RemoteSource.cjs.map +1 -0
- package/dist/cjs/server/sources/helpers/loadJson.cjs +2 -0
- package/dist/cjs/server/sources/helpers/loadJson.cjs.map +1 -0
- package/dist/esm/cli/cli/command.mjs +2 -0
- package/dist/esm/cli/cli/command.mjs.map +1 -0
- package/dist/esm/cli/cli/handler.mjs +2 -0
- package/dist/esm/cli/cli/handler.mjs.map +1 -0
- package/dist/esm/cli/cli/index.mjs +2 -0
- package/dist/esm/cli/cli/index.mjs.map +1 -0
- package/dist/esm/components/AppSettingsProvider.mjs +3 -0
- package/dist/esm/components/AppSettingsProvider.mjs.map +1 -0
- package/dist/esm/components/Setting.mjs +3 -0
- package/dist/esm/components/Setting.mjs.map +1 -0
- package/dist/esm/config/AppSettingsImplementation.mjs +2 -0
- package/dist/esm/config/AppSettingsImplementation.mjs.map +1 -0
- package/dist/esm/config/ConfigReader.mjs +2 -0
- package/dist/esm/config/ConfigReader.mjs.map +1 -0
- package/dist/esm/config/ConfigStore.mjs +2 -0
- package/dist/esm/config/ConfigStore.mjs.map +1 -0
- package/dist/esm/config/ScopedSettingsImplementation.mjs +2 -0
- package/dist/esm/config/ScopedSettingsImplementation.mjs.map +1 -0
- package/dist/esm/config/helpers/freezeDeep.mjs +2 -0
- package/dist/esm/config/helpers/freezeDeep.mjs.map +1 -0
- package/dist/esm/hooks/useAppSetting.mjs +2 -0
- package/dist/esm/hooks/useAppSetting.mjs.map +1 -0
- package/dist/esm/hooks/useAppSettings.mjs +2 -0
- package/dist/esm/hooks/useAppSettings.mjs.map +1 -0
- package/dist/esm/hooks/useAppSettingsContext.mjs +2 -0
- package/dist/esm/hooks/useAppSettingsContext.mjs.map +1 -0
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/server/config/ConfigMerger.mjs +2 -0
- package/dist/esm/server/config/ConfigMerger.mjs.map +1 -0
- package/dist/esm/server/config/ConfigValidator.mjs +2 -0
- package/dist/esm/server/config/ConfigValidator.mjs.map +1 -0
- package/dist/esm/server/config/createAppSettings.mjs +2 -0
- package/dist/esm/server/config/createAppSettings.mjs.map +1 -0
- package/dist/esm/server/server.mjs +2 -0
- package/dist/esm/server/server.mjs.map +1 -0
- package/dist/esm/server/sources/AppSettingsSource.mjs +2 -0
- package/dist/esm/server/sources/AppSettingsSource.mjs.map +1 -0
- package/dist/esm/server/sources/EnvironmentSource.mjs +2 -0
- package/dist/esm/server/sources/EnvironmentSource.mjs.map +1 -0
- package/dist/esm/server/sources/MemorySource.mjs +2 -0
- package/dist/esm/server/sources/MemorySource.mjs.map +1 -0
- package/dist/esm/server/sources/RemoteSource.mjs +2 -0
- package/dist/esm/server/sources/RemoteSource.mjs.map +1 -0
- package/dist/esm/server/sources/helpers/loadJson.mjs +2 -0
- package/dist/esm/server/sources/helpers/loadJson.mjs.map +1 -0
- package/dist/production.analysis.txt +89 -0
- package/dist/types/cjs/__testUtils__/components/ErrorBoundary.d.cts +14 -0
- package/dist/types/cjs/__testUtils__/components/ErrorBoundary.d.cts.map +1 -0
- package/dist/types/cjs/cli/command.d.cts +7 -0
- package/dist/types/cjs/cli/command.d.cts.map +1 -0
- package/dist/types/cjs/cli/handler.d.cts +7 -0
- package/dist/types/cjs/cli/handler.d.cts.map +1 -0
- package/dist/types/cjs/cli/index.d.cts +2 -0
- package/dist/types/cjs/cli/index.d.cts.map +1 -0
- package/dist/types/cjs/components/AppSettingsProvider.d.cts +7 -0
- package/dist/types/cjs/components/AppSettingsProvider.d.cts.map +1 -0
- package/dist/types/cjs/components/Setting.d.cts +20 -0
- package/dist/types/cjs/components/Setting.d.cts.map +1 -0
- package/dist/types/cjs/config/AppSettingsImplementation.d.cts +15 -0
- package/dist/types/cjs/config/AppSettingsImplementation.d.cts.map +1 -0
- package/dist/types/cjs/config/ConfigMerger.d.cts +4 -0
- package/dist/types/cjs/config/ConfigMerger.d.cts.map +1 -0
- package/dist/types/cjs/config/ConfigReader.d.cts +14 -0
- package/dist/types/cjs/config/ConfigReader.d.cts.map +1 -0
- package/dist/types/cjs/config/ConfigStore.d.cts +6 -0
- package/dist/types/cjs/config/ConfigStore.d.cts.map +1 -0
- package/dist/types/cjs/config/ConfigValidator.d.cts +7 -0
- package/dist/types/cjs/config/ConfigValidator.d.cts.map +1 -0
- package/dist/types/cjs/config/ScopedSettingsImplementation.d.cts +13 -0
- package/dist/types/cjs/config/ScopedSettingsImplementation.d.cts.map +1 -0
- package/dist/types/cjs/config/createAppSettings.d.cts +3 -0
- package/dist/types/cjs/config/createAppSettings.d.cts.map +1 -0
- package/dist/types/cjs/config/helpers/freezeDeep.d.cts +2 -0
- package/dist/types/cjs/config/helpers/freezeDeep.d.cts.map +1 -0
- package/dist/types/cjs/hooks/useAppSetting.d.cts +6 -0
- package/dist/types/cjs/hooks/useAppSetting.d.cts.map +1 -0
- package/dist/types/cjs/hooks/useAppSettings.d.cts +6 -0
- package/dist/types/cjs/hooks/useAppSettings.d.cts.map +1 -0
- package/dist/types/cjs/hooks/useAppSettingsContext.d.cts +5 -0
- package/dist/types/cjs/hooks/useAppSettingsContext.d.cts.map +1 -0
- package/dist/types/cjs/index.d.cts +10 -0
- package/dist/types/cjs/index.d.cts.map +1 -0
- package/dist/types/cjs/server.d.cts +8 -0
- package/dist/types/cjs/server.d.cts.map +1 -0
- package/dist/types/cjs/sources/AppSettingsSource.d.cts +14 -0
- package/dist/types/cjs/sources/AppSettingsSource.d.cts.map +1 -0
- package/dist/types/cjs/sources/EnvironmentSource.d.cts +16 -0
- package/dist/types/cjs/sources/EnvironmentSource.d.cts.map +1 -0
- package/dist/types/cjs/sources/MemorySource.d.cts +12 -0
- package/dist/types/cjs/sources/MemorySource.d.cts.map +1 -0
- package/dist/types/cjs/sources/RemoteSource.d.cts +16 -0
- package/dist/types/cjs/sources/RemoteSource.d.cts.map +1 -0
- package/dist/types/cjs/sources/helpers/loadJson.d.cts +3 -0
- package/dist/types/cjs/sources/helpers/loadJson.d.cts.map +1 -0
- package/dist/types/cjs/types/AppSettings.types.d.cts +26 -0
- package/dist/types/cjs/types/AppSettings.types.d.cts.map +1 -0
- package/dist/types/cjs/types/Config.types.d.cts +12 -0
- package/dist/types/cjs/types/Config.types.d.cts.map +1 -0
- package/dist/types/cjs/types/Source.types.d.cts +5 -0
- package/dist/types/cjs/types/Source.types.d.cts.map +1 -0
- package/dist/types/esm/__testUtils__/components/ErrorBoundary.d.ts +14 -0
- package/dist/types/esm/__testUtils__/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/types/esm/cli/command.d.ts +7 -0
- package/dist/types/esm/cli/command.d.ts.map +1 -0
- package/dist/types/esm/cli/handler.d.ts +7 -0
- package/dist/types/esm/cli/handler.d.ts.map +1 -0
- package/dist/types/esm/cli/index.d.ts +2 -0
- package/dist/types/esm/cli/index.d.ts.map +1 -0
- package/dist/types/esm/components/AppSettingsProvider.d.ts +7 -0
- package/dist/types/esm/components/AppSettingsProvider.d.ts.map +1 -0
- package/dist/types/esm/components/Setting.d.ts +20 -0
- package/dist/types/esm/components/Setting.d.ts.map +1 -0
- package/dist/types/esm/config/AppSettingsImplementation.d.ts +15 -0
- package/dist/types/esm/config/AppSettingsImplementation.d.ts.map +1 -0
- package/dist/types/esm/config/ConfigMerger.d.ts +4 -0
- package/dist/types/esm/config/ConfigMerger.d.ts.map +1 -0
- package/dist/types/esm/config/ConfigReader.d.ts +14 -0
- package/dist/types/esm/config/ConfigReader.d.ts.map +1 -0
- package/dist/types/esm/config/ConfigStore.d.ts +6 -0
- package/dist/types/esm/config/ConfigStore.d.ts.map +1 -0
- package/dist/types/esm/config/ConfigValidator.d.ts +7 -0
- package/dist/types/esm/config/ConfigValidator.d.ts.map +1 -0
- package/dist/types/esm/config/ScopedSettingsImplementation.d.ts +13 -0
- package/dist/types/esm/config/ScopedSettingsImplementation.d.ts.map +1 -0
- package/dist/types/esm/config/createAppSettings.d.ts +3 -0
- package/dist/types/esm/config/createAppSettings.d.ts.map +1 -0
- package/dist/types/esm/config/helpers/freezeDeep.d.ts +2 -0
- package/dist/types/esm/config/helpers/freezeDeep.d.ts.map +1 -0
- package/dist/types/esm/hooks/useAppSetting.d.ts +6 -0
- package/dist/types/esm/hooks/useAppSetting.d.ts.map +1 -0
- package/dist/types/esm/hooks/useAppSettings.d.ts +6 -0
- package/dist/types/esm/hooks/useAppSettings.d.ts.map +1 -0
- package/dist/types/esm/hooks/useAppSettingsContext.d.ts +5 -0
- package/dist/types/esm/hooks/useAppSettingsContext.d.ts.map +1 -0
- package/dist/types/esm/index.d.ts +10 -0
- package/dist/types/esm/index.d.ts.map +1 -0
- package/dist/types/esm/server.d.ts +8 -0
- package/dist/types/esm/server.d.ts.map +1 -0
- package/dist/types/esm/sources/AppSettingsSource.d.ts +14 -0
- package/dist/types/esm/sources/AppSettingsSource.d.ts.map +1 -0
- package/dist/types/esm/sources/EnvironmentSource.d.ts +16 -0
- package/dist/types/esm/sources/EnvironmentSource.d.ts.map +1 -0
- package/dist/types/esm/sources/MemorySource.d.ts +12 -0
- package/dist/types/esm/sources/MemorySource.d.ts.map +1 -0
- package/dist/types/esm/sources/RemoteSource.d.ts +16 -0
- package/dist/types/esm/sources/RemoteSource.d.ts.map +1 -0
- package/dist/types/esm/sources/helpers/loadJson.d.ts +3 -0
- package/dist/types/esm/sources/helpers/loadJson.d.ts.map +1 -0
- package/dist/types/esm/types/AppSettings.types.d.ts +26 -0
- package/dist/types/esm/types/AppSettings.types.d.ts.map +1 -0
- package/dist/types/esm/types/Config.types.d.ts +12 -0
- package/dist/types/esm/types/Config.types.d.ts.map +1 -0
- package/dist/types/esm/types/Source.types.d.ts +5 -0
- package/dist/types/esm/types/Source.types.d.ts.map +1 -0
- package/dist/types/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +85 -3
- package/rollup.config.mjs +25 -0
- package/src/__testUtils__/AppSettingsSchema.d.ts +9 -0
- package/src/__testUtils__/components/ErrorBoundary.tsx +25 -0
- package/src/cli/command.test.ts +36 -0
- package/src/cli/command.ts +33 -0
- package/src/cli/handler.test.ts +61 -0
- package/src/cli/handler.ts +58 -0
- package/src/cli/index.test.ts +45 -0
- package/src/cli/index.ts +13 -0
- package/src/components/AppSettingsProvider.test.tsx +25 -0
- package/src/components/AppSettingsProvider.tsx +18 -0
- package/src/components/Setting.test.tsx +59 -0
- package/src/components/Setting.tsx +43 -0
- package/src/config/AppSettingsImplementation.test.ts +65 -0
- package/src/config/AppSettingsImplementation.ts +61 -0
- package/src/config/ConfigMerger.test.ts +44 -0
- package/src/config/ConfigMerger.ts +9 -0
- package/src/config/ConfigReader.test.ts +56 -0
- package/src/config/ConfigReader.ts +45 -0
- package/src/config/ConfigStore.test.ts +32 -0
- package/src/config/ConfigStore.ts +12 -0
- package/src/config/ConfigValidator.test.ts +30 -0
- package/src/config/ConfigValidator.ts +13 -0
- package/src/config/ScopedSettingsImplementation.test.ts +31 -0
- package/src/config/ScopedSettingsImplementation.ts +36 -0
- package/src/config/createAppSettings.test.ts +84 -0
- package/src/config/createAppSettings.ts +18 -0
- package/src/config/helpers/freezeDeep.test.ts +41 -0
- package/src/config/helpers/freezeDeep.ts +15 -0
- package/src/hooks/useAppSetting.test.tsx +37 -0
- package/src/hooks/useAppSetting.ts +14 -0
- package/src/hooks/useAppSettings.test.tsx +37 -0
- package/src/hooks/useAppSettings.ts +17 -0
- package/src/hooks/useAppSettingsContext.test.tsx +45 -0
- package/src/hooks/useAppSettingsContext.ts +17 -0
- package/src/index.ts +11 -0
- package/src/server.ts +7 -0
- package/src/sources/AppSettingsSource.test.ts +61 -0
- package/src/sources/AppSettingsSource.ts +30 -0
- package/src/sources/EnvironmentSource.test.ts +45 -0
- package/src/sources/EnvironmentSource.ts +87 -0
- package/src/sources/MemorySource.test.ts +31 -0
- package/src/sources/MemorySource.ts +21 -0
- package/src/sources/RemoteSource.test.ts +80 -0
- package/src/sources/RemoteSource.ts +50 -0
- package/src/sources/helpers/loadJson.test.ts +74 -0
- package/src/sources/helpers/loadJson.ts +29 -0
- package/src/types/AppSettings.types.test.ts +61 -0
- package/src/types/AppSettings.types.ts +30 -0
- package/src/types/Config.types.test.ts +36 -0
- package/src/types/Config.types.ts +27 -0
- package/src/types/Source.types.ts +4 -0
- package/tsconfig.build.json +10 -0
- package/tsconfig.json +10 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Get } from 'type-fest';
|
|
2
|
+
import { type ZodType } from 'zod';
|
|
3
|
+
import { type SettingPath, type SettingSectionPath } from './Config.types.ts';
|
|
4
|
+
import { type SettingsSource } from './Source.types.ts';
|
|
5
|
+
|
|
6
|
+
export interface AppSettings<T extends object> {
|
|
7
|
+
get<P extends SettingPath<T>>(path: P): Get<T, P> | undefined;
|
|
8
|
+
getAll(): Readonly<T>;
|
|
9
|
+
getOrThrow<P extends SettingPath<T>>(path: P): Get<T, P>;
|
|
10
|
+
getSection<P extends SettingSectionPath<T>>(path: P): Get<T, P> | undefined;
|
|
11
|
+
has(path: SettingPath<T> | SettingSectionPath<T>): boolean;
|
|
12
|
+
scope<P extends SettingSectionPath<T>>(path: P): ScopedSettings<Extract<Get<T, P>, object>>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Internal dynamic lookup used by React bindings.
|
|
16
|
+
export interface InternalAppSettings<T extends object> extends AppSettings<T> {
|
|
17
|
+
read(path: string): unknown;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface ScopedSettings<T extends object = Record<string, unknown>> {
|
|
21
|
+
get<P extends SettingPath<T>>(path: P): Get<T, P> | undefined;
|
|
22
|
+
getAll(): Readonly<T>;
|
|
23
|
+
getOrThrow<P extends SettingPath<T>>(path: P): Get<T, P>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface CreateAppSettingsOptions<T extends object> {
|
|
27
|
+
defaults: Partial<T>;
|
|
28
|
+
schema: ZodType<T>;
|
|
29
|
+
sources?: readonly SettingsSource[];
|
|
30
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, it } from '@jest/globals';
|
|
2
|
+
import { type SettingPath, type SettingSectionPath, type SettingValue } from './Config.types.ts';
|
|
3
|
+
|
|
4
|
+
type ExampleSettings = {
|
|
5
|
+
Api: { BaseUrl: string; Retry: { Count: number }; Timeout: number };
|
|
6
|
+
Features: { DarkMode: boolean };
|
|
7
|
+
Tags: readonly string[];
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
describe('configuration path types', () => {
|
|
11
|
+
it('When paths are declared, then leaf and section paths accept the appropriate settings paths', () => {
|
|
12
|
+
// Arrange
|
|
13
|
+
const leafPaths: SettingPath<ExampleSettings>[] = [
|
|
14
|
+
'Api.BaseUrl',
|
|
15
|
+
'Api.Retry.Count',
|
|
16
|
+
'Api.Timeout',
|
|
17
|
+
'Features.DarkMode',
|
|
18
|
+
'Tags',
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const sectionPaths: SettingSectionPath<ExampleSettings>[] = ['Api', 'Api.Retry', 'Features'];
|
|
22
|
+
const timeout: SettingValue<ExampleSettings, 'Api.Timeout'> = 5000;
|
|
23
|
+
const retryCount: SettingValue<ExampleSettings['Api']['Retry'], 'Count'> = 3;
|
|
24
|
+
|
|
25
|
+
// Act
|
|
26
|
+
const paths = { leafPaths, retryCount, sectionPaths, timeout };
|
|
27
|
+
|
|
28
|
+
// Assert
|
|
29
|
+
expect(paths).toEqual({
|
|
30
|
+
leafPaths: ['Api.BaseUrl', 'Api.Retry.Count', 'Api.Timeout', 'Features.DarkMode', 'Tags'],
|
|
31
|
+
retryCount: 3,
|
|
32
|
+
sectionPaths: ['Api', 'Api.Retry', 'Features'],
|
|
33
|
+
timeout: 5000,
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Get } from 'type-fest';
|
|
2
|
+
|
|
3
|
+
type Primitive = string | number | boolean | bigint | symbol | null | undefined;
|
|
4
|
+
|
|
5
|
+
type PreviousDepth = [never, 0, 1, 2, 3, 4, 5];
|
|
6
|
+
|
|
7
|
+
export type SettingPath<T extends object, Depth extends number = 5> = Depth extends 0
|
|
8
|
+
? never
|
|
9
|
+
: {
|
|
10
|
+
[K in Extract<keyof T, string>]: T[K] extends Primitive | readonly Primitive[]
|
|
11
|
+
? K
|
|
12
|
+
: T[K] extends object
|
|
13
|
+
? `${K}.${SettingPath<T[K], PreviousDepth[Depth]>}`
|
|
14
|
+
: K;
|
|
15
|
+
}[Extract<keyof T, string>];
|
|
16
|
+
|
|
17
|
+
export type SettingSectionPath<T extends object, Depth extends number = 5> = Depth extends 0
|
|
18
|
+
? never
|
|
19
|
+
: {
|
|
20
|
+
[K in Extract<keyof T, string>]: T[K] extends Primitive | readonly Primitive[]
|
|
21
|
+
? never
|
|
22
|
+
: T[K] extends object
|
|
23
|
+
? K | `${K}.${SettingSectionPath<T[K], PreviousDepth[Depth]>}`
|
|
24
|
+
: never;
|
|
25
|
+
}[Extract<keyof T, string>];
|
|
26
|
+
|
|
27
|
+
export type SettingValue<T extends object, P extends SettingPath<T>> = Get<T, P>;
|