@danceroutine/tango-config 0.1.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.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Bundled exports for Django-style domain drill-down imports, plus curated
3
+ * top-level symbols for TS-native ergonomic imports.
4
+ */
5
+ export * as schema from './schema/index';
6
+ export * as loader from './loader/index';
7
+ export { defineConfig, loadConfig, type LoadedConfig } from './loader/index';
8
+ export type { AdapterName, DbConfig, EnvConfig, EnvName, MigrationsConfig, TangoConfig } from './schema/index';
9
+ export { AdapterNameSchema, DbConfigSchema, EnvConfigSchema, MigrationsConfigSchema, TangoConfigSchema, } from './schema/index';
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ import { AdapterNameSchema, DbConfigSchema, EnvConfigSchema, MigrationsConfigSchema, TangoConfigSchema, schema_exports } from "./schema-D6LCZS5E.js";
2
+ import { defineConfig, loadConfig, loader_exports } from "./loader-De9vxa5D.js";
3
+
4
+ export { AdapterNameSchema, DbConfigSchema, EnvConfigSchema, MigrationsConfigSchema, TangoConfigSchema, defineConfig, loadConfig, loader_exports as loader, schema_exports as schema };
@@ -0,0 +1,6 @@
1
+ import type { EnvConfig, EnvName, TangoConfig } from '../schema/index';
2
+ export interface LoadedConfig {
3
+ cfg: TangoConfig;
4
+ env: EnvName;
5
+ current: EnvConfig;
6
+ }
@@ -0,0 +1,2 @@
1
+ import { type TangoConfig } from '../schema/index';
2
+ export declare function defineConfig(cfg: unknown): TangoConfig;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Domain boundary barrel: centralizes this subdomain's public contract.
3
+ */
4
+ export type { LoadedConfig } from './LoadedConfig';
5
+ export { defineConfig } from './defineConfig';
6
+ export { loadConfig } from './loadConfig';
@@ -0,0 +1,4 @@
1
+ import "../schema-D6LCZS5E.js";
2
+ import { defineConfig, loadConfig } from "../loader-De9vxa5D.js";
3
+
4
+ export { defineConfig, loadConfig };
@@ -0,0 +1,2 @@
1
+ import type { LoadedConfig } from './LoadedConfig';
2
+ export declare function loadConfig(fromFile: () => unknown): LoadedConfig;
@@ -0,0 +1,48 @@
1
+ import { TangoConfigSchema, __export } from "./schema-D6LCZS5E.js";
2
+ import { config as loadDotEnv } from "dotenv";
3
+
4
+ //#region src/loader/defineConfig.ts
5
+ function defineConfig(cfg) {
6
+ return TangoConfigSchema.parse(cfg);
7
+ }
8
+
9
+ //#endregion
10
+ //#region src/loader/loadConfig.ts
11
+ function loadConfig(fromFile) {
12
+ loadDotEnv();
13
+ const cfg = TangoConfigSchema.parse(fromFile());
14
+ const env = cfg.current;
15
+ const current = mergeEnvOverrides(cfg.environments[env]);
16
+ return {
17
+ cfg,
18
+ env,
19
+ current
20
+ };
21
+ }
22
+ function mergeEnvOverrides(envCfg) {
23
+ const result = structuredClone(envCfg);
24
+ const env = process.env;
25
+ if (env.TANGO_DB_ADAPTER) result.db.adapter = env.TANGO_DB_ADAPTER;
26
+ if (env.DATABASE_URL || env.TANGO_DATABASE_URL) result.db.url = env.TANGO_DATABASE_URL || env.DATABASE_URL;
27
+ if (env.TANGO_DB_HOST) result.db.host = env.TANGO_DB_HOST;
28
+ if (env.TANGO_DB_PORT) result.db.port = Number(env.TANGO_DB_PORT);
29
+ if (env.TANGO_DB_NAME) result.db.database = env.TANGO_DB_NAME;
30
+ if (env.TANGO_DB_USER) result.db.user = env.TANGO_DB_USER;
31
+ if (env.TANGO_DB_PASSWORD) result.db.password = env.TANGO_DB_PASSWORD;
32
+ if (env.TANGO_SQLITE_FILENAME) result.db.filename = env.TANGO_SQLITE_FILENAME;
33
+ if (env.TANGO_MIGRATIONS_DIR) result.migrations.dir = env.TANGO_MIGRATIONS_DIR;
34
+ if (env.TANGO_MIGRATIONS_ONLINE) result.migrations.online = env.TANGO_MIGRATIONS_ONLINE === "true";
35
+ return result;
36
+ }
37
+
38
+ //#endregion
39
+ //#region src/loader/index.ts
40
+ var loader_exports = {};
41
+ __export(loader_exports, {
42
+ defineConfig: () => defineConfig,
43
+ loadConfig: () => loadConfig
44
+ });
45
+
46
+ //#endregion
47
+ export { defineConfig, loadConfig, loader_exports };
48
+ //# sourceMappingURL=loader-De9vxa5D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader-De9vxa5D.js","names":["cfg: unknown","fromFile: () => unknown","envCfg: EnvConfig"],"sources":["../src/loader/defineConfig.ts","../src/loader/loadConfig.ts","../src/loader/index.ts"],"sourcesContent":["import { TangoConfigSchema, type TangoConfig } from '../schema/index';\n\nexport function defineConfig(cfg: unknown): TangoConfig {\n return TangoConfigSchema.parse(cfg) as TangoConfig;\n}\n","import { config as loadDotEnv } from 'dotenv';\nimport { TangoConfigSchema, type EnvConfig, type TangoConfig } from '../schema/index';\nimport type { LoadedConfig } from './LoadedConfig';\n\nexport function loadConfig(fromFile: () => unknown): LoadedConfig {\n loadDotEnv();\n\n const cfg = TangoConfigSchema.parse(fromFile()) as TangoConfig;\n const env = cfg.current;\n const current = mergeEnvOverrides(cfg.environments[env]);\n\n return { cfg, env, current };\n}\n\nfunction mergeEnvOverrides(envCfg: EnvConfig): EnvConfig {\n const result = structuredClone(envCfg);\n const env = process.env;\n\n if (env.TANGO_DB_ADAPTER) {\n result.db.adapter = env.TANGO_DB_ADAPTER as 'postgres' | 'sqlite';\n }\n\n if (env.DATABASE_URL || env.TANGO_DATABASE_URL) {\n result.db.url = env.TANGO_DATABASE_URL || env.DATABASE_URL;\n }\n\n if (env.TANGO_DB_HOST) result.db.host = env.TANGO_DB_HOST;\n if (env.TANGO_DB_PORT) result.db.port = Number(env.TANGO_DB_PORT);\n if (env.TANGO_DB_NAME) result.db.database = env.TANGO_DB_NAME;\n if (env.TANGO_DB_USER) result.db.user = env.TANGO_DB_USER;\n if (env.TANGO_DB_PASSWORD) result.db.password = env.TANGO_DB_PASSWORD;\n if (env.TANGO_SQLITE_FILENAME) result.db.filename = env.TANGO_SQLITE_FILENAME;\n\n if (env.TANGO_MIGRATIONS_DIR) result.migrations.dir = env.TANGO_MIGRATIONS_DIR;\n if (env.TANGO_MIGRATIONS_ONLINE) {\n result.migrations.online = env.TANGO_MIGRATIONS_ONLINE === 'true';\n }\n\n return result;\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport type { LoadedConfig } from './LoadedConfig';\nexport { defineConfig } from './defineConfig';\nexport { loadConfig } from './loadConfig';\n"],"mappings":";;;;AAEO,SAAS,aAAaA,KAA2B;AACpD,QAAO,kBAAkB,MAAM,IAAI;AACtC;;;;ACAM,SAAS,WAAWC,UAAuC;AAC9D,aAAY;CAEZ,MAAM,MAAM,kBAAkB,MAAM,UAAU,CAAC;CAC/C,MAAM,MAAM,IAAI;CAChB,MAAM,UAAU,kBAAkB,IAAI,aAAa,KAAK;AAExD,QAAO;EAAE;EAAK;EAAK;CAAS;AAC/B;AAED,SAAS,kBAAkBC,QAA8B;CACrD,MAAM,SAAS,gBAAgB,OAAO;CACtC,MAAM,MAAM,QAAQ;AAEpB,KAAI,IAAI,iBACJ,QAAO,GAAG,UAAU,IAAI;AAG5B,KAAI,IAAI,gBAAgB,IAAI,mBACxB,QAAO,GAAG,MAAM,IAAI,sBAAsB,IAAI;AAGlD,KAAI,IAAI,cAAe,QAAO,GAAG,OAAO,IAAI;AAC5C,KAAI,IAAI,cAAe,QAAO,GAAG,OAAO,OAAO,IAAI,cAAc;AACjE,KAAI,IAAI,cAAe,QAAO,GAAG,WAAW,IAAI;AAChD,KAAI,IAAI,cAAe,QAAO,GAAG,OAAO,IAAI;AAC5C,KAAI,IAAI,kBAAmB,QAAO,GAAG,WAAW,IAAI;AACpD,KAAI,IAAI,sBAAuB,QAAO,GAAG,WAAW,IAAI;AAExD,KAAI,IAAI,qBAAsB,QAAO,WAAW,MAAM,IAAI;AAC1D,KAAI,IAAI,wBACJ,QAAO,WAAW,SAAS,IAAI,4BAA4B;AAG/D,QAAO;AACV"}
@@ -0,0 +1,3 @@
1
+ import { z } from 'zod';
2
+ export type AdapterName = 'postgres' | 'sqlite';
3
+ export declare const AdapterNameSchema: z.ZodTypeAny;
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ import { type AdapterName } from './AdapterName';
3
+ export type DbConfig = {
4
+ adapter: AdapterName;
5
+ url?: string;
6
+ host?: string;
7
+ port?: number;
8
+ database?: string;
9
+ user?: string;
10
+ password?: string;
11
+ filename?: string;
12
+ maxConnections: number;
13
+ };
14
+ export declare const DbConfigSchema: z.ZodTypeAny;
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ import { type DbConfig } from './DbConfig';
3
+ import { type MigrationsConfig } from './MigrationsConfig';
4
+ export type EnvName = 'development' | 'test' | 'production';
5
+ export type EnvConfig = {
6
+ name: EnvName;
7
+ db: DbConfig;
8
+ migrations: MigrationsConfig;
9
+ };
10
+ export declare const EnvConfigSchema: z.ZodTypeAny;
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ export type MigrationsConfig = {
3
+ dir: string;
4
+ online: boolean;
5
+ };
6
+ export declare const MigrationsConfigSchema: z.ZodTypeAny;
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ import { type EnvConfig, type EnvName } from './EnvConfig';
3
+ export type TangoConfig = {
4
+ current: EnvName;
5
+ environments: {
6
+ development: EnvConfig;
7
+ test: EnvConfig;
8
+ production: EnvConfig;
9
+ };
10
+ };
11
+ export declare const TangoConfigSchema: z.ZodTypeAny;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Domain boundary barrel: centralizes this subdomain's public contract.
3
+ */
4
+ export type { AdapterName } from './AdapterName';
5
+ export { AdapterNameSchema } from './AdapterName';
6
+ export type { DbConfig } from './DbConfig';
7
+ export { DbConfigSchema } from './DbConfig';
8
+ export type { MigrationsConfig } from './MigrationsConfig';
9
+ export { MigrationsConfigSchema } from './MigrationsConfig';
10
+ export type { EnvConfig, EnvName } from './EnvConfig';
11
+ export { EnvConfigSchema } from './EnvConfig';
12
+ export type { TangoConfig } from './TangoConfig';
13
+ export { TangoConfigSchema } from './TangoConfig';
@@ -0,0 +1,3 @@
1
+ import { AdapterNameSchema, DbConfigSchema, EnvConfigSchema, MigrationsConfigSchema, TangoConfigSchema } from "../schema-D6LCZS5E.js";
2
+
3
+ export { AdapterNameSchema, DbConfigSchema, EnvConfigSchema, MigrationsConfigSchema, TangoConfigSchema };
@@ -0,0 +1,80 @@
1
+ import { z, z as z$1, z as z$2, z as z$3, z as z$4 } from "zod";
2
+
3
+ //#region rolldown:runtime
4
+ var __defProp = Object.defineProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all) __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: true
9
+ });
10
+ };
11
+
12
+ //#endregion
13
+ //#region src/schema/AdapterName.ts
14
+ const AdapterNameSchema = z$4.enum(["postgres", "sqlite"]);
15
+
16
+ //#endregion
17
+ //#region src/schema/DbConfig.ts
18
+ const DbConfigSchema = z$3.object({
19
+ adapter: AdapterNameSchema,
20
+ url: z$3.string().optional(),
21
+ host: z$3.string().optional(),
22
+ port: z$3.coerce.number().optional(),
23
+ database: z$3.string().optional(),
24
+ user: z$3.string().optional(),
25
+ password: z$3.string().optional(),
26
+ filename: z$3.string().optional(),
27
+ maxConnections: z$3.coerce.number().default(10)
28
+ });
29
+
30
+ //#endregion
31
+ //#region src/schema/MigrationsConfig.ts
32
+ const MigrationsConfigSchema = z$2.object({
33
+ dir: z$2.string().default("migrations"),
34
+ online: z$2.boolean().default(false)
35
+ });
36
+
37
+ //#endregion
38
+ //#region src/schema/EnvConfig.ts
39
+ const EnvConfigSchema = z$1.object({
40
+ name: z$1.enum([
41
+ "development",
42
+ "test",
43
+ "production"
44
+ ]),
45
+ db: DbConfigSchema,
46
+ migrations: MigrationsConfigSchema.default({
47
+ dir: "migrations",
48
+ online: false
49
+ })
50
+ });
51
+
52
+ //#endregion
53
+ //#region src/schema/TangoConfig.ts
54
+ const TangoConfigSchema = z.object({
55
+ current: z.enum([
56
+ "development",
57
+ "test",
58
+ "production"
59
+ ]).default("development"),
60
+ environments: z.object({
61
+ development: EnvConfigSchema,
62
+ test: EnvConfigSchema,
63
+ production: EnvConfigSchema
64
+ })
65
+ });
66
+
67
+ //#endregion
68
+ //#region src/schema/index.ts
69
+ var schema_exports = {};
70
+ __export(schema_exports, {
71
+ AdapterNameSchema: () => AdapterNameSchema,
72
+ DbConfigSchema: () => DbConfigSchema,
73
+ EnvConfigSchema: () => EnvConfigSchema,
74
+ MigrationsConfigSchema: () => MigrationsConfigSchema,
75
+ TangoConfigSchema: () => TangoConfigSchema
76
+ });
77
+
78
+ //#endregion
79
+ export { AdapterNameSchema, DbConfigSchema, EnvConfigSchema, MigrationsConfigSchema, TangoConfigSchema, __export, schema_exports };
80
+ //# sourceMappingURL=schema-D6LCZS5E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-D6LCZS5E.js","names":["AdapterNameSchema: z.ZodTypeAny","DbConfigSchema: z.ZodTypeAny","MigrationsConfigSchema: z.ZodTypeAny","EnvConfigSchema: z.ZodTypeAny","TangoConfigSchema: z.ZodTypeAny"],"sources":["../src/schema/AdapterName.ts","../src/schema/DbConfig.ts","../src/schema/MigrationsConfig.ts","../src/schema/EnvConfig.ts","../src/schema/TangoConfig.ts","../src/schema/index.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type AdapterName = 'postgres' | 'sqlite';\n\nexport const AdapterNameSchema: z.ZodTypeAny = z.enum(['postgres', 'sqlite']);\n","import { z } from 'zod';\nimport { AdapterNameSchema, type AdapterName } from './AdapterName';\n\nexport type DbConfig = {\n adapter: AdapterName;\n url?: string;\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n filename?: string;\n maxConnections: number;\n};\n\nexport const DbConfigSchema: z.ZodTypeAny = z.object({\n adapter: AdapterNameSchema,\n url: z.string().optional(),\n host: z.string().optional(),\n port: z.coerce.number().optional(),\n database: z.string().optional(),\n user: z.string().optional(),\n password: z.string().optional(),\n filename: z.string().optional(),\n maxConnections: z.coerce.number().default(10),\n});\n","import { z } from 'zod';\n\nexport type MigrationsConfig = {\n dir: string;\n online: boolean;\n};\n\nexport const MigrationsConfigSchema: z.ZodTypeAny = z.object({\n dir: z.string().default('migrations'),\n online: z.boolean().default(false),\n});\n","import { z } from 'zod';\nimport { DbConfigSchema, type DbConfig } from './DbConfig';\nimport { MigrationsConfigSchema, type MigrationsConfig } from './MigrationsConfig';\n\nexport type EnvName = 'development' | 'test' | 'production';\n\nexport type EnvConfig = {\n name: EnvName;\n db: DbConfig;\n migrations: MigrationsConfig;\n};\n\nexport const EnvConfigSchema: z.ZodTypeAny = z.object({\n name: z.enum(['development', 'test', 'production']),\n db: DbConfigSchema,\n migrations: MigrationsConfigSchema.default({\n dir: 'migrations',\n online: false,\n }),\n});\n","import { z } from 'zod';\nimport { EnvConfigSchema, type EnvConfig, type EnvName } from './EnvConfig';\n\nexport type TangoConfig = {\n current: EnvName;\n environments: {\n development: EnvConfig;\n test: EnvConfig;\n production: EnvConfig;\n };\n};\n\nexport const TangoConfigSchema: z.ZodTypeAny = z.object({\n current: z.enum(['development', 'test', 'production']).default('development'),\n environments: z.object({\n development: EnvConfigSchema,\n test: EnvConfigSchema,\n production: EnvConfigSchema,\n }),\n});\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport type { AdapterName } from './AdapterName';\nexport { AdapterNameSchema } from './AdapterName';\n\nexport type { DbConfig } from './DbConfig';\nexport { DbConfigSchema } from './DbConfig';\n\nexport type { MigrationsConfig } from './MigrationsConfig';\nexport { MigrationsConfigSchema } from './MigrationsConfig';\n\nexport type { EnvConfig, EnvName } from './EnvConfig';\nexport { EnvConfigSchema } from './EnvConfig';\n\nexport type { TangoConfig } from './TangoConfig';\nexport { TangoConfigSchema } from './TangoConfig';\n"],"mappings":";;;;;;;;;;;;;MAIaA,oBAAkC,IAAE,KAAK,CAAC,YAAY,QAAS,EAAC;;;;MCWhEC,iBAA+B,IAAE,OAAO;CACjD,SAAS;CACT,KAAK,IAAE,QAAQ,CAAC,UAAU;CAC1B,MAAM,IAAE,QAAQ,CAAC,UAAU;CAC3B,MAAM,IAAE,OAAO,QAAQ,CAAC,UAAU;CAClC,UAAU,IAAE,QAAQ,CAAC,UAAU;CAC/B,MAAM,IAAE,QAAQ,CAAC,UAAU;CAC3B,UAAU,IAAE,QAAQ,CAAC,UAAU;CAC/B,UAAU,IAAE,QAAQ,CAAC,UAAU;CAC/B,gBAAgB,IAAE,OAAO,QAAQ,CAAC,QAAQ,GAAG;AAChD,EAAC;;;;MClBWC,yBAAuC,IAAE,OAAO;CACzD,KAAK,IAAE,QAAQ,CAAC,QAAQ,aAAa;CACrC,QAAQ,IAAE,SAAS,CAAC,QAAQ,MAAM;AACrC,EAAC;;;;MCEWC,kBAAgC,IAAE,OAAO;CAClD,MAAM,IAAE,KAAK;EAAC;EAAe;EAAQ;CAAa,EAAC;CACnD,IAAI;CACJ,YAAY,uBAAuB,QAAQ;EACvC,KAAK;EACL,QAAQ;CACX,EAAC;AACL,EAAC;;;;MCPWC,oBAAkC,EAAE,OAAO;CACpD,SAAS,EAAE,KAAK;EAAC;EAAe;EAAQ;CAAa,EAAC,CAAC,QAAQ,cAAc;CAC7E,cAAc,EAAE,OAAO;EACnB,aAAa;EACb,MAAM;EACN,YAAY;CACf,EAAC;AACL,EAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@danceroutine/tango-config",
3
+ "version": "0.1.0",
4
+ "description": "Configuration loader with environment profiles for Tango",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./schema": {
14
+ "types": "./dist/schema/index.d.ts",
15
+ "import": "./dist/schema/index.js"
16
+ },
17
+ "./loader": {
18
+ "types": "./dist/loader/index.d.ts",
19
+ "import": "./dist/loader/index.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsdown",
27
+ "test": "vitest run --coverage",
28
+ "test:watch": "vitest",
29
+ "typecheck": "tsc --noEmit"
30
+ },
31
+ "keywords": [
32
+ "tango",
33
+ "config",
34
+ "environment",
35
+ "database"
36
+ ],
37
+ "author": "Pedro Del Moral Lopez",
38
+ "license": "MIT",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "https://github.com/danceroutine/tango.git",
42
+ "directory": "packages/config"
43
+ },
44
+ "dependencies": {
45
+ "dotenv": "^16.4.7",
46
+ "zod": "^4.0.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^22.9.0",
50
+ "tsdown": "^0.4.0",
51
+ "typescript": "^5.6.3",
52
+ "vitest": "^4.0.6"
53
+ }
54
+ }