@magidoc/plugin-starter-variables 0.9.3 → 0.10.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/build/variables/converters/boolean.d.ts +2 -0
- package/build/variables/converters/boolean.js +26 -0
- package/build/variables/converters/boolean.js.map +1 -0
- package/build/variables/converters/index.d.ts +4 -0
- package/build/variables/converters/record.d.ts +2 -0
- package/build/variables/converters/record.js +27 -0
- package/build/variables/converters/record.js.map +1 -0
- package/build/variables/converters/string.d.ts +2 -0
- package/build/variables/converters/string.js +15 -0
- package/build/variables/converters/string.js.map +1 -0
- package/build/variables/magidoc.js +3 -2
- package/build/variables/magidoc.js.map +1 -1
- package/build/variables/templates.d.ts +1 -0
- package/build/variables/templates.js +6 -3
- package/build/variables/templates.js.map +1 -1
- package/build/variables/variable.d.ts +14 -4
- package/build/variables/variable.js +8 -31
- package/build/variables/variable.js.map +1 -1
- package/package.json +4 -1
- package/src/variables/converters/boolean.ts +24 -0
- package/src/variables/converters/index.ts +5 -0
- package/src/variables/converters/record.ts +29 -0
- package/src/variables/converters/string.ts +15 -0
- package/src/variables/magidoc.ts +3 -2
- package/src/variables/templates.ts +8 -3
- package/src/variables/variable.ts +27 -34
- package/tests/index.spec.ts +43 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
function booleanConverter() {
|
|
2
|
+
return {
|
|
3
|
+
convert: (target) => {
|
|
4
|
+
if (target === null)
|
|
5
|
+
return null;
|
|
6
|
+
if (target === undefined)
|
|
7
|
+
return null;
|
|
8
|
+
switch (typeof target) {
|
|
9
|
+
case 'boolean':
|
|
10
|
+
return target;
|
|
11
|
+
case 'string':
|
|
12
|
+
const lowerCase = target.toLowerCase().trim();
|
|
13
|
+
return lowerCase === 'true' || lowerCase === 't' || lowerCase === '1';
|
|
14
|
+
case 'number':
|
|
15
|
+
return target !== 0;
|
|
16
|
+
default:
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
asString: (value) => String(value),
|
|
21
|
+
type: (z) => z.boolean().optional(),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { booleanConverter };
|
|
26
|
+
//# sourceMappingURL=boolean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean.js","sources":["../../../../src/variables/converters/boolean.ts"],"sourcesContent":[null],"names":[],"mappings":"SAEgB,gBAAgB,GAAA;IAC9B,OAAO;AACL,QAAA,OAAO,EAAE,CAAC,MAAe,KAAoB;YAC3C,IAAI,MAAM,KAAK,IAAI;AAAE,gBAAA,OAAO,IAAI,CAAA;YAChC,IAAI,MAAM,KAAK,SAAS;AAAE,gBAAA,OAAO,IAAI,CAAA;YAErC,QAAQ,OAAO,MAAM;AACnB,gBAAA,KAAK,SAAS;AACZ,oBAAA,OAAO,MAAM,CAAA;AACf,gBAAA,KAAK,QAAQ;oBACX,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;oBAC7C,OAAO,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,CAAA;AACvE,gBAAA,KAAK,QAAQ;oBACX,OAAO,MAAM,KAAK,CAAC,CAAA;AACrB,gBAAA;AACE,oBAAA,OAAO,IAAI,CAAA;AACd,aAAA;SACF;QACD,QAAQ,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KACpC,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function recordConverter(valueType) {
|
|
2
|
+
return {
|
|
3
|
+
convert: (target) => {
|
|
4
|
+
if (typeof target === 'object') {
|
|
5
|
+
return target;
|
|
6
|
+
}
|
|
7
|
+
if (typeof target === 'string') {
|
|
8
|
+
try {
|
|
9
|
+
const result = JSON.parse(target);
|
|
10
|
+
if (typeof result !== 'object') {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
},
|
|
21
|
+
asString: (value) => JSON.stringify(value),
|
|
22
|
+
type: (z) => z.record(valueType(z).optional()).optional(),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { recordConverter };
|
|
27
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","sources":["../../../../src/variables/converters/record.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEM,SAAU,eAAe,CAC7B,SAA6B,EAAA;IAE7B,OAAO;AACL,QAAA,OAAO,EAAE,CAAC,MAAM,KAAI;AAClB,YAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,gBAAA,OAAO,MAA2B,CAAA;AACnC,aAAA;AAED,YAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;gBAC9B,IAAI;oBACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAsB,CAAA;AACtD,oBAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,wBAAA,OAAO,IAAI,CAAA;AACZ,qBAAA;AACD,oBAAA,OAAO,MAAM,CAAA;AACd,iBAAA;gBAAC,MAAM;AACN,oBAAA,OAAO,IAAI,CAAA;AACZ,iBAAA;AACF,aAAA;AAED,YAAA,OAAO,IAAI,CAAA;SACZ;QACD,QAAQ,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC1C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;KAC1D,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
function stringConverter() {
|
|
2
|
+
return {
|
|
3
|
+
convert: (target) => {
|
|
4
|
+
if (target === null || target === undefined || target === '') {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
return String(target);
|
|
8
|
+
},
|
|
9
|
+
asString: (value) => String(value),
|
|
10
|
+
type: (z) => z.string().optional(),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { stringConverter };
|
|
15
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","sources":["../../../../src/variables/converters/string.ts"],"sourcesContent":[null],"names":[],"mappings":"SAEgB,eAAe,GAAA;IAC7B,OAAO;AACL,QAAA,OAAO,EAAE,CAAC,MAAe,KAAmB;YAC1C,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE;AAC5D,gBAAA,OAAO,IAAI,CAAA;AACZ,aAAA;AAED,YAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;SACtB;QACD,QAAQ,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACnC,CAAA;AACH;;;;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { booleanConverter } from './converters/boolean.js';
|
|
2
|
+
import { createVariable } from './variable.js';
|
|
2
3
|
|
|
3
4
|
var magidoc = {
|
|
4
|
-
MAGIDOC_GENERATE: createVariable('MAGIDOC_GENERATE',
|
|
5
|
+
MAGIDOC_GENERATE: createVariable('MAGIDOC_GENERATE', booleanConverter()),
|
|
5
6
|
};
|
|
6
7
|
|
|
7
8
|
export { magidoc as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magidoc.js","sources":["../../../src/variables/magidoc.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"magidoc.js","sources":["../../../src/variables/magidoc.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGA,cAAe;AACb,IAAA,gBAAgB,EAAE,cAAc,CAC9B,kBAAkB,EAClB,gBAAgB,EAAE,CACnB;CACF;;;;"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { stringConverter } from './converters/string.js';
|
|
2
|
+
import { recordConverter } from './converters/record.js';
|
|
3
|
+
import { createVariable } from './variable.js';
|
|
2
4
|
|
|
3
5
|
var templates = {
|
|
4
|
-
APP_LOGO: createVariable('APP_LOGO',
|
|
5
|
-
APP_TITLE: createVariable('APP_TITLE',
|
|
6
|
+
APP_LOGO: createVariable('APP_LOGO', stringConverter()),
|
|
7
|
+
APP_TITLE: createVariable('APP_TITLE', stringConverter()),
|
|
8
|
+
QUERY_GENERATION_FACTORIES: createVariable('QUERY_GENERATION_FACTORIES', recordConverter((zod) => zod.unknown())),
|
|
6
9
|
};
|
|
7
10
|
|
|
8
11
|
export { templates as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sources":["../../../src/variables/templates.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"templates.js","sources":["../../../src/variables/templates.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAGA,gBAAe;AACb,IAAA,QAAQ,EAAE,cAAc,CAAS,UAAU,EAAE,eAAe,EAAE,CAAC;AAC/D,IAAA,SAAS,EAAE,cAAc,CAAS,WAAW,EAAE,eAAe,EAAE,CAAC;AACjE,IAAA,0BAA0B,EAAE,cAAc,CACxC,4BAA4B,EAC5B,eAAe,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CACxC;CACF;;;;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ZodType, ZodTypeDef } from 'zod';
|
|
1
2
|
/**
|
|
2
3
|
* Copy of the ViteJS import meta interface
|
|
3
4
|
*/
|
|
@@ -5,15 +6,24 @@ interface MetaEnv {
|
|
|
5
6
|
[key: string]: unknown;
|
|
6
7
|
}
|
|
7
8
|
export declare type Variable<T> = {
|
|
8
|
-
|
|
9
|
+
name: string;
|
|
10
|
+
asEnv: (value: T) => Record<string, string>;
|
|
11
|
+
zod: ZodVariable<T>;
|
|
9
12
|
vite: ViteVariable<T>;
|
|
10
13
|
};
|
|
14
|
+
export declare type ZodTypeProvider<T> = (zod: typeof import('zod')) => ZodType<T | undefined, ZodTypeDef, T | undefined>;
|
|
15
|
+
export declare type ZodVariable<T> = {
|
|
16
|
+
type: ZodTypeProvider<T>;
|
|
17
|
+
};
|
|
18
|
+
export declare type Converter<T> = {
|
|
19
|
+
convert: (target: unknown) => T | null;
|
|
20
|
+
asString: (value: T) => string;
|
|
21
|
+
type: ZodTypeProvider<T>;
|
|
22
|
+
};
|
|
11
23
|
export declare type ViteVariable<T> = {
|
|
12
24
|
key: string;
|
|
13
25
|
get: (env: MetaEnv) => T | null;
|
|
14
26
|
getOrDefault: (env: MetaEnv, def: T) => T;
|
|
15
27
|
};
|
|
16
|
-
export declare function createVariable<T
|
|
17
|
-
export declare function stringConversion(): (target: unknown) => string | null;
|
|
18
|
-
export declare function booleanConversion(): (target: unknown) => boolean | null;
|
|
28
|
+
export declare function createVariable<T>(key: string, converter: Converter<T>): Variable<T>;
|
|
19
29
|
export {};
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
function createVariable(key,
|
|
1
|
+
function createVariable(key, converter) {
|
|
2
2
|
const viteKey = `VITE_${key.toUpperCase()}`;
|
|
3
|
-
const viteGet = (env) =>
|
|
3
|
+
const viteGet = (env) => converter.convert(env[viteKey]);
|
|
4
4
|
return {
|
|
5
|
-
|
|
5
|
+
name: toCamelCase(key),
|
|
6
|
+
asEnv: (value) => ({ [viteKey]: converter.asString(value) }),
|
|
7
|
+
zod: {
|
|
8
|
+
type: converter.type,
|
|
9
|
+
},
|
|
6
10
|
vite: {
|
|
7
11
|
key: viteKey,
|
|
8
12
|
get: viteGet,
|
|
@@ -15,33 +19,6 @@ function toCamelCase(key) {
|
|
|
15
19
|
return $1.toUpperCase().replace('-', '').replace('_', '');
|
|
16
20
|
});
|
|
17
21
|
}
|
|
18
|
-
function stringConversion() {
|
|
19
|
-
return (target) => {
|
|
20
|
-
if (target === null || target === undefined || target === '') {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
return String(target);
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
function booleanConversion() {
|
|
27
|
-
return (target) => {
|
|
28
|
-
if (target === null)
|
|
29
|
-
return null;
|
|
30
|
-
if (target === undefined)
|
|
31
|
-
return null;
|
|
32
|
-
switch (typeof target) {
|
|
33
|
-
case 'boolean':
|
|
34
|
-
return target;
|
|
35
|
-
case 'string':
|
|
36
|
-
const lowerCase = target.toLowerCase().trim();
|
|
37
|
-
return lowerCase === 'true' || lowerCase === 't' || lowerCase === '1';
|
|
38
|
-
case 'number':
|
|
39
|
-
return target !== 0;
|
|
40
|
-
default:
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
22
|
|
|
46
|
-
export {
|
|
23
|
+
export { createVariable };
|
|
47
24
|
//# sourceMappingURL=variable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variable.js","sources":["../../../src/variables/variable.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"variable.js","sources":["../../../src/variables/variable.ts"],"sourcesContent":[null],"names":[],"mappings":"AAoCgB,SAAA,cAAc,CAC5B,GAAW,EACX,SAAuB,EAAA;IAEvB,MAAM,OAAO,GAAG,CAAQ,KAAA,EAAA,GAAG,CAAC,WAAW,EAAE,EAAE,CAAA;AAC3C,IAAA,MAAM,OAAO,GAAG,CAAC,GAAY,KAAK,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAEjE,OAAO;AACL,QAAA,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC;AACtB,QAAA,KAAK,EAAE,CAAC,KAAQ,MAAM,EAAE,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAC/D,QAAA,GAAG,EAAE;YACH,IAAI,EAAE,SAAS,CAAC,IAAI;AACrB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,YAAY,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG;AAChD,SAAA;KACF,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAA;AAC9B,IAAA,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,EAAE,KAAI;AACvD,QAAA,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AAC3D,KAAC,CAAC,CAAA;AACJ;;;;"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@magidoc/plugin-starter-variables",
|
|
3
3
|
"description": "A shared library that contains common Magidoc starter environment variables keys.",
|
|
4
4
|
"private": false,
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.10.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"main": "./build/index.js",
|
|
@@ -20,6 +20,9 @@
|
|
|
20
20
|
"tslib": "^2.4.0",
|
|
21
21
|
"typescript": "^4.6.3"
|
|
22
22
|
},
|
|
23
|
+
"optionalDependencies": {
|
|
24
|
+
"zod": "^3.14.4"
|
|
25
|
+
},
|
|
23
26
|
"scripts": {
|
|
24
27
|
"start": "pnpm build:rollup && node build/index.js",
|
|
25
28
|
"build": "run-p build:*",
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Converter } from '../variable'
|
|
2
|
+
|
|
3
|
+
export function booleanConverter(): Converter<boolean> {
|
|
4
|
+
return {
|
|
5
|
+
convert: (target: unknown): boolean | null => {
|
|
6
|
+
if (target === null) return null
|
|
7
|
+
if (target === undefined) return null
|
|
8
|
+
|
|
9
|
+
switch (typeof target) {
|
|
10
|
+
case 'boolean':
|
|
11
|
+
return target
|
|
12
|
+
case 'string':
|
|
13
|
+
const lowerCase = target.toLowerCase().trim()
|
|
14
|
+
return lowerCase === 'true' || lowerCase === 't' || lowerCase === '1'
|
|
15
|
+
case 'number':
|
|
16
|
+
return target !== 0
|
|
17
|
+
default:
|
|
18
|
+
return null
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
asString: (value) => String(value),
|
|
22
|
+
type: (z) => z.boolean().optional(),
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Converter, ZodTypeProvider } from '../variable'
|
|
2
|
+
|
|
3
|
+
export function recordConverter<V>(
|
|
4
|
+
valueType: ZodTypeProvider<V>,
|
|
5
|
+
): Converter<Record<string, V | undefined>> {
|
|
6
|
+
return {
|
|
7
|
+
convert: (target) => {
|
|
8
|
+
if (typeof target === 'object') {
|
|
9
|
+
return target as Record<string, V>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (typeof target === 'string') {
|
|
13
|
+
try {
|
|
14
|
+
const result = JSON.parse(target) as Record<string, V>
|
|
15
|
+
if (typeof result !== 'object') {
|
|
16
|
+
return null
|
|
17
|
+
}
|
|
18
|
+
return result
|
|
19
|
+
} catch {
|
|
20
|
+
return null
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return null
|
|
25
|
+
},
|
|
26
|
+
asString: (value) => JSON.stringify(value),
|
|
27
|
+
type: (z) => z.record(valueType(z).optional()).optional(),
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Converter } from '../variable'
|
|
2
|
+
|
|
3
|
+
export function stringConverter(): Converter<string> {
|
|
4
|
+
return {
|
|
5
|
+
convert: (target: unknown): string | null => {
|
|
6
|
+
if (target === null || target === undefined || target === '') {
|
|
7
|
+
return null
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return String(target)
|
|
11
|
+
},
|
|
12
|
+
asString: (value) => String(value),
|
|
13
|
+
type: (z) => z.string().optional(),
|
|
14
|
+
}
|
|
15
|
+
}
|
package/src/variables/magidoc.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { booleanConverter } from './converters'
|
|
2
|
+
import { createVariable } from './variable'
|
|
2
3
|
|
|
3
4
|
export default {
|
|
4
5
|
MAGIDOC_GENERATE: createVariable<boolean>(
|
|
5
6
|
'MAGIDOC_GENERATE',
|
|
6
|
-
|
|
7
|
+
booleanConverter(),
|
|
7
8
|
),
|
|
8
9
|
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { recordConverter, stringConverter } from './converters'
|
|
2
|
+
import { createVariable } from './variable'
|
|
2
3
|
|
|
3
4
|
export default {
|
|
4
|
-
APP_LOGO: createVariable<string>('APP_LOGO',
|
|
5
|
-
APP_TITLE: createVariable<string>('APP_TITLE',
|
|
5
|
+
APP_LOGO: createVariable<string>('APP_LOGO', stringConverter()),
|
|
6
|
+
APP_TITLE: createVariable<string>('APP_TITLE', stringConverter()),
|
|
7
|
+
QUERY_GENERATION_FACTORIES: createVariable<Record<string, unknown>>(
|
|
8
|
+
'QUERY_GENERATION_FACTORIES',
|
|
9
|
+
recordConverter((zod) => zod.unknown()),
|
|
10
|
+
),
|
|
6
11
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { ZodType, ZodTypeDef } from 'zod'
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Copy of the ViteJS import meta interface
|
|
3
5
|
*/
|
|
@@ -6,25 +8,45 @@ interface MetaEnv {
|
|
|
6
8
|
}
|
|
7
9
|
|
|
8
10
|
export type Variable<T> = {
|
|
9
|
-
|
|
11
|
+
name: string
|
|
12
|
+
asEnv: (value: T) => Record<string, string>
|
|
13
|
+
zod: ZodVariable<T>
|
|
10
14
|
vite: ViteVariable<T>
|
|
11
15
|
}
|
|
12
16
|
|
|
17
|
+
export type ZodTypeProvider<T> = (
|
|
18
|
+
zod: typeof import('zod'),
|
|
19
|
+
) => ZodType<T | undefined, ZodTypeDef, T | undefined>
|
|
20
|
+
|
|
21
|
+
export type ZodVariable<T> = {
|
|
22
|
+
type: ZodTypeProvider<T>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type Converter<T> = {
|
|
26
|
+
convert: (target: unknown) => T | null
|
|
27
|
+
asString: (value: T) => string
|
|
28
|
+
type: ZodTypeProvider<T>
|
|
29
|
+
}
|
|
30
|
+
|
|
13
31
|
export type ViteVariable<T> = {
|
|
14
32
|
key: string
|
|
15
33
|
get: (env: MetaEnv) => T | null
|
|
16
34
|
getOrDefault: (env: MetaEnv, def: T) => T
|
|
17
35
|
}
|
|
18
36
|
|
|
19
|
-
export function createVariable<T
|
|
37
|
+
export function createVariable<T>(
|
|
20
38
|
key: string,
|
|
21
|
-
|
|
39
|
+
converter: Converter<T>,
|
|
22
40
|
): Variable<T> {
|
|
23
41
|
const viteKey = `VITE_${key.toUpperCase()}`
|
|
24
|
-
const viteGet = (env: MetaEnv) =>
|
|
42
|
+
const viteGet = (env: MetaEnv) => converter.convert(env[viteKey])
|
|
25
43
|
|
|
26
44
|
return {
|
|
27
|
-
|
|
45
|
+
name: toCamelCase(key),
|
|
46
|
+
asEnv: (value: T) => ({ [viteKey]: converter.asString(value) }),
|
|
47
|
+
zod: {
|
|
48
|
+
type: converter.type,
|
|
49
|
+
},
|
|
28
50
|
vite: {
|
|
29
51
|
key: viteKey,
|
|
30
52
|
get: viteGet,
|
|
@@ -38,32 +60,3 @@ function toCamelCase(key: string): string {
|
|
|
38
60
|
return $1.toUpperCase().replace('-', '').replace('_', '')
|
|
39
61
|
})
|
|
40
62
|
}
|
|
41
|
-
|
|
42
|
-
export function stringConversion() {
|
|
43
|
-
return (target: unknown): string | null => {
|
|
44
|
-
if (target === null || target === undefined || target === '') {
|
|
45
|
-
return null
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return String(target)
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function booleanConversion() {
|
|
53
|
-
return (target: unknown): boolean | null => {
|
|
54
|
-
if (target === null) return null
|
|
55
|
-
if (target === undefined) return null
|
|
56
|
-
|
|
57
|
-
switch (typeof target) {
|
|
58
|
-
case 'boolean':
|
|
59
|
-
return target
|
|
60
|
-
case 'string':
|
|
61
|
-
const lowerCase = target.toLowerCase().trim()
|
|
62
|
-
return lowerCase === 'true' || lowerCase === 't' || lowerCase === '1'
|
|
63
|
-
case 'number':
|
|
64
|
-
return target !== 0
|
|
65
|
-
default:
|
|
66
|
-
return null
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
package/tests/index.spec.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as variables from '../src/index'
|
|
2
2
|
import type { Variable } from '../src/variables/variable'
|
|
3
|
+
import z from 'zod'
|
|
3
4
|
|
|
4
5
|
describe('variables', () => {
|
|
5
6
|
it('contains the right number of export keys', () => {
|
|
@@ -7,10 +8,18 @@ describe('variables', () => {
|
|
|
7
8
|
})
|
|
8
9
|
|
|
9
10
|
it('contains the right templates variables', () => {
|
|
10
|
-
expect(Object.keys(variables.templates)).toEqual([
|
|
11
|
+
expect(Object.keys(variables.templates)).toEqual([
|
|
12
|
+
'APP_LOGO',
|
|
13
|
+
'APP_TITLE',
|
|
14
|
+
'QUERY_GENERATION_FACTORIES',
|
|
15
|
+
])
|
|
11
16
|
|
|
12
17
|
testStringVariable(variables.templates.APP_TITLE, 'VITE_APP_TITLE')
|
|
13
18
|
testStringVariable(variables.templates.APP_LOGO, 'VITE_APP_LOGO')
|
|
19
|
+
testRecordVariable(
|
|
20
|
+
variables.templates.QUERY_GENERATION_FACTORIES,
|
|
21
|
+
'VITE_QUERY_GENERATION_FACTORIES',
|
|
22
|
+
)
|
|
14
23
|
})
|
|
15
24
|
|
|
16
25
|
it('contains the right magidoc variables', () => {
|
|
@@ -37,6 +46,8 @@ function testStringVariable(target: Variable<string>, viteKey: string) {
|
|
|
37
46
|
'false',
|
|
38
47
|
)
|
|
39
48
|
expect(target.vite.getOrDefault({}, 'Default')).toBe('Default')
|
|
49
|
+
|
|
50
|
+
expect(target.asEnv('Potato')).toEqual({ [viteKey]: 'Potato' })
|
|
40
51
|
}
|
|
41
52
|
|
|
42
53
|
function testBooleanVariable(target: Variable<boolean>, viteKey: string) {
|
|
@@ -61,4 +72,35 @@ function testBooleanVariable(target: Variable<boolean>, viteKey: string) {
|
|
|
61
72
|
expect(target.vite.getOrDefault({ [viteKey]: false }, true)).toBe(false)
|
|
62
73
|
expect(target.vite.getOrDefault({ [viteKey]: {} }, true)).toBe(true)
|
|
63
74
|
expect(target.vite.getOrDefault({}, true)).toBe(true)
|
|
75
|
+
|
|
76
|
+
expect(target.asEnv(true)).toEqual({ [viteKey]: 'true' })
|
|
77
|
+
expect(target.asEnv(false)).toEqual({ [viteKey]: 'false' })
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function testRecordVariable(
|
|
81
|
+
target: Variable<Record<string, unknown>>,
|
|
82
|
+
viteKey: string,
|
|
83
|
+
) {
|
|
84
|
+
expect(target.vite.key).toEqual(viteKey)
|
|
85
|
+
|
|
86
|
+
expect(target.vite.get({ [viteKey]: true })).toBeNull()
|
|
87
|
+
expect(target.vite.get({ [viteKey]: 'true' })).toBeNull()
|
|
88
|
+
expect(target.vite.get({ [viteKey]: '4234' })).toBeNull()
|
|
89
|
+
expect(target.vite.get({ [viteKey]: 4234 })).toBeNull()
|
|
90
|
+
|
|
91
|
+
expect(target.vite.get({ [viteKey]: { abc: '123' } })).toEqual({ abc: '123' })
|
|
92
|
+
expect(
|
|
93
|
+
target.vite.get({ [viteKey]: JSON.stringify({ abc: '123' }) }),
|
|
94
|
+
).toEqual({ abc: '123' })
|
|
95
|
+
|
|
96
|
+
expect(target.vite.getOrDefault({ [viteKey]: false }, { abc: 123 })).toEqual({
|
|
97
|
+
abc: 123,
|
|
98
|
+
})
|
|
99
|
+
expect(target.vite.getOrDefault({ [viteKey]: {} }, { abc: 123 })).toEqual({})
|
|
100
|
+
expect(target.vite.getOrDefault({}, { abc: 123 })).toEqual({ abc: 123 })
|
|
101
|
+
|
|
102
|
+
expect(target.asEnv({ abc: 123 })).toEqual({
|
|
103
|
+
[viteKey]: JSON.stringify({ abc: 123 }),
|
|
104
|
+
})
|
|
105
|
+
expect(target.asEnv({})).toEqual({ [viteKey]: '{}' })
|
|
64
106
|
}
|