opticedge-cloud-utils 1.1.23 → 1.1.25

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/env.d.ts CHANGED
@@ -1 +1 @@
1
- export declare function getEnv(name: string, fallback?: any): any;
1
+ export declare function requireEnv(name: string, defaultValue?: string): string;
package/dist/env.js CHANGED
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.getEnv = getEnv;
5
- function getEnv(name, fallback) {
3
+ exports.requireEnv = requireEnv;
4
+ function requireEnv(name, defaultValue) {
6
5
  const value = process.env[name];
7
- if (!value) {
8
- if (fallback !== undefined)
9
- return fallback;
10
- throw new Error(`Missing env var ${name}`);
6
+ if (value === undefined || value === '') {
7
+ if (defaultValue !== undefined) {
8
+ return defaultValue;
9
+ }
10
+ throw new Error(`${name} env var must be set`);
11
11
  }
12
12
  return value;
13
13
  }
package/dist/parser.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  declare const toNumber: (v: any) => number | null;
2
- export { toNumber };
2
+ declare const parsePositiveInt: (value: string, name: string) => number;
3
+ export { toNumber, parsePositiveInt };
package/dist/parser.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toNumber = void 0;
3
+ exports.parsePositiveInt = exports.toNumber = void 0;
4
4
  // Helper: accept number or numeric-string, return number or null
5
5
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
6
  const toNumber = (v) => {
@@ -11,3 +11,14 @@ const toNumber = (v) => {
11
11
  return null;
12
12
  };
13
13
  exports.toNumber = toNumber;
14
+ const parsePositiveInt = (value, name) => {
15
+ if (!/^\d+$/.test(value)) {
16
+ throw new Error(`${name} must be a positive integer`);
17
+ }
18
+ const n = Number.parseInt(value, 10);
19
+ if (!Number.isFinite(n) || n <= 0) {
20
+ throw new Error(`${name} must be a positive integer`);
21
+ }
22
+ return n;
23
+ };
24
+ exports.parsePositiveInt = parsePositiveInt;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opticedge-cloud-utils",
3
- "version": "1.1.23",
3
+ "version": "1.1.25",
4
4
  "description": "Common utilities for cloud functions",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/env.ts CHANGED
@@ -1,10 +1,12 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
-
3
- export function getEnv(name: string, fallback?: any): any {
1
+ export function requireEnv(name: string, defaultValue?: string): string {
4
2
  const value = process.env[name]
5
- if (!value) {
6
- if (fallback !== undefined) return fallback
7
- throw new Error(`Missing env var ${name}`)
3
+
4
+ if (value === undefined || value === '') {
5
+ if (defaultValue !== undefined) {
6
+ return defaultValue
7
+ }
8
+ throw new Error(`${name} env var must be set`)
8
9
  }
10
+
9
11
  return value
10
12
  }
package/src/parser.ts CHANGED
@@ -6,4 +6,16 @@ const toNumber = (v: any): number | null => {
6
6
  return null
7
7
  }
8
8
 
9
- export { toNumber }
9
+ const parsePositiveInt = (value: string, name: string): number => {
10
+ if (!/^\d+$/.test(value)) {
11
+ throw new Error(`${name} must be a positive integer`)
12
+ }
13
+
14
+ const n = Number.parseInt(value, 10)
15
+ if (!Number.isFinite(n) || n <= 0) {
16
+ throw new Error(`${name} must be a positive integer`)
17
+ }
18
+ return n
19
+ }
20
+
21
+ export { toNumber, parsePositiveInt }
package/tests/env.test.ts CHANGED
@@ -1,18 +1,61 @@
1
- import { getEnv } from '../src/env'
1
+ import { requireEnv } from '../src/env'
2
2
 
3
- describe('getEnv', () => {
4
- it('returns the value of an existing env var', () => {
5
- process.env.TEST_KEY = 'test-value'
6
- expect(getEnv('TEST_KEY')).toBe('test-value')
3
+ describe('requireEnv', () => {
4
+ const ORIGINAL_ENV = process.env
5
+
6
+ beforeEach(() => {
7
+ jest.resetModules()
8
+ process.env = { ...ORIGINAL_ENV }
9
+ })
10
+
11
+ afterAll(() => {
12
+ process.env = ORIGINAL_ENV
13
+ })
14
+
15
+ // ============================================================
16
+ // Success cases
17
+ // ============================================================
18
+
19
+ it('returns env value when set', () => {
20
+ process.env.TEST_VAR = 'hello'
21
+ expect(requireEnv('TEST_VAR')).toBe('hello')
22
+ })
23
+
24
+ it('returns "0" correctly (should not treat as missing)', () => {
25
+ process.env.TEST_VAR = '0'
26
+ expect(requireEnv('TEST_VAR')).toBe('0')
7
27
  })
8
28
 
9
- it('returns fallback if env var is not set', () => {
10
- delete process.env.OPTIONAL_KEY
11
- expect(getEnv('OPTIONAL_KEY', 'default')).toBe('default')
29
+ it('returns "false" correctly (should not treat as missing)', () => {
30
+ process.env.TEST_VAR = 'false'
31
+ expect(requireEnv('TEST_VAR')).toBe('false')
32
+ })
33
+
34
+ // ============================================================
35
+ // Default handling
36
+ // ============================================================
37
+
38
+ it('returns default when env is undefined', () => {
39
+ delete process.env.TEST_VAR
40
+ expect(requireEnv('TEST_VAR', 'fallback')).toBe('fallback')
41
+ })
42
+
43
+ it('returns default when env is empty string', () => {
44
+ process.env.TEST_VAR = ''
45
+ expect(requireEnv('TEST_VAR', 'fallback')).toBe('fallback')
46
+ })
47
+
48
+ // ============================================================
49
+ // Error cases
50
+ // ============================================================
51
+
52
+ it('throws when env is undefined and no default provided', () => {
53
+ delete process.env.TEST_VAR
54
+ expect(() => requireEnv('TEST_VAR')).toThrow('TEST_VAR env var must be set')
12
55
  })
13
56
 
14
- it('throws error if env var is not set and no fallback provided', () => {
15
- delete process.env.MISSING_KEY
16
- expect(() => getEnv('MISSING_KEY')).toThrow('Missing env var MISSING_KEY')
57
+ it('throws when env is empty string and no default provided', () => {
58
+ process.env.TEST_VAR = ''
59
+ expect(() => requireEnv('TEST_VAR')).toThrow('TEST_VAR env var must be set')
17
60
  })
18
61
  })
@@ -1,19 +1,24 @@
1
- import { toNumber } from '../src'
1
+ import { toNumber, parsePositiveInt } from '../src'
2
2
 
3
3
  describe('toNumber', () => {
4
4
  it('returns the same number when input is a finite number', () => {
5
5
  expect(toNumber(123)).toBe(123)
6
6
  expect(toNumber(0)).toBe(0)
7
+ expect(toNumber(-10)).toBe(-10)
7
8
  })
8
9
 
9
10
  it('returns number when input is a numeric string', () => {
10
11
  expect(toNumber('456')).toBe(456)
12
+ expect(toNumber('0')).toBe(0)
11
13
  })
12
14
 
13
15
  it('returns null for non-numeric strings', () => {
14
16
  expect(toNumber('abc')).toBeNull()
15
17
  expect(toNumber('123abc')).toBeNull()
16
18
  expect(toNumber('')).toBeNull()
19
+ expect(toNumber(' ')).toBeNull()
20
+ expect(toNumber('12.3')).toBeNull() // decimal not allowed by regex
21
+ expect(toNumber('-123')).toBeNull() // negative string not allowed
17
22
  })
18
23
 
19
24
  it('returns null for non-numbers', () => {
@@ -22,5 +27,36 @@ describe('toNumber', () => {
22
27
  expect(toNumber(undefined)).toBeNull()
23
28
  expect(toNumber(null)).toBeNull()
24
29
  expect(toNumber({})).toBeNull()
30
+ expect(toNumber([])).toBeNull()
31
+ })
32
+ })
33
+
34
+ describe('parsePositiveInt', () => {
35
+ it('parses valid positive integers', () => {
36
+ expect(parsePositiveInt('1', 'TEST')).toBe(1)
37
+ expect(parsePositiveInt('10', 'TEST')).toBe(10)
38
+ expect(parsePositiveInt('001', 'TEST')).toBe(1)
39
+ })
40
+
41
+ it('throws for zero', () => {
42
+ expect(() => parsePositiveInt('0', 'TEST')).toThrow('TEST must be a positive integer')
43
+ })
44
+
45
+ it('throws for negative numbers', () => {
46
+ expect(() => parsePositiveInt('-1', 'TEST')).toThrow('TEST must be a positive integer')
47
+ })
48
+
49
+ it('throws for non-numeric values', () => {
50
+ expect(() => parsePositiveInt('abc', 'TEST')).toThrow('TEST must be a positive integer')
51
+ expect(() => parsePositiveInt('', 'TEST')).toThrow('TEST must be a positive integer')
52
+ })
53
+
54
+ it('throws for decimals', () => {
55
+ expect(() => parsePositiveInt('1.5', 'TEST')).toThrow('TEST must be a positive integer')
56
+ })
57
+
58
+ it('throws for NaN-like values', () => {
59
+ expect(() => parsePositiveInt('NaN', 'TEST')).toThrow('TEST must be a positive integer')
60
+ expect(() => parsePositiveInt('Infinity', 'TEST')).toThrow('TEST must be a positive integer')
25
61
  })
26
62
  })