@romaintaillandier1978/dotenv-never-lies 1.1.1 → 1.3.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.
Files changed (212) hide show
  1. package/README.md +103 -42
  2. package/dist/cli/commands/assert.d.ts +3 -4
  3. package/dist/cli/commands/assert.d.ts.map +1 -1
  4. package/dist/cli/commands/explain.d.ts +2 -3
  5. package/dist/cli/commands/explain.d.ts.map +1 -1
  6. package/dist/cli/commands/export.d.ts +4 -3
  7. package/dist/cli/commands/export.d.ts.map +1 -1
  8. package/dist/cli/commands/export.js +46 -0
  9. package/dist/cli/commands/generate.d.ts +2 -2
  10. package/dist/cli/commands/generate.d.ts.map +1 -1
  11. package/dist/cli/commands/infer.d.ts +15 -0
  12. package/dist/cli/commands/infer.d.ts.map +1 -0
  13. package/dist/cli/commands/infer.js +86 -0
  14. package/dist/cli/commands/init.d.ts +15 -0
  15. package/dist/cli/commands/init.d.ts.map +1 -0
  16. package/dist/cli/commands/init.js +30 -0
  17. package/dist/cli/commands/program.d.ts +4 -0
  18. package/dist/cli/commands/program.d.ts.map +1 -0
  19. package/dist/cli/commands/program.js +1 -0
  20. package/dist/cli/index.js +74 -30
  21. package/dist/cli/utils/infer-schema.d.ts +2 -2
  22. package/dist/cli/utils/infer-schema.d.ts.map +1 -1
  23. package/dist/cli/utils/infer-schema.js +20 -22
  24. package/dist/cli/utils/printer.d.ts +2 -0
  25. package/dist/cli/utils/printer.d.ts.map +1 -1
  26. package/dist/cli/utils/printer.js +104 -1
  27. package/dist/core.d.ts.map +1 -1
  28. package/dist/index.d.ts +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -0
  31. package/dist/infer/__tests__/port-vs-version.test.d.ts +2 -0
  32. package/dist/infer/__tests__/port-vs-version.test.d.ts.map +1 -0
  33. package/dist/infer/__tests__/port-vs-version.test.js +32 -0
  34. package/dist/infer/__tests__/rules/basic.test.d.ts +2 -0
  35. package/dist/infer/__tests__/rules/basic.test.d.ts.map +1 -0
  36. package/dist/infer/__tests__/rules/basic.test.js +85 -0
  37. package/dist/infer/__tests__/rules/boolean.test.d.ts +2 -0
  38. package/dist/infer/__tests__/rules/boolean.test.d.ts.map +1 -0
  39. package/dist/infer/__tests__/rules/boolean.test.js +34 -0
  40. package/dist/infer/__tests__/rules/duration.test.d.ts +2 -0
  41. package/dist/infer/__tests__/rules/duration.test.d.ts.map +1 -0
  42. package/dist/infer/__tests__/rules/duration.test.js +24 -0
  43. package/dist/infer/__tests__/rules/ip.test.d.ts +2 -0
  44. package/dist/infer/__tests__/rules/ip.test.d.ts.map +1 -0
  45. package/dist/infer/__tests__/rules/ip.test.js +24 -0
  46. package/dist/infer/__tests__/rules/json.test.d.ts +2 -0
  47. package/dist/infer/__tests__/rules/json.test.d.ts.map +1 -0
  48. package/dist/infer/__tests__/rules/json.test.js +38 -0
  49. package/dist/infer/__tests__/rules/list.test.d.ts +2 -0
  50. package/dist/infer/__tests__/rules/list.test.d.ts.map +1 -0
  51. package/dist/infer/__tests__/rules/list.test.js +130 -0
  52. package/dist/infer/__tests__/rules/port.test.d.ts +2 -0
  53. package/dist/infer/__tests__/rules/port.test.d.ts.map +1 -0
  54. package/dist/infer/__tests__/rules/port.test.js +24 -0
  55. package/dist/infer/__tests__/rules/url.test.d.ts +2 -0
  56. package/dist/infer/__tests__/rules/url.test.d.ts.map +1 -0
  57. package/dist/infer/__tests__/rules/url.test.js +39 -0
  58. package/dist/infer/__tests__/rules/version.test.d.ts +2 -0
  59. package/dist/infer/__tests__/rules/version.test.d.ts.map +1 -0
  60. package/dist/infer/__tests__/rules/version.test.js +37 -0
  61. package/dist/infer/generated/basic.d.ts +8 -0
  62. package/dist/infer/generated/basic.d.ts.map +1 -0
  63. package/dist/infer/generated/basic.js +24 -0
  64. package/dist/infer/generated/boolean.d.ts +3 -0
  65. package/dist/infer/generated/boolean.d.ts.map +1 -0
  66. package/dist/infer/generated/boolean.js +9 -0
  67. package/dist/infer/generated/duration.d.ts +3 -0
  68. package/dist/infer/generated/duration.d.ts.map +1 -0
  69. package/dist/infer/generated/duration.js +9 -0
  70. package/dist/infer/generated/ip.d.ts +3 -0
  71. package/dist/infer/generated/ip.d.ts.map +1 -0
  72. package/dist/infer/generated/ip.js +9 -0
  73. package/dist/infer/generated/json.d.ts +4 -0
  74. package/dist/infer/generated/json.d.ts.map +1 -0
  75. package/dist/infer/generated/json.js +10 -0
  76. package/dist/infer/generated/list.d.ts +8 -0
  77. package/dist/infer/generated/list.d.ts.map +1 -0
  78. package/dist/infer/generated/list.js +49 -0
  79. package/dist/infer/generated/port.d.ts +4 -0
  80. package/dist/infer/generated/port.d.ts.map +1 -0
  81. package/dist/infer/generated/port.js +10 -0
  82. package/dist/infer/generated/url.d.ts +14 -0
  83. package/dist/infer/generated/url.d.ts.map +1 -0
  84. package/dist/infer/generated/url.js +30 -0
  85. package/dist/infer/generated/version.d.ts +4 -0
  86. package/dist/infer/generated/version.d.ts.map +1 -0
  87. package/dist/infer/generated/version.js +10 -0
  88. package/dist/infer/helpers.d.ts +11 -0
  89. package/dist/infer/helpers.d.ts.map +1 -0
  90. package/dist/infer/helpers.js +41 -0
  91. package/dist/infer/index.d.ts +4 -0
  92. package/dist/infer/index.d.ts.map +1 -0
  93. package/dist/infer/index.js +35 -0
  94. package/dist/infer/rules/basic.d.ts +11 -0
  95. package/dist/infer/rules/basic.d.ts.map +1 -0
  96. package/dist/infer/rules/basic.js +90 -0
  97. package/dist/infer/rules/boolean.d.ts +3 -0
  98. package/dist/infer/rules/boolean.d.ts.map +1 -0
  99. package/dist/infer/rules/boolean.js +25 -0
  100. package/dist/infer/rules/duration.d.ts +3 -0
  101. package/dist/infer/rules/duration.d.ts.map +1 -0
  102. package/dist/infer/rules/duration.js +25 -0
  103. package/dist/infer/rules/ip.d.ts +3 -0
  104. package/dist/infer/rules/ip.d.ts.map +1 -0
  105. package/dist/infer/rules/ip.js +25 -0
  106. package/dist/infer/rules/json.d.ts +3 -0
  107. package/dist/infer/rules/json.d.ts.map +1 -0
  108. package/dist/infer/rules/json.js +59 -0
  109. package/dist/infer/rules/list.d.ts +12 -0
  110. package/dist/infer/rules/list.d.ts.map +1 -0
  111. package/dist/infer/rules/list.js +221 -0
  112. package/dist/infer/rules/port.d.ts +3 -0
  113. package/dist/infer/rules/port.d.ts.map +1 -0
  114. package/dist/infer/rules/port.js +30 -0
  115. package/dist/infer/rules/url.d.ts +4 -0
  116. package/dist/infer/rules/url.d.ts.map +1 -0
  117. package/dist/infer/rules/url.js +143 -0
  118. package/dist/infer/rules/version.d.ts +3 -0
  119. package/dist/infer/rules/version.d.ts.map +1 -0
  120. package/dist/infer/rules/version.js +26 -0
  121. package/dist/infer/types.d.ts +87 -0
  122. package/dist/infer/types.d.ts.map +1 -0
  123. package/dist/infer/types.js +1 -0
  124. package/dist/infer-rules/basic.d.ts +5 -0
  125. package/dist/infer-rules/basic.d.ts.map +1 -0
  126. package/dist/infer-rules/basic.js +48 -0
  127. package/dist/infer-rules/boolean.d.ts +3 -0
  128. package/dist/infer-rules/boolean.d.ts.map +1 -0
  129. package/dist/infer-rules/boolean.js +25 -0
  130. package/dist/infer-rules/dotted.d.ts +4 -0
  131. package/dist/infer-rules/dotted.d.ts.map +1 -0
  132. package/dist/infer-rules/dotted.js +48 -0
  133. package/dist/infer-rules/duration.d.ts +3 -0
  134. package/dist/infer-rules/duration.d.ts.map +1 -0
  135. package/dist/infer-rules/duration.js +25 -0
  136. package/dist/infer-rules/index.d.ts +50 -0
  137. package/dist/infer-rules/index.d.ts.map +1 -0
  138. package/dist/infer-rules/index.js +42 -0
  139. package/dist/infer-rules/json.d.ts +3 -0
  140. package/dist/infer-rules/json.d.ts.map +1 -0
  141. package/dist/infer-rules/json.js +50 -0
  142. package/dist/infer-rules/list.d.ts +5 -0
  143. package/dist/infer-rules/list.d.ts.map +1 -0
  144. package/dist/infer-rules/list.js +200 -0
  145. package/dist/infer-rules/path.d.ts +5 -0
  146. package/dist/infer-rules/path.d.ts.map +1 -0
  147. package/dist/infer-rules/path.js +78 -0
  148. package/dist/infer-rules/port.d.ts +3 -0
  149. package/dist/infer-rules/port.d.ts.map +1 -0
  150. package/dist/infer-rules/port.js +26 -0
  151. package/dist/infer-rules/simple.d.ts +3 -0
  152. package/dist/infer-rules/simple.d.ts.map +1 -0
  153. package/dist/infer-rules/simple.js +37 -0
  154. package/dist/infer-rules/url.d.ts +4 -0
  155. package/dist/infer-rules/url.d.ts.map +1 -0
  156. package/dist/infer-rules/url.js +149 -0
  157. package/dist/llm-kit/context.json.d.ts +2 -0
  158. package/dist/llm-kit/context.json.d.ts.map +1 -0
  159. package/dist/llm-kit/context.json.js +22 -0
  160. package/dist/sample/DNLTest.d.ts +2 -0
  161. package/dist/sample/DNLTest.d.ts.map +1 -0
  162. package/dist/sample/DNLTest.js +4 -0
  163. package/dist/sample/debug.d.ts +2 -0
  164. package/dist/sample/debug.d.ts.map +1 -0
  165. package/dist/sample/debug.js +5 -0
  166. package/dist/sample/env.dnl.d.ts +426 -0
  167. package/dist/sample/env.dnl.d.ts.map +1 -0
  168. package/dist/sample/env.dnl.js +429 -0
  169. package/dist/schemas/bool.d.ts +9 -0
  170. package/dist/schemas/bool.d.ts.map +1 -0
  171. package/dist/schemas/bool.js +22 -0
  172. package/dist/schemas/boolean.d.ts +9 -0
  173. package/dist/schemas/boolean.d.ts.map +1 -0
  174. package/dist/schemas/boolean.js +23 -0
  175. package/dist/schemas/dotted.d.ts +21 -0
  176. package/dist/schemas/dotted.d.ts.map +1 -0
  177. package/dist/schemas/dotted.js +45 -0
  178. package/dist/schemas/duration.d.ts +11 -0
  179. package/dist/schemas/duration.d.ts.map +1 -0
  180. package/dist/schemas/duration.js +44 -0
  181. package/dist/schemas/index.d.ts +9 -0
  182. package/dist/schemas/index.d.ts.map +1 -0
  183. package/dist/schemas/index.js +8 -0
  184. package/dist/schemas/ip-and-version.d.ts +12 -0
  185. package/dist/schemas/ip-and-version.d.ts.map +1 -0
  186. package/dist/schemas/ip-and-version.js +35 -0
  187. package/dist/schemas/ip.d.ts +11 -0
  188. package/dist/schemas/ip.d.ts.map +1 -0
  189. package/dist/schemas/ip.js +33 -0
  190. package/dist/schemas/json.d.ts +15 -0
  191. package/dist/schemas/json.d.ts.map +1 -0
  192. package/dist/schemas/json.js +34 -0
  193. package/dist/schemas/list.d.ts +89 -0
  194. package/dist/schemas/list.d.ts.map +1 -0
  195. package/dist/schemas/list.js +139 -0
  196. package/dist/schemas/path.d.ts +23 -0
  197. package/dist/schemas/path.d.ts.map +1 -0
  198. package/dist/schemas/path.js +33 -0
  199. package/dist/schemas/port.d.ts +8 -0
  200. package/dist/schemas/port.d.ts.map +1 -0
  201. package/dist/schemas/port.js +9 -0
  202. package/dist/schemas/urls.d.ts +15 -0
  203. package/dist/schemas/urls.d.ts.map +1 -0
  204. package/dist/schemas/urls.js +54 -0
  205. package/package.json +11 -6
  206. package/dist/DnlTest.d.ts +0 -2
  207. package/dist/DnlTest.d.ts.map +0 -1
  208. package/dist/DnlTest.js +0 -12
  209. package/dist/cli/utils/exitCodes.d.ts +0 -8
  210. package/dist/cli/utils/exitCodes.d.ts.map +0 -1
  211. package/dist/cli/utils/exitCodes.js +0 -8
  212. package/dist/romaintaillandier1978-dotenv-never-lies-0.3.0.tgz +0 -0
@@ -0,0 +1,24 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { ipRule } from "../../rules/ip.js";
3
+ describe("Inference rules – ip", () => {
4
+ it("ipRule should match a valid IP address", () => {
5
+ const validIps = ["192.168.0.1", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"];
6
+ for (const rawValue of validIps) {
7
+ const result = ipRule.tryInfer({
8
+ name: "HOST_IP",
9
+ rawValue,
10
+ });
11
+ expect(result).not.toBeNull();
12
+ }
13
+ });
14
+ it("ipRule should ignore invalid IP addresses", () => {
15
+ const invalidIps = ["999.999.999.999", "666.666.666", "192.168.0.1.1", "::ffff:192.0.2.1", "::1"];
16
+ for (const rawValue of invalidIps) {
17
+ const result = ipRule.tryInfer({
18
+ name: "HOST_IP",
19
+ rawValue,
20
+ });
21
+ expect(result).toBeNull();
22
+ }
23
+ });
24
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.test.d.ts","sourceRoot":"","sources":["../../../../src/infer/__tests__/rules/json.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { jsonRule } from "../../rules/json.js";
3
+ import { jsonGenSchemaNoName } from "../../generated/json.js";
4
+ describe("Inference rules – json", () => {
5
+ it("jsonRule should match JSON objects", () => {
6
+ const jsonObjects = ['{"key":"value"}', '["value1","value2"]'];
7
+ for (const rawValue of jsonObjects) {
8
+ const result = jsonRule.tryInfer({
9
+ name: "CONFIG_JSON",
10
+ rawValue,
11
+ });
12
+ expect(result).not.toBeNull();
13
+ }
14
+ });
15
+ it("jsonRule should match JSON primitives, with low confidence", () => {
16
+ const jsonPrimitives = ['"key"', "123", '"true"', '"false"', '"null"'];
17
+ for (const rawValue of jsonPrimitives) {
18
+ const result3 = jsonRule.tryInfer({
19
+ name: "SOMETHING",
20
+ rawValue,
21
+ });
22
+ expect(result3).not.toBeNull();
23
+ expect(result3?.generated.imports[0].name).toBe(jsonGenSchemaNoName.imports[0].name);
24
+ expect(result3.confidence).toBeLessThan(jsonRule.threshold);
25
+ expect(result3?.reasons?.some((r) => r.includes("primitive"))).toBe(true);
26
+ }
27
+ });
28
+ it("jsonRule should ignore invalid JSON", () => {
29
+ const invalidJson = ['{"key":}', '["value1","value2"}'];
30
+ for (const rawValue of invalidJson) {
31
+ const result = jsonRule.tryInfer({
32
+ name: "CONFIG_JSON",
33
+ rawValue,
34
+ });
35
+ expect(result).toBeNull();
36
+ }
37
+ });
38
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../../../src/infer/__tests__/rules/list.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,130 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { keyValueListRule, keyValueRule, listRule } from "../../rules/list.js";
3
+ describe("Inference rules – list", () => {
4
+ it("keyValueListRule should match multiple key-value pairs", () => {
5
+ const keyValueList = [
6
+ "env=prod;region=eu",
7
+ "env=prod,region=eu",
8
+ "env=prod&region=eu",
9
+ "env:prod&region:eu",
10
+ "a=b;c=d",
11
+ "a=b;c=d;e=f",
12
+ "a:b;c:d",
13
+ "a:b;c:d;e:f",
14
+ ];
15
+ for (const rawValue of keyValueList) {
16
+ const result = keyValueListRule.tryInfer({
17
+ name: "APP_LABELS",
18
+ rawValue,
19
+ });
20
+ expect(result).not.toBeNull();
21
+ }
22
+ });
23
+ it("keyValueListRule should match multiple key=value strange with various splitters", () => {
24
+ const keyValueList = ["a=b,c=d;e=f", "a=b;e=f,c=d", "a=b&c=d,e=f", "a=b,e=f&c=d", "a=b;c=d,e"];
25
+ for (const rawValue of keyValueList) {
26
+ const result = keyValueListRule.tryInfer({
27
+ name: "APP_LABELS",
28
+ rawValue,
29
+ });
30
+ expect(result).not.toBeNull();
31
+ }
32
+ });
33
+ it("keyValueListRule should not match multiple ambigous key=value strange with various splitters", () => {
34
+ const keyValueList = ["a=b;c=d,e=f&g=h", "a:b;c:d,e:f&g:h", "a=b;c:d", "a:b;c=d", "a=b,c:d", "a=b;c", "a,b,c", "a;b;c", "abc", "1;2;3"];
35
+ for (const rawValue of keyValueList) {
36
+ const result = keyValueListRule.tryInfer({
37
+ name: "APP_LABELS",
38
+ rawValue,
39
+ });
40
+ expect(result).toBeNull();
41
+ }
42
+ });
43
+ it("keyValueListRule should not match multiple ambigous key=value strange with various splitters", () => {
44
+ const keyValueList = ["a=b;c=d,e=f&g=h", "a:b;c:d,e:f&g:h", "a=b;c:d", "a:b;c=d", "a=b,c:d", "a=b;c", "a,b,c", "a;b;c", "abc", "1;2;3"];
45
+ for (const rawValue of keyValueList) {
46
+ const result = keyValueListRule.tryInfer({
47
+ name: "APP_LABELS",
48
+ rawValue,
49
+ });
50
+ expect(result).toBeNull();
51
+ }
52
+ });
53
+ it("keyValueRule should match incomplete key=value pair", () => {
54
+ const keyValue = ["a=b;;c=d", "a=b,&c=d", "a=b;", ";a=b"];
55
+ for (const rawValue of keyValue) {
56
+ const result = keyValueRule.tryInfer({
57
+ name: "APP_CONFIG",
58
+ rawValue,
59
+ });
60
+ expect(result).not.toBeNull();
61
+ }
62
+ });
63
+ it("listRule should match comma-separated values", () => {
64
+ const list = [
65
+ "a;b",
66
+ "a;b;c",
67
+ "1;2;3",
68
+ "foo;bar;baz",
69
+ "8080;8081;8082",
70
+ "red;green;blue",
71
+ "https://google.com;https://github.com;https://www.npmjs.com/package/@romaintaillandier1978/dotenv-never-lies?activeTab=readme",
72
+ "user@mail.com;admin@mail.com",
73
+ "a,b",
74
+ "a,b,c",
75
+ "1,2,3",
76
+ "foo,bar,baz",
77
+ "8080,8081,8082",
78
+ "red,green,blue",
79
+ "http://a.com,http://b.com",
80
+ "user@mail.com,admin@mail.com",
81
+ ];
82
+ for (const rawValue of list) {
83
+ const result = listRule.tryInfer({
84
+ name: "ALLOWED_LIST",
85
+ rawValue,
86
+ });
87
+ expect(result).not.toBeNull();
88
+ }
89
+ });
90
+ it("listRule should prioritize ';' over ',' when both are present", () => {
91
+ const list = ["a,b;c,d", "1,2;3,4", "foo,bar;baz", "http://a.com,http://b.com;http://c.com"];
92
+ for (const rawValue of list) {
93
+ const result = listRule.tryInfer({
94
+ name: "MIXED_LIST",
95
+ rawValue,
96
+ });
97
+ expect(result).not.toBeNull();
98
+ }
99
+ });
100
+ it("listRule should not match something that is not a list (not a list)", () => {
101
+ const list = ["a", "1", "true", "false", "listRule should not match something that is not a list (not a list)", ""];
102
+ for (const rawValue of list) {
103
+ const result = listRule.tryInfer({
104
+ name: "MIXED_LIST",
105
+ rawValue,
106
+ });
107
+ expect(result).toBeNull();
108
+ }
109
+ });
110
+ it("listRule should match border cases of list with empty values, or containing space", () => {
111
+ const list = ["a,,b", "a;;b", "a;;b;;", ",a,b", ";a;b", "a; b ;c", "a , b , c"];
112
+ for (const rawValue of list) {
113
+ const result = listRule.tryInfer({
114
+ name: "MIXED_LIST",
115
+ rawValue,
116
+ });
117
+ expect(result).not.toBeNull();
118
+ }
119
+ });
120
+ it("listRule should match border casesonly empt values", () => {
121
+ const list = [";;;;"];
122
+ for (const rawValue of list) {
123
+ const result = listRule.tryInfer({
124
+ name: "MIXED_LIST",
125
+ rawValue,
126
+ });
127
+ expect(result).not.toBeNull();
128
+ }
129
+ });
130
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=port.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.test.d.ts","sourceRoot":"","sources":["../../../../src/infer/__tests__/rules/port.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { portRule } from "../../rules/port.js";
3
+ describe("Inference rules – port", () => {
4
+ it("portRule should match a valid port number", () => {
5
+ const validPorts = ["5432", "8080", "3000"];
6
+ for (const rawValue of validPorts) {
7
+ const result = portRule.tryInfer({
8
+ name: "DB_PORT",
9
+ rawValue,
10
+ });
11
+ expect(result).not.toBeNull();
12
+ }
13
+ });
14
+ it("portRule should ignore invalid port numbers", () => {
15
+ const invalidPorts = ["70000", "0", "-1", "65536"];
16
+ for (const rawValue of invalidPorts) {
17
+ const result = portRule.tryInfer({
18
+ name: "PORT",
19
+ rawValue,
20
+ });
21
+ expect(result).toBeNull();
22
+ }
23
+ });
24
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=url.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.test.d.ts","sourceRoot":"","sources":["../../../../src/infer/__tests__/rules/url.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { urlRule } from "../../rules/url.js";
3
+ import { databaseUrlGenSchema, httpUrlGenSchema } from "../../generated/url.js";
4
+ describe("Inference rules – url", () => {
5
+ it("urlRule should match an HTTP URL", () => {
6
+ const httpUrls = ["https://example.com", "http://example.com"];
7
+ for (const rawValue of httpUrls) {
8
+ const result = urlRule.tryInfer({
9
+ name: "HTTP_URL",
10
+ rawValue,
11
+ });
12
+ expect(result).not.toBeNull();
13
+ expect(result?.generated.imports[0].name).toBe(httpUrlGenSchema(rawValue).imports[0].name);
14
+ expect(result.confidence).toBeGreaterThanOrEqual(urlRule.threshold);
15
+ }
16
+ });
17
+ it("urlRule should match a database URL", () => {
18
+ const databaseUrls = ["postgres://user:pass@localhost:5432/app"];
19
+ for (const rawValue of databaseUrls) {
20
+ const result = urlRule.tryInfer({
21
+ name: "DATABASE_URL",
22
+ rawValue,
23
+ });
24
+ expect(result).not.toBeNull();
25
+ expect(result?.generated.imports[0].name).toBe(databaseUrlGenSchema(rawValue).imports[0].name);
26
+ expect(result.confidence).toBeGreaterThanOrEqual(urlRule.threshold);
27
+ }
28
+ });
29
+ it("urlRule should ignore invalid URLs", () => {
30
+ const invalidUrls = ["not-a-url", "https://", "not-a-url but contains a valid URL: https://example.com/path"];
31
+ for (const rawValue of invalidUrls) {
32
+ const result = urlRule.tryInfer({
33
+ name: "API_URL",
34
+ rawValue,
35
+ });
36
+ expect(result).toBeNull();
37
+ }
38
+ });
39
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=version.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.test.d.ts","sourceRoot":"","sources":["../../../../src/infer/__tests__/rules/version.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { versionRule } from "../../rules/version.js";
3
+ import { versionGenSchema } from "../../generated/version.js";
4
+ describe("Inference rules – version", () => {
5
+ it("versionRule should match a strict semver value", () => {
6
+ const validVersions = ["1.2.3", "123.345.567336"];
7
+ for (const rawValue of validVersions) {
8
+ const result = versionRule.tryInfer({
9
+ name: "APP_VERSION",
10
+ rawValue,
11
+ });
12
+ expect(result).not.toBeNull();
13
+ expect(result?.generated.imports[0].name).toBe(versionGenSchema(rawValue).imports[0].name);
14
+ expect(result.confidence).toBeGreaterThanOrEqual(versionRule.threshold);
15
+ }
16
+ });
17
+ it("versionRule should ignore two-part versions", () => {
18
+ const invalidVersions = ["2.0"];
19
+ for (const rawValue of invalidVersions) {
20
+ const result = versionRule.tryInfer({
21
+ name: "APP_VERSION",
22
+ rawValue,
23
+ });
24
+ expect(result).toBeNull();
25
+ }
26
+ });
27
+ it("versionRule should ignore invalid versions", () => {
28
+ const invalidVersions = ["v3.0", "v1.2.3", "3.0.0-rc", "123.345.A", "1.2.3A"];
29
+ for (const rawValue of invalidVersions) {
30
+ const result = versionRule.tryInfer({
31
+ name: "APP_VERSION",
32
+ rawValue,
33
+ });
34
+ expect(result).toBeNull();
35
+ }
36
+ });
37
+ });
@@ -0,0 +1,8 @@
1
+ import { GeneratedSchema } from "../types.js";
2
+ export declare const zUnknownGenSchema: GeneratedSchema;
3
+ export declare const zArrayOfUnknownGenSchema: GeneratedSchema;
4
+ export declare const zUrlGenSchema: GeneratedSchema;
5
+ export declare const zStringGenSchema: GeneratedSchema;
6
+ export declare const zNumberGenSchema: GeneratedSchema;
7
+ export declare const zEmailGenSchema: GeneratedSchema;
8
+ //# sourceMappingURL=basic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic.d.ts","sourceRoot":"","sources":["../../../src/infer/generated/basic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,iBAAiB,EAAE,eAG/B,CAAC;AACF,eAAO,MAAM,wBAAwB,EAAE,eAGtC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAG3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAG9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAG9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,eAG7B,CAAC"}
@@ -0,0 +1,24 @@
1
+ export const zUnknownGenSchema = {
2
+ code: "z.unknown()",
3
+ imports: [],
4
+ };
5
+ export const zArrayOfUnknownGenSchema = {
6
+ code: "z.array(z.unknown())",
7
+ imports: [],
8
+ };
9
+ export const zUrlGenSchema = {
10
+ code: "z.url()",
11
+ imports: [],
12
+ };
13
+ export const zStringGenSchema = {
14
+ code: "z.string()",
15
+ imports: [],
16
+ };
17
+ export const zNumberGenSchema = {
18
+ code: "z.coerce.number()",
19
+ imports: [],
20
+ };
21
+ export const zEmailGenSchema = {
22
+ code: "z.email()",
23
+ imports: [],
24
+ };
@@ -0,0 +1,3 @@
1
+ import { GeneratedSchema } from "../types.js";
2
+ export declare const boolGenSchema: (name: string) => GeneratedSchema;
3
+ //# sourceMappingURL=boolean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../../src/infer/generated/boolean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,eAQ3C,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const boolGenSchema = (name) => ({
2
+ code: `boolSchema(${JSON.stringify(name)})`,
3
+ imports: [
4
+ {
5
+ name: "boolSchema",
6
+ from: "@romaintaillandier1978/dotenv-never-lies",
7
+ },
8
+ ],
9
+ });
@@ -0,0 +1,3 @@
1
+ import { GeneratedSchema } from "../types.js";
2
+ export declare const durationGenSchema: (name: string) => GeneratedSchema;
3
+ //# sourceMappingURL=duration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../../../src/infer/generated/duration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,eAQ/C,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const durationGenSchema = (name) => ({
2
+ code: `durationSchema(${JSON.stringify(name)})`,
3
+ imports: [
4
+ {
5
+ name: "durationSchema",
6
+ from: "@romaintaillandier1978/dotenv-never-lies",
7
+ },
8
+ ],
9
+ });
@@ -0,0 +1,3 @@
1
+ import { GeneratedSchema } from "../types.js";
2
+ export declare const ipGenSchema: (name: string) => GeneratedSchema;
3
+ //# sourceMappingURL=ip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip.d.ts","sourceRoot":"","sources":["../../../src/infer/generated/ip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,eAQzC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const ipGenSchema = (name) => ({
2
+ code: `ipSchema(${JSON.stringify(name)})`,
3
+ imports: [
4
+ {
5
+ name: "ipSchema",
6
+ from: "@romaintaillandier1978/dotenv-never-lies",
7
+ },
8
+ ],
9
+ });
@@ -0,0 +1,4 @@
1
+ import { GeneratedSchema } from "../types.js";
2
+ export declare const jsonGenSchema: (name: string, of?: GeneratedSchema) => GeneratedSchema;
3
+ export declare const jsonGenSchemaNoName: GeneratedSchema;
4
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/infer/generated/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,KAAK,eAAe,KAAG,eAQjE,CAAC;AAEH,eAAO,MAAM,mBAAmB,iBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export const jsonGenSchema = (name, of) => ({
2
+ code: `jsonSchema(${JSON.stringify(name)}${of ? `, ${of.code}` : ""})`,
3
+ imports: [
4
+ {
5
+ name: "jsonSchema",
6
+ from: "@romaintaillandier1978/dotenv-never-lies",
7
+ },
8
+ ],
9
+ });
10
+ export const jsonGenSchemaNoName = jsonGenSchema("");
@@ -0,0 +1,8 @@
1
+ import { GeneratedSchema } from "../types.js";
2
+ export declare const listSchemaGen: (name: string) => GeneratedSchema;
3
+ export declare const keyValueSchemaGen: (name: string) => GeneratedSchema;
4
+ export declare const keyValueListSchemaGen: (name: string) => GeneratedSchema;
5
+ export declare const urlListSchemaGen: (name: string) => GeneratedSchema;
6
+ export declare const emailListSchemaGen: (name: string) => GeneratedSchema;
7
+ export declare const listOfSchemaGen: (name: string, of: GeneratedSchema) => GeneratedSchema;
8
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/infer/generated/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,eAQ3C,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,eAQ/C,CAAC;AACH,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,KAAG,eAQnD,CAAC;AAEH,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,eAQ9C,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,eAQhD,CAAC;AAEH,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,IAAI,eAAe,KAAG,eAGlE,CAAC"}
@@ -0,0 +1,49 @@
1
+ export const listSchemaGen = (name) => ({
2
+ code: `listSchema(${JSON.stringify(name)})`,
3
+ imports: [
4
+ {
5
+ name: "listSchema",
6
+ from: "@romaintaillandier1978/dotenv-never-lies",
7
+ },
8
+ ],
9
+ });
10
+ export const keyValueSchemaGen = (name) => ({
11
+ code: `keyValueSchema("${JSON.stringify(name)}")`,
12
+ imports: [
13
+ {
14
+ name: "keyValueSchema",
15
+ from: "@romaintaillandier1978/dotenv-never-lies",
16
+ },
17
+ ],
18
+ });
19
+ export const keyValueListSchemaGen = (name) => ({
20
+ code: `keyValueListSchema(${JSON.stringify(name)})`,
21
+ imports: [
22
+ {
23
+ name: "keyValueListSchema",
24
+ from: "@romaintaillandier1978/dotenv-never-lies",
25
+ },
26
+ ],
27
+ });
28
+ export const urlListSchemaGen = (name) => ({
29
+ code: `urlListSchema(${JSON.stringify(name)})`,
30
+ imports: [
31
+ {
32
+ name: "urlListSchema",
33
+ from: "@romaintaillandier1978/dotenv-never-lies",
34
+ },
35
+ ],
36
+ });
37
+ export const emailListSchemaGen = (name) => ({
38
+ code: `emailListSchema(${JSON.stringify(name)})`,
39
+ imports: [
40
+ {
41
+ name: "emailListSchema",
42
+ from: "@romaintaillandier1978/dotenv-never-lies",
43
+ },
44
+ ],
45
+ });
46
+ export const listOfSchemaGen = (name, of) => ({
47
+ code: `listSchema(${JSON.stringify(name)}, { of: ${of.code} })`,
48
+ imports: [{ name: "listSchema", from: "@romaintaillandier1978/dotenv-never-lies" }, ...of.imports],
49
+ });
@@ -0,0 +1,4 @@
1
+ import { GeneratedSchema } from "../types.js";
2
+ export declare const portGenSchema: (name: string) => GeneratedSchema;
3
+ export declare const portGenSchemaNoName: GeneratedSchema;
4
+ //# sourceMappingURL=port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../../src/infer/generated/port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,eAQ3C,CAAC;AAEH,eAAO,MAAM,mBAAmB,iBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export const portGenSchema = (name) => ({
2
+ code: `portSchema(${JSON.stringify(name)})`,
3
+ imports: [
4
+ {
5
+ name: "portSchema",
6
+ from: "@romaintaillandier1978/dotenv-never-lies",
7
+ },
8
+ ],
9
+ });
10
+ export const portGenSchemaNoName = portGenSchema("");
@@ -0,0 +1,14 @@
1
+ import { GeneratedSchema } from "../types.js";
2
+ export declare const httpUrlGenSchema: (name: string) => GeneratedSchema;
3
+ export declare const httpUrlGenSchemaNoName: GeneratedSchema;
4
+ export declare const databaseUrlGenSchema: (name: string) => GeneratedSchema;
5
+ export declare const databaseUrlGenSchemaNoName: GeneratedSchema;
6
+ export declare const queueUrlGenSchema: (name: string) => GeneratedSchema;
7
+ export declare const queueUrlGenSchemaNoName: GeneratedSchema;
8
+ export declare const wsUrlSchemaGen: (name: string) => GeneratedSchema;
9
+ export declare const wsUrlGenSchemaNoName: GeneratedSchema;
10
+ export declare const storageUrlGenSchema: (name: string) => GeneratedSchema;
11
+ export declare const storageUrlGenSchemaNoName: GeneratedSchema;
12
+ export declare const otherUrlGenSchema: (name: string) => GeneratedSchema;
13
+ export declare const otherUrlGenSchemaNoName: GeneratedSchema;
14
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/infer/generated/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,eAG9C,CAAC;AAEH,eAAO,MAAM,sBAAsB,iBAAuB,CAAC;AAE3D,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,eAGlD,CAAC;AAEH,eAAO,MAAM,0BAA0B,iBAA2B,CAAC;AAEnE,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,eAG/C,CAAC;AAEH,eAAO,MAAM,uBAAuB,iBAAwB,CAAC;AAE7D,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,eAG5C,CAAC;AAEH,eAAO,MAAM,oBAAoB,iBAAqB,CAAC;AAEvD,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,eAGjD,CAAC;AAEH,eAAO,MAAM,yBAAyB,iBAA0B,CAAC;AAEjE,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,eAG/C,CAAC;AAEH,eAAO,MAAM,uBAAuB,iBAAwB,CAAC"}
@@ -0,0 +1,30 @@
1
+ export const httpUrlGenSchema = (name) => ({
2
+ code: `httpUrlSchema(${JSON.stringify(name)})`,
3
+ imports: [{ name: "httpUrlSchema", from: "@romaintaillandier1978/dotenv-never-lies" }],
4
+ });
5
+ export const httpUrlGenSchemaNoName = httpUrlGenSchema("");
6
+ export const databaseUrlGenSchema = (name) => ({
7
+ code: `databaseUrlSchema(${JSON.stringify(name)})`,
8
+ imports: [{ name: "databaseUrlSchema", from: "@romaintaillandier1978/dotenv-never-lies" }],
9
+ });
10
+ export const databaseUrlGenSchemaNoName = databaseUrlGenSchema("");
11
+ export const queueUrlGenSchema = (name) => ({
12
+ code: `queueUrlSchema(${JSON.stringify(name)})`,
13
+ imports: [{ name: "queueUrlSchema", from: "@romaintaillandier1978/dotenv-never-lies" }],
14
+ });
15
+ export const queueUrlGenSchemaNoName = queueUrlGenSchema("");
16
+ export const wsUrlSchemaGen = (name) => ({
17
+ code: `wsUrlSchema(${JSON.stringify(name)})`,
18
+ imports: [{ name: "wsUrlSchema", from: "@romaintaillandier1978/dotenv-never-lies" }],
19
+ });
20
+ export const wsUrlGenSchemaNoName = wsUrlSchemaGen("");
21
+ export const storageUrlGenSchema = (name) => ({
22
+ code: `storageUrlSchema(${JSON.stringify(name)})`,
23
+ imports: [{ name: "storageUrlSchema", from: "@romaintaillandier1978/dotenv-never-lies" }],
24
+ });
25
+ export const storageUrlGenSchemaNoName = storageUrlGenSchema("");
26
+ export const otherUrlGenSchema = (name) => ({
27
+ code: `otherUrlSchema(${JSON.stringify(name)})`,
28
+ imports: [{ name: "otherUrlSchema", from: "@romaintaillandier1978/dotenv-never-lies" }],
29
+ });
30
+ export const otherUrlGenSchemaNoName = otherUrlGenSchema("");
@@ -0,0 +1,4 @@
1
+ import { GeneratedSchema } from "../types.js";
2
+ export declare const versionGenSchema: (name: string) => GeneratedSchema;
3
+ export declare const versionGenSchemaNoName: GeneratedSchema;
4
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/infer/generated/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,eAQ9C,CAAC;AACH,eAAO,MAAM,sBAAsB,iBAAuB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export const versionGenSchema = (name) => ({
2
+ code: `versionSchema(${JSON.stringify(name)})`,
3
+ imports: [
4
+ {
5
+ name: "versionSchema",
6
+ from: "@romaintaillandier1978/dotenv-never-lies",
7
+ },
8
+ ],
9
+ });
10
+ export const versionGenSchemaNoName = versionGenSchema("");
@@ -0,0 +1,11 @@
1
+ import { GeneratedSchema } from "./types.js";
2
+ export declare const inferSimpleSchemaForListItem: (rawValue: string) => GeneratedSchema;
3
+ export type MatchesEnvKeyResult = {
4
+ matched: boolean;
5
+ reason: string;
6
+ };
7
+ export declare const matchesEnvKey: (name: string, keys: string[]) => MatchesEnvKeyResult;
8
+ export declare const guessSecret: (name: string) => boolean;
9
+ export declare const areAllSameGenSchemas: (elements: GeneratedSchema[]) => boolean;
10
+ export declare const areSameGenSchemas: (a: GeneratedSchema, b: GeneratedSchema) => boolean;
11
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/infer/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,4BAA4B,GAAI,UAAU,MAAM,KAAG,eAY/D,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvE,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,KAAG,mBAW5D,CAAC;AAIF,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OAE1C,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,UAAU,eAAe,EAAE,KAAG,OAGlE,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,GAAG,eAAe,EAAE,GAAG,eAAe,KAAG,OAK1E,CAAC"}