@nymbalhq/config 0.2.0 → 1.0.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/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ export { CommerceSlot } from '@nymbalhq/types';
2
3
 
3
4
  /** The schema's JWT secret when none is configured: fine for development, refused in production. */
4
5
  declare const DEFAULT_JWT_SECRET = "dev-secret-please-override-me-1234567890";
@@ -141,83 +142,83 @@ declare const securitySchema: z.ZodObject<{
141
142
  }>;
142
143
  declare const commerceSchema: z.ZodObject<{
143
144
  payments: z.ZodObject<{
144
- provider: z.ZodString;
145
+ provider: z.ZodEnum<["native", "stripe", "custom"]>;
145
146
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
146
147
  }, "strip", z.ZodTypeAny, {
147
- provider: string;
148
+ provider: "native" | "stripe" | "custom";
148
149
  config?: Record<string, unknown> | undefined;
149
150
  }, {
150
- provider: string;
151
+ provider: "native" | "stripe" | "custom";
151
152
  config?: Record<string, unknown> | undefined;
152
153
  }>;
153
154
  email: z.ZodObject<{
154
- provider: z.ZodString;
155
+ provider: z.ZodEnum<["native", "smtp", "custom"]>;
155
156
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
156
157
  }, "strip", z.ZodTypeAny, {
157
- provider: string;
158
+ provider: "native" | "custom" | "smtp";
158
159
  config?: Record<string, unknown> | undefined;
159
160
  }, {
160
- provider: string;
161
+ provider: "native" | "custom" | "smtp";
161
162
  config?: Record<string, unknown> | undefined;
162
163
  }>;
163
164
  reviews: z.ZodObject<{
164
- provider: z.ZodString;
165
+ provider: z.ZodEnum<["native", "custom"]>;
165
166
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
166
167
  }, "strip", z.ZodTypeAny, {
167
- provider: string;
168
+ provider: "native" | "custom";
168
169
  config?: Record<string, unknown> | undefined;
169
170
  }, {
170
- provider: string;
171
+ provider: "native" | "custom";
171
172
  config?: Record<string, unknown> | undefined;
172
173
  }>;
173
174
  search: z.ZodObject<{
174
- provider: z.ZodString;
175
+ provider: z.ZodEnum<["native", "custom"]>;
175
176
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
176
177
  }, "strip", z.ZodTypeAny, {
177
- provider: string;
178
+ provider: "native" | "custom";
178
179
  config?: Record<string, unknown> | undefined;
179
180
  }, {
180
- provider: string;
181
+ provider: "native" | "custom";
181
182
  config?: Record<string, unknown> | undefined;
182
183
  }>;
183
184
  analytics: z.ZodObject<{
184
- provider: z.ZodString;
185
+ provider: z.ZodEnum<["native", "custom"]>;
185
186
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
186
187
  }, "strip", z.ZodTypeAny, {
187
- provider: string;
188
+ provider: "native" | "custom";
188
189
  config?: Record<string, unknown> | undefined;
189
190
  }, {
190
- provider: string;
191
+ provider: "native" | "custom";
191
192
  config?: Record<string, unknown> | undefined;
192
193
  }>;
193
194
  shipping: z.ZodObject<{
194
- provider: z.ZodString;
195
+ provider: z.ZodEnum<["native", "custom"]>;
195
196
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
196
197
  }, "strip", z.ZodTypeAny, {
197
- provider: string;
198
+ provider: "native" | "custom";
198
199
  config?: Record<string, unknown> | undefined;
199
200
  }, {
200
- provider: string;
201
+ provider: "native" | "custom";
201
202
  config?: Record<string, unknown> | undefined;
202
203
  }>;
203
204
  tax: z.ZodObject<{
204
- provider: z.ZodString;
205
+ provider: z.ZodEnum<["native", "custom"]>;
205
206
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
206
207
  }, "strip", z.ZodTypeAny, {
207
- provider: string;
208
+ provider: "native" | "custom";
208
209
  config?: Record<string, unknown> | undefined;
209
210
  }, {
210
- provider: string;
211
+ provider: "native" | "custom";
211
212
  config?: Record<string, unknown> | undefined;
212
213
  }>;
213
214
  ai: z.ZodObject<{
214
- provider: z.ZodString;
215
+ provider: z.ZodEnum<["none", "anthropic", "custom"]>;
215
216
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
216
217
  }, "strip", z.ZodTypeAny, {
217
- provider: string;
218
+ provider: "custom" | "none" | "anthropic";
218
219
  config?: Record<string, unknown> | undefined;
219
220
  }, {
220
- provider: string;
221
+ provider: "custom" | "none" | "anthropic";
221
222
  config?: Record<string, unknown> | undefined;
222
223
  }>;
223
224
  orders: z.ZodDefault<z.ZodObject<{
@@ -232,35 +233,35 @@ declare const commerceSchema: z.ZodObject<{
232
233
  }>>;
233
234
  }, "strip", z.ZodTypeAny, {
234
235
  payments: {
235
- provider: string;
236
+ provider: "native" | "stripe" | "custom";
236
237
  config?: Record<string, unknown> | undefined;
237
238
  };
238
239
  email: {
239
- provider: string;
240
+ provider: "native" | "custom" | "smtp";
240
241
  config?: Record<string, unknown> | undefined;
241
242
  };
242
243
  reviews: {
243
- provider: string;
244
+ provider: "native" | "custom";
244
245
  config?: Record<string, unknown> | undefined;
245
246
  };
246
247
  search: {
247
- provider: string;
248
+ provider: "native" | "custom";
248
249
  config?: Record<string, unknown> | undefined;
249
250
  };
250
251
  analytics: {
251
- provider: string;
252
+ provider: "native" | "custom";
252
253
  config?: Record<string, unknown> | undefined;
253
254
  };
254
255
  shipping: {
255
- provider: string;
256
+ provider: "native" | "custom";
256
257
  config?: Record<string, unknown> | undefined;
257
258
  };
258
259
  tax: {
259
- provider: string;
260
+ provider: "native" | "custom";
260
261
  config?: Record<string, unknown> | undefined;
261
262
  };
262
263
  ai: {
263
- provider: string;
264
+ provider: "custom" | "none" | "anthropic";
264
265
  config?: Record<string, unknown> | undefined;
265
266
  };
266
267
  orders: {
@@ -269,35 +270,35 @@ declare const commerceSchema: z.ZodObject<{
269
270
  };
270
271
  }, {
271
272
  payments: {
272
- provider: string;
273
+ provider: "native" | "stripe" | "custom";
273
274
  config?: Record<string, unknown> | undefined;
274
275
  };
275
276
  email: {
276
- provider: string;
277
+ provider: "native" | "custom" | "smtp";
277
278
  config?: Record<string, unknown> | undefined;
278
279
  };
279
280
  reviews: {
280
- provider: string;
281
+ provider: "native" | "custom";
281
282
  config?: Record<string, unknown> | undefined;
282
283
  };
283
284
  search: {
284
- provider: string;
285
+ provider: "native" | "custom";
285
286
  config?: Record<string, unknown> | undefined;
286
287
  };
287
288
  analytics: {
288
- provider: string;
289
+ provider: "native" | "custom";
289
290
  config?: Record<string, unknown> | undefined;
290
291
  };
291
292
  shipping: {
292
- provider: string;
293
+ provider: "native" | "custom";
293
294
  config?: Record<string, unknown> | undefined;
294
295
  };
295
296
  tax: {
296
- provider: string;
297
+ provider: "native" | "custom";
297
298
  config?: Record<string, unknown> | undefined;
298
299
  };
299
300
  ai: {
300
- provider: string;
301
+ provider: "custom" | "none" | "anthropic";
301
302
  config?: Record<string, unknown> | undefined;
302
303
  };
303
304
  orders?: {
@@ -501,83 +502,83 @@ declare const nymbalConfigSchema: z.ZodEffects<z.ZodObject<{
501
502
  }>;
502
503
  commerce: z.ZodObject<{
503
504
  payments: z.ZodObject<{
504
- provider: z.ZodString;
505
+ provider: z.ZodEnum<["native", "stripe", "custom"]>;
505
506
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
506
507
  }, "strip", z.ZodTypeAny, {
507
- provider: string;
508
+ provider: "native" | "stripe" | "custom";
508
509
  config?: Record<string, unknown> | undefined;
509
510
  }, {
510
- provider: string;
511
+ provider: "native" | "stripe" | "custom";
511
512
  config?: Record<string, unknown> | undefined;
512
513
  }>;
513
514
  email: z.ZodObject<{
514
- provider: z.ZodString;
515
+ provider: z.ZodEnum<["native", "smtp", "custom"]>;
515
516
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
516
517
  }, "strip", z.ZodTypeAny, {
517
- provider: string;
518
+ provider: "native" | "custom" | "smtp";
518
519
  config?: Record<string, unknown> | undefined;
519
520
  }, {
520
- provider: string;
521
+ provider: "native" | "custom" | "smtp";
521
522
  config?: Record<string, unknown> | undefined;
522
523
  }>;
523
524
  reviews: z.ZodObject<{
524
- provider: z.ZodString;
525
+ provider: z.ZodEnum<["native", "custom"]>;
525
526
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
526
527
  }, "strip", z.ZodTypeAny, {
527
- provider: string;
528
+ provider: "native" | "custom";
528
529
  config?: Record<string, unknown> | undefined;
529
530
  }, {
530
- provider: string;
531
+ provider: "native" | "custom";
531
532
  config?: Record<string, unknown> | undefined;
532
533
  }>;
533
534
  search: z.ZodObject<{
534
- provider: z.ZodString;
535
+ provider: z.ZodEnum<["native", "custom"]>;
535
536
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
536
537
  }, "strip", z.ZodTypeAny, {
537
- provider: string;
538
+ provider: "native" | "custom";
538
539
  config?: Record<string, unknown> | undefined;
539
540
  }, {
540
- provider: string;
541
+ provider: "native" | "custom";
541
542
  config?: Record<string, unknown> | undefined;
542
543
  }>;
543
544
  analytics: z.ZodObject<{
544
- provider: z.ZodString;
545
+ provider: z.ZodEnum<["native", "custom"]>;
545
546
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
546
547
  }, "strip", z.ZodTypeAny, {
547
- provider: string;
548
+ provider: "native" | "custom";
548
549
  config?: Record<string, unknown> | undefined;
549
550
  }, {
550
- provider: string;
551
+ provider: "native" | "custom";
551
552
  config?: Record<string, unknown> | undefined;
552
553
  }>;
553
554
  shipping: z.ZodObject<{
554
- provider: z.ZodString;
555
+ provider: z.ZodEnum<["native", "custom"]>;
555
556
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
556
557
  }, "strip", z.ZodTypeAny, {
557
- provider: string;
558
+ provider: "native" | "custom";
558
559
  config?: Record<string, unknown> | undefined;
559
560
  }, {
560
- provider: string;
561
+ provider: "native" | "custom";
561
562
  config?: Record<string, unknown> | undefined;
562
563
  }>;
563
564
  tax: z.ZodObject<{
564
- provider: z.ZodString;
565
+ provider: z.ZodEnum<["native", "custom"]>;
565
566
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
566
567
  }, "strip", z.ZodTypeAny, {
567
- provider: string;
568
+ provider: "native" | "custom";
568
569
  config?: Record<string, unknown> | undefined;
569
570
  }, {
570
- provider: string;
571
+ provider: "native" | "custom";
571
572
  config?: Record<string, unknown> | undefined;
572
573
  }>;
573
574
  ai: z.ZodObject<{
574
- provider: z.ZodString;
575
+ provider: z.ZodEnum<["none", "anthropic", "custom"]>;
575
576
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
576
577
  }, "strip", z.ZodTypeAny, {
577
- provider: string;
578
+ provider: "custom" | "none" | "anthropic";
578
579
  config?: Record<string, unknown> | undefined;
579
580
  }, {
580
- provider: string;
581
+ provider: "custom" | "none" | "anthropic";
581
582
  config?: Record<string, unknown> | undefined;
582
583
  }>;
583
584
  orders: z.ZodDefault<z.ZodObject<{
@@ -592,35 +593,35 @@ declare const nymbalConfigSchema: z.ZodEffects<z.ZodObject<{
592
593
  }>>;
593
594
  }, "strip", z.ZodTypeAny, {
594
595
  payments: {
595
- provider: string;
596
+ provider: "native" | "stripe" | "custom";
596
597
  config?: Record<string, unknown> | undefined;
597
598
  };
598
599
  email: {
599
- provider: string;
600
+ provider: "native" | "custom" | "smtp";
600
601
  config?: Record<string, unknown> | undefined;
601
602
  };
602
603
  reviews: {
603
- provider: string;
604
+ provider: "native" | "custom";
604
605
  config?: Record<string, unknown> | undefined;
605
606
  };
606
607
  search: {
607
- provider: string;
608
+ provider: "native" | "custom";
608
609
  config?: Record<string, unknown> | undefined;
609
610
  };
610
611
  analytics: {
611
- provider: string;
612
+ provider: "native" | "custom";
612
613
  config?: Record<string, unknown> | undefined;
613
614
  };
614
615
  shipping: {
615
- provider: string;
616
+ provider: "native" | "custom";
616
617
  config?: Record<string, unknown> | undefined;
617
618
  };
618
619
  tax: {
619
- provider: string;
620
+ provider: "native" | "custom";
620
621
  config?: Record<string, unknown> | undefined;
621
622
  };
622
623
  ai: {
623
- provider: string;
624
+ provider: "custom" | "none" | "anthropic";
624
625
  config?: Record<string, unknown> | undefined;
625
626
  };
626
627
  orders: {
@@ -629,35 +630,35 @@ declare const nymbalConfigSchema: z.ZodEffects<z.ZodObject<{
629
630
  };
630
631
  }, {
631
632
  payments: {
632
- provider: string;
633
+ provider: "native" | "stripe" | "custom";
633
634
  config?: Record<string, unknown> | undefined;
634
635
  };
635
636
  email: {
636
- provider: string;
637
+ provider: "native" | "custom" | "smtp";
637
638
  config?: Record<string, unknown> | undefined;
638
639
  };
639
640
  reviews: {
640
- provider: string;
641
+ provider: "native" | "custom";
641
642
  config?: Record<string, unknown> | undefined;
642
643
  };
643
644
  search: {
644
- provider: string;
645
+ provider: "native" | "custom";
645
646
  config?: Record<string, unknown> | undefined;
646
647
  };
647
648
  analytics: {
648
- provider: string;
649
+ provider: "native" | "custom";
649
650
  config?: Record<string, unknown> | undefined;
650
651
  };
651
652
  shipping: {
652
- provider: string;
653
+ provider: "native" | "custom";
653
654
  config?: Record<string, unknown> | undefined;
654
655
  };
655
656
  tax: {
656
- provider: string;
657
+ provider: "native" | "custom";
657
658
  config?: Record<string, unknown> | undefined;
658
659
  };
659
660
  ai: {
660
- provider: string;
661
+ provider: "custom" | "none" | "anthropic";
661
662
  config?: Record<string, unknown> | undefined;
662
663
  };
663
664
  orders?: {
@@ -761,35 +762,35 @@ declare const nymbalConfigSchema: z.ZodEffects<z.ZodObject<{
761
762
  };
762
763
  commerce: {
763
764
  payments: {
764
- provider: string;
765
+ provider: "native" | "stripe" | "custom";
765
766
  config?: Record<string, unknown> | undefined;
766
767
  };
767
768
  email: {
768
- provider: string;
769
+ provider: "native" | "custom" | "smtp";
769
770
  config?: Record<string, unknown> | undefined;
770
771
  };
771
772
  reviews: {
772
- provider: string;
773
+ provider: "native" | "custom";
773
774
  config?: Record<string, unknown> | undefined;
774
775
  };
775
776
  search: {
776
- provider: string;
777
+ provider: "native" | "custom";
777
778
  config?: Record<string, unknown> | undefined;
778
779
  };
779
780
  analytics: {
780
- provider: string;
781
+ provider: "native" | "custom";
781
782
  config?: Record<string, unknown> | undefined;
782
783
  };
783
784
  shipping: {
784
- provider: string;
785
+ provider: "native" | "custom";
785
786
  config?: Record<string, unknown> | undefined;
786
787
  };
787
788
  tax: {
788
- provider: string;
789
+ provider: "native" | "custom";
789
790
  config?: Record<string, unknown> | undefined;
790
791
  };
791
792
  ai: {
792
- provider: string;
793
+ provider: "custom" | "none" | "anthropic";
793
794
  config?: Record<string, unknown> | undefined;
794
795
  };
795
796
  orders: {
@@ -856,35 +857,35 @@ declare const nymbalConfigSchema: z.ZodEffects<z.ZodObject<{
856
857
  };
857
858
  commerce: {
858
859
  payments: {
859
- provider: string;
860
+ provider: "native" | "stripe" | "custom";
860
861
  config?: Record<string, unknown> | undefined;
861
862
  };
862
863
  email: {
863
- provider: string;
864
+ provider: "native" | "custom" | "smtp";
864
865
  config?: Record<string, unknown> | undefined;
865
866
  };
866
867
  reviews: {
867
- provider: string;
868
+ provider: "native" | "custom";
868
869
  config?: Record<string, unknown> | undefined;
869
870
  };
870
871
  search: {
871
- provider: string;
872
+ provider: "native" | "custom";
872
873
  config?: Record<string, unknown> | undefined;
873
874
  };
874
875
  analytics: {
875
- provider: string;
876
+ provider: "native" | "custom";
876
877
  config?: Record<string, unknown> | undefined;
877
878
  };
878
879
  shipping: {
879
- provider: string;
880
+ provider: "native" | "custom";
880
881
  config?: Record<string, unknown> | undefined;
881
882
  };
882
883
  tax: {
883
- provider: string;
884
+ provider: "native" | "custom";
884
885
  config?: Record<string, unknown> | undefined;
885
886
  };
886
887
  ai: {
887
- provider: string;
888
+ provider: "custom" | "none" | "anthropic";
888
889
  config?: Record<string, unknown> | undefined;
889
890
  };
890
891
  orders?: {
@@ -951,35 +952,35 @@ declare const nymbalConfigSchema: z.ZodEffects<z.ZodObject<{
951
952
  };
952
953
  commerce: {
953
954
  payments: {
954
- provider: string;
955
+ provider: "native" | "stripe" | "custom";
955
956
  config?: Record<string, unknown> | undefined;
956
957
  };
957
958
  email: {
958
- provider: string;
959
+ provider: "native" | "custom" | "smtp";
959
960
  config?: Record<string, unknown> | undefined;
960
961
  };
961
962
  reviews: {
962
- provider: string;
963
+ provider: "native" | "custom";
963
964
  config?: Record<string, unknown> | undefined;
964
965
  };
965
966
  search: {
966
- provider: string;
967
+ provider: "native" | "custom";
967
968
  config?: Record<string, unknown> | undefined;
968
969
  };
969
970
  analytics: {
970
- provider: string;
971
+ provider: "native" | "custom";
971
972
  config?: Record<string, unknown> | undefined;
972
973
  };
973
974
  shipping: {
974
- provider: string;
975
+ provider: "native" | "custom";
975
976
  config?: Record<string, unknown> | undefined;
976
977
  };
977
978
  tax: {
978
- provider: string;
979
+ provider: "native" | "custom";
979
980
  config?: Record<string, unknown> | undefined;
980
981
  };
981
982
  ai: {
982
- provider: string;
983
+ provider: "custom" | "none" | "anthropic";
983
984
  config?: Record<string, unknown> | undefined;
984
985
  };
985
986
  orders: {
@@ -1046,35 +1047,35 @@ declare const nymbalConfigSchema: z.ZodEffects<z.ZodObject<{
1046
1047
  };
1047
1048
  commerce: {
1048
1049
  payments: {
1049
- provider: string;
1050
+ provider: "native" | "stripe" | "custom";
1050
1051
  config?: Record<string, unknown> | undefined;
1051
1052
  };
1052
1053
  email: {
1053
- provider: string;
1054
+ provider: "native" | "custom" | "smtp";
1054
1055
  config?: Record<string, unknown> | undefined;
1055
1056
  };
1056
1057
  reviews: {
1057
- provider: string;
1058
+ provider: "native" | "custom";
1058
1059
  config?: Record<string, unknown> | undefined;
1059
1060
  };
1060
1061
  search: {
1061
- provider: string;
1062
+ provider: "native" | "custom";
1062
1063
  config?: Record<string, unknown> | undefined;
1063
1064
  };
1064
1065
  analytics: {
1065
- provider: string;
1066
+ provider: "native" | "custom";
1066
1067
  config?: Record<string, unknown> | undefined;
1067
1068
  };
1068
1069
  shipping: {
1069
- provider: string;
1070
+ provider: "native" | "custom";
1070
1071
  config?: Record<string, unknown> | undefined;
1071
1072
  };
1072
1073
  tax: {
1073
- provider: string;
1074
+ provider: "native" | "custom";
1074
1075
  config?: Record<string, unknown> | undefined;
1075
1076
  };
1076
1077
  ai: {
1077
- provider: string;
1078
+ provider: "custom" | "none" | "anthropic";
1078
1079
  config?: Record<string, unknown> | undefined;
1079
1080
  };
1080
1081
  orders?: {
@@ -1111,6 +1112,21 @@ declare function envOptional(key: string): string | undefined;
1111
1112
  declare function envNumber(key: string, defaultValue?: number): number;
1112
1113
  declare function envBool(key: string, defaultValue?: boolean): boolean;
1113
1114
 
1115
+ /**
1116
+ * The providers each commerce slot accepts. A provider that needs an SDK lives in an `@nymbalhq/adapter-*` package the
1117
+ * kernel loads only when the config names it; `custom` takes the adapter a project passes to `createApp`.
1118
+ */
1119
+ declare const KNOWN_PROVIDERS: {
1120
+ readonly payments: readonly ["native", "stripe", "custom"];
1121
+ readonly email: readonly ["native", "smtp", "custom"];
1122
+ readonly reviews: readonly ["native", "custom"];
1123
+ readonly search: readonly ["native", "custom"];
1124
+ readonly analytics: readonly ["native", "custom"];
1125
+ readonly shipping: readonly ["native", "custom"];
1126
+ readonly tax: readonly ["native", "custom"];
1127
+ readonly ai: readonly ["none", "anthropic", "custom"];
1128
+ };
1129
+
1114
1130
  interface LoadedConfig {
1115
1131
  config: NymbalConfig;
1116
1132
  path: string;
@@ -1119,4 +1135,4 @@ interface LoadedConfig {
1119
1135
  declare function findConfigFile(startDir: string): string | null;
1120
1136
  declare function loadConfig(startDir?: string): Promise<LoadedConfig>;
1121
1137
 
1122
- export { DEFAULT_JWT_SECRET, type LoadedConfig, type NymbalConfig, type NymbalConfigInput, commerceSchema, defineConfig, deploymentSchema, env, envBool, envNumber, envOptional, featuresSchema, findConfigFile, httpSchema, infrastructureSchema, loadConfig, nymbalConfigSchema, securitySchema, storeSchema };
1138
+ export { DEFAULT_JWT_SECRET, KNOWN_PROVIDERS, type LoadedConfig, type NymbalConfig, type NymbalConfigInput, commerceSchema, defineConfig, deploymentSchema, env, envBool, envNumber, envOptional, featuresSchema, findConfigFile, httpSchema, infrastructureSchema, loadConfig, nymbalConfigSchema, securitySchema, storeSchema };
package/dist/index.js CHANGED
@@ -37,6 +37,18 @@ function envBool(key, defaultValue = false) {
37
37
  return raw === "true" || raw === "1" || raw === "yes" || raw === "on";
38
38
  }
39
39
 
40
+ // src/known-providers.ts
41
+ var KNOWN_PROVIDERS = {
42
+ payments: ["native", "stripe", "custom"],
43
+ email: ["native", "smtp", "custom"],
44
+ reviews: ["native", "custom"],
45
+ search: ["native", "custom"],
46
+ analytics: ["native", "custom"],
47
+ shipping: ["native", "custom"],
48
+ tax: ["native", "custom"],
49
+ ai: ["none", "anthropic", "custom"]
50
+ };
51
+
40
52
  // src/load.ts
41
53
  import { existsSync } from "fs";
42
54
  import { dirname, isAbsolute, resolve } from "path";
@@ -92,19 +104,26 @@ var securitySchema = z.object({
92
104
  refreshTtl: z.string().regex(/^\d+(ms|s|m|h|d)$/, 'TTL must look like "7d"').default("7d")
93
105
  }).default({})
94
106
  });
95
- var adapterBlock = z.object({
96
- provider: z.string().min(1),
97
- config: z.record(z.string(), z.unknown()).optional()
98
- });
107
+ function adapterBlock(slot, providers) {
108
+ const known = providers.map((p) => `'${p}'`).join(", ");
109
+ return z.object({
110
+ provider: z.enum(providers, {
111
+ errorMap: (issue, ctx) => issue.code === z.ZodIssueCode.invalid_enum_value ? {
112
+ message: `unknown ${slot} provider '${String(issue.received)}'; the ${slot} providers are ${known}`
113
+ } : { message: ctx.defaultError }
114
+ }),
115
+ config: z.record(z.string(), z.unknown()).optional()
116
+ });
117
+ }
99
118
  var commerceSchema = z.object({
100
- payments: adapterBlock,
101
- email: adapterBlock,
102
- reviews: adapterBlock,
103
- search: adapterBlock,
104
- analytics: adapterBlock,
105
- shipping: adapterBlock,
106
- tax: adapterBlock,
107
- ai: adapterBlock,
119
+ payments: adapterBlock("payments", KNOWN_PROVIDERS.payments),
120
+ email: adapterBlock("email", KNOWN_PROVIDERS.email),
121
+ reviews: adapterBlock("reviews", KNOWN_PROVIDERS.reviews),
122
+ search: adapterBlock("search", KNOWN_PROVIDERS.search),
123
+ analytics: adapterBlock("analytics", KNOWN_PROVIDERS.analytics),
124
+ shipping: adapterBlock("shipping", KNOWN_PROVIDERS.shipping),
125
+ tax: adapterBlock("tax", KNOWN_PROVIDERS.tax),
126
+ ai: adapterBlock("ai", KNOWN_PROVIDERS.ai),
108
127
  orders: z.object({
109
128
  numberPrefix: z.string().min(1).default("NYM"),
110
129
  numberStart: z.number().int().nonnegative().default(1e3)
@@ -166,6 +185,14 @@ var nymbalConfigSchema = z.object({
166
185
  });
167
186
  }
168
187
  }
188
+ const email = cfg.commerce.email;
189
+ if (email.provider === "native" && email.config?.["transport"] === "smtp") {
190
+ ctx.addIssue({
191
+ code: z.ZodIssueCode.custom,
192
+ path: ["commerce", "email", "config", "transport"],
193
+ message: `the native email provider only prints to the console; for SMTP mail set email.provider to 'smtp' (@nymbalhq/adapter-smtp)`
194
+ });
195
+ }
169
196
  if (cfg.security.adapter === "middleware") {
170
197
  if (["aws", "gcp", "azure"].includes(cfg.infrastructure.cloud)) {
171
198
  ctx.addIssue({
@@ -230,6 +257,7 @@ ${lines.join("\n")}`;
230
257
  }
231
258
  export {
232
259
  DEFAULT_JWT_SECRET,
260
+ KNOWN_PROVIDERS,
233
261
  commerceSchema,
234
262
  defineConfig,
235
263
  deploymentSchema,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/define-config.ts","../src/env.ts","../src/load.ts","../src/schema.ts"],"sourcesContent":["import type { NymbalConfigInput } from './schema.js'\n\nexport function defineConfig<T extends NymbalConfigInput>(config: T): T {\n return config\n}\n","import { ConfigError } from '@nymbalhq/types'\n\nexport function env(key: string, defaultValue?: string): string {\n const value = process.env[key]\n if (value !== undefined && value !== '') return value\n if (defaultValue !== undefined) return defaultValue\n throw new ConfigError(`Missing required environment variable: ${key}`, {\n context: { key },\n })\n}\n\nexport function envOptional(key: string): string | undefined {\n const value = process.env[key]\n return value !== undefined && value !== '' ? value : undefined\n}\n\nexport function envNumber(key: string, defaultValue?: number): number {\n const raw = envOptional(key)\n if (raw === undefined) {\n if (defaultValue !== undefined) return defaultValue\n throw new ConfigError(`Missing required environment variable: ${key}`, { context: { key } })\n }\n const parsed = Number(raw)\n if (!Number.isFinite(parsed)) {\n throw new ConfigError(`Environment variable ${key} is not a valid number: ${raw}`, {\n context: { key, raw },\n })\n }\n return parsed\n}\n\nexport function envBool(key: string, defaultValue = false): boolean {\n const raw = envOptional(key)?.toLowerCase()\n if (raw === undefined) return defaultValue\n return raw === 'true' || raw === '1' || raw === 'yes' || raw === 'on'\n}\n","import { existsSync } from 'node:fs'\nimport { dirname, isAbsolute, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { createJiti } from 'jiti'\nimport { z } from 'zod'\nimport { ConfigError } from '@nymbalhq/types'\nimport { nymbalConfigSchema, type NymbalConfig } from './schema.js'\n\nconst CONFIG_FILE = 'nymbal.config.ts'\n\nexport interface LoadedConfig {\n config: NymbalConfig\n path: string\n projectRoot: string\n}\n\nexport function findConfigFile(startDir: string): string | null {\n let current = isAbsolute(startDir) ? startDir : resolve(startDir)\n while (true) {\n const candidate = resolve(current, CONFIG_FILE)\n if (existsSync(candidate)) return candidate\n const parent = dirname(current)\n if (parent === current) return null\n current = parent\n }\n}\n\nexport async function loadConfig(startDir: string = process.cwd()): Promise<LoadedConfig> {\n const path = findConfigFile(startDir)\n if (!path) {\n throw new ConfigError(\n `Could not find ${CONFIG_FILE} in ${startDir} or any parent directory.`,\n { context: { startDir } },\n )\n }\n\n const jiti = createJiti(pathToFileURL(path).href, { interopDefault: true })\n let raw: unknown\n try {\n raw = await jiti.import(path, { default: true })\n } catch (err) {\n throw new ConfigError(`Failed to load ${path}: ${(err as Error).message}`, {\n cause: err,\n context: { path },\n })\n }\n\n try {\n const config = nymbalConfigSchema.parse(raw)\n return { config, path, projectRoot: dirname(path) }\n } catch (err) {\n if (err instanceof z.ZodError) {\n throw new ConfigError(formatZodError(err, path), {\n cause: err,\n context: { path, issues: err.issues },\n })\n }\n throw err\n }\n}\n\nfunction formatZodError(err: z.ZodError, path: string): string {\n const lines = err.issues.map((issue) => {\n const at = issue.path.length > 0 ? issue.path.join('.') : '<root>'\n return ` • ${at}: ${issue.message}`\n })\n return `Invalid configuration in ${path}:\\n${lines.join('\\n')}`\n}\n","import { z } from 'zod'\n\nconst rateLimitRuleSchema = z.object({\n requests: z.number().int().positive(),\n window: z.string().regex(/^\\d+(ms|s|m|h)$/, 'window must look like \"60s\", \"5m\", \"1h\"'),\n action: z.enum(['block', 'challenge', 'throttle']),\n})\n\nconst rateLimitPathPattern = /^\\/[\\w\\-/*:]*$/\n\n/** The schema's JWT secret when none is configured: fine for development, refused in production. */\nexport const DEFAULT_JWT_SECRET = 'dev-secret-please-override-me-1234567890'\n\nexport const storeSchema = z.object({\n name: z.string().min(1),\n currency: z.string().length(3),\n locale: z.string().min(2),\n timezone: z.string().min(1),\n})\n\nexport const infrastructureSchema = z.object({\n cloud: z.enum(['local', 'aws', 'gcp', 'azure', 'docker']),\n commandStore: z.enum(['sqlite', 'postgres']),\n documentStore: z.enum(['in-memory', 'dynamodb', 'firestore', 'cosmosdb', 'postgres-jsonb']),\n eventBus: z.enum(['in-process', 'eventbridge', 'pubsub', 'service-bus', 'redis-streams']),\n compute: z.enum(['in-process', 'lambda', 'cloud-functions', 'azure-functions', 'worker-threads']),\n})\n\nexport const securitySchema = z.object({\n adapter: z.enum(['middleware', 'cloudflare', 'aws-waf', 'akamai']),\n rateLimit: z\n .record(\n z.string().regex(rateLimitPathPattern, {\n message: 'rate limit keys must start with \"/\" and use only letters, numbers, -, _, /, *, :',\n }),\n rateLimitRuleSchema,\n )\n .default({}),\n botProtection: z\n .object({\n mode: z.enum(['off', 'managed', 'strict']).default('off'),\n allowList: z.array(z.string()).default([]),\n })\n .default({ mode: 'off', allowList: [] }),\n headers: z\n .object({\n hsts: z.boolean().default(true),\n contentSecurityPolicy: z\n .union([z.enum(['strict', 'relaxed', 'off']), z.string()])\n .default('strict'),\n referrerPolicy: z.string().default('strict-origin-when-cross-origin'),\n xFrameOptions: z.enum(['deny', 'sameorigin']).default('deny'),\n })\n .default({}),\n csrf: z.boolean().default(true),\n auth: z\n .object({\n jwtSecret: z.string().min(16).default(DEFAULT_JWT_SECRET),\n accessTtl: z\n .string()\n .regex(/^\\d+(ms|s|m|h|d)$/, 'TTL must look like \"15m\"')\n .default('15m'),\n refreshTtl: z\n .string()\n .regex(/^\\d+(ms|s|m|h|d)$/, 'TTL must look like \"7d\"')\n .default('7d'),\n })\n .default({}),\n})\n\nconst adapterBlock = z.object({\n provider: z.string().min(1),\n config: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const commerceSchema = z.object({\n payments: adapterBlock,\n email: adapterBlock,\n reviews: adapterBlock,\n search: adapterBlock,\n analytics: adapterBlock,\n shipping: adapterBlock,\n tax: adapterBlock,\n ai: adapterBlock,\n orders: z\n .object({\n numberPrefix: z.string().min(1).default('NYM'),\n numberStart: z.number().int().nonnegative().default(1000),\n })\n .default({}),\n})\n\nexport const httpSchema = z.object({\n adapter: z.enum(['fastify', 'hono']).default('fastify'),\n port: z.number().int().positive().default(3001),\n host: z.string().default('0.0.0.0'),\n /** Whether `X-Forwarded-For` sets the client IP the rate limiter keys on; only behind a proxy you run. */\n trustProxy: z.boolean().default(false),\n cors: z\n .object({\n allowedOrigins: z\n .array(z.string())\n .default(['http://localhost:3000', 'http://localhost:4321']),\n credentials: z.boolean().default(true),\n })\n .default({}),\n})\n\nexport const deploymentSchema = z.object({\n strategy: z.enum(['standard', 'blue-green']).default('standard'),\n})\n\nexport const featuresSchema = z.object({\n staging: z.boolean().default(false),\n heartbeat: z.boolean().default(false),\n autoUpdates: z.boolean().default(false),\n})\n\nexport const nymbalConfigSchema = z\n .object({\n store: storeSchema,\n template: z.enum(['astro', 'nextjs']),\n infrastructure: infrastructureSchema,\n security: securitySchema,\n commerce: commerceSchema,\n http: httpSchema,\n deployment: deploymentSchema,\n features: featuresSchema.default({\n staging: false,\n heartbeat: false,\n autoUpdates: false,\n }),\n })\n .superRefine((cfg, ctx) => {\n // Local infrastructure restricts which document-store / event-bus options make sense.\n if (cfg.infrastructure.cloud === 'local') {\n if (!['in-memory', 'postgres-jsonb'].includes(cfg.infrastructure.documentStore)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['infrastructure', 'documentStore'],\n message: `cloud=local only supports 'in-memory' or 'postgres-jsonb' for documentStore`,\n })\n }\n if (!['in-process', 'redis-streams'].includes(cfg.infrastructure.eventBus)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['infrastructure', 'eventBus'],\n message: `cloud=local only supports 'in-process' or 'redis-streams' for eventBus`,\n })\n }\n if (!['in-process', 'worker-threads'].includes(cfg.infrastructure.compute)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['infrastructure', 'compute'],\n message: `cloud=local only supports 'in-process' or 'worker-threads' for compute`,\n })\n }\n }\n\n // middleware security adapter is v0.1 and not intended for managed-cloud production deployments.\n if (cfg.security.adapter === 'middleware') {\n if (['aws', 'gcp', 'azure'].includes(cfg.infrastructure.cloud)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['security', 'adapter'],\n message: `security.adapter='middleware' is intended for local/docker development. Use a WAF adapter ('cloudflare', 'aws-waf', 'akamai') for cloud=${cfg.infrastructure.cloud}.`,\n })\n }\n }\n })\n\nexport type NymbalConfigInput = z.input<typeof nymbalConfigSchema>\nexport type NymbalConfig = z.output<typeof nymbalConfigSchema>\n"],"mappings":"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","names":["z","ConfigError","ConfigError","z"]}
1
+ {"version":3,"sources":["../src/define-config.ts","../src/env.ts","../src/known-providers.ts","../src/load.ts","../src/schema.ts"],"sourcesContent":["import type { NymbalConfigInput } from './schema.js'\n\nexport function defineConfig<T extends NymbalConfigInput>(config: T): T {\n return config\n}\n","import { ConfigError } from '@nymbalhq/types'\n\nexport function env(key: string, defaultValue?: string): string {\n const value = process.env[key]\n if (value !== undefined && value !== '') return value\n if (defaultValue !== undefined) return defaultValue\n throw new ConfigError(`Missing required environment variable: ${key}`, {\n context: { key },\n })\n}\n\nexport function envOptional(key: string): string | undefined {\n const value = process.env[key]\n return value !== undefined && value !== '' ? value : undefined\n}\n\nexport function envNumber(key: string, defaultValue?: number): number {\n const raw = envOptional(key)\n if (raw === undefined) {\n if (defaultValue !== undefined) return defaultValue\n throw new ConfigError(`Missing required environment variable: ${key}`, { context: { key } })\n }\n const parsed = Number(raw)\n if (!Number.isFinite(parsed)) {\n throw new ConfigError(`Environment variable ${key} is not a valid number: ${raw}`, {\n context: { key, raw },\n })\n }\n return parsed\n}\n\nexport function envBool(key: string, defaultValue = false): boolean {\n const raw = envOptional(key)?.toLowerCase()\n if (raw === undefined) return defaultValue\n return raw === 'true' || raw === '1' || raw === 'yes' || raw === 'on'\n}\n","import type { CommerceSlot } from '@nymbalhq/types'\n\nexport type { CommerceSlot }\n\n/**\n * The providers each commerce slot accepts. A provider that needs an SDK lives in an `@nymbalhq/adapter-*` package the\n * kernel loads only when the config names it; `custom` takes the adapter a project passes to `createApp`.\n */\nexport const KNOWN_PROVIDERS = {\n payments: ['native', 'stripe', 'custom'],\n email: ['native', 'smtp', 'custom'],\n reviews: ['native', 'custom'],\n search: ['native', 'custom'],\n analytics: ['native', 'custom'],\n shipping: ['native', 'custom'],\n tax: ['native', 'custom'],\n ai: ['none', 'anthropic', 'custom'],\n} as const satisfies Readonly<Record<CommerceSlot, readonly [string, ...string[]]>>\n","import { existsSync } from 'node:fs'\nimport { dirname, isAbsolute, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { createJiti } from 'jiti'\nimport { z } from 'zod'\nimport { ConfigError } from '@nymbalhq/types'\nimport { nymbalConfigSchema, type NymbalConfig } from './schema.js'\n\nconst CONFIG_FILE = 'nymbal.config.ts'\n\nexport interface LoadedConfig {\n config: NymbalConfig\n path: string\n projectRoot: string\n}\n\nexport function findConfigFile(startDir: string): string | null {\n let current = isAbsolute(startDir) ? startDir : resolve(startDir)\n while (true) {\n const candidate = resolve(current, CONFIG_FILE)\n if (existsSync(candidate)) return candidate\n const parent = dirname(current)\n if (parent === current) return null\n current = parent\n }\n}\n\nexport async function loadConfig(startDir: string = process.cwd()): Promise<LoadedConfig> {\n const path = findConfigFile(startDir)\n if (!path) {\n throw new ConfigError(\n `Could not find ${CONFIG_FILE} in ${startDir} or any parent directory.`,\n { context: { startDir } },\n )\n }\n\n const jiti = createJiti(pathToFileURL(path).href, { interopDefault: true })\n let raw: unknown\n try {\n raw = await jiti.import(path, { default: true })\n } catch (err) {\n throw new ConfigError(`Failed to load ${path}: ${(err as Error).message}`, {\n cause: err,\n context: { path },\n })\n }\n\n try {\n const config = nymbalConfigSchema.parse(raw)\n return { config, path, projectRoot: dirname(path) }\n } catch (err) {\n if (err instanceof z.ZodError) {\n throw new ConfigError(formatZodError(err, path), {\n cause: err,\n context: { path, issues: err.issues },\n })\n }\n throw err\n }\n}\n\nfunction formatZodError(err: z.ZodError, path: string): string {\n const lines = err.issues.map((issue) => {\n const at = issue.path.length > 0 ? issue.path.join('.') : '<root>'\n return ` • ${at}: ${issue.message}`\n })\n return `Invalid configuration in ${path}:\\n${lines.join('\\n')}`\n}\n","import { z } from 'zod'\nimport { KNOWN_PROVIDERS, type CommerceSlot } from './known-providers.js'\n\nconst rateLimitRuleSchema = z.object({\n requests: z.number().int().positive(),\n window: z.string().regex(/^\\d+(ms|s|m|h)$/, 'window must look like \"60s\", \"5m\", \"1h\"'),\n action: z.enum(['block', 'challenge', 'throttle']),\n})\n\nconst rateLimitPathPattern = /^\\/[\\w\\-/*:]*$/\n\n/** The schema's JWT secret when none is configured: fine for development, refused in production. */\nexport const DEFAULT_JWT_SECRET = 'dev-secret-please-override-me-1234567890'\n\nexport const storeSchema = z.object({\n name: z.string().min(1),\n currency: z.string().length(3),\n locale: z.string().min(2),\n timezone: z.string().min(1),\n})\n\nexport const infrastructureSchema = z.object({\n cloud: z.enum(['local', 'aws', 'gcp', 'azure', 'docker']),\n commandStore: z.enum(['sqlite', 'postgres']),\n documentStore: z.enum(['in-memory', 'dynamodb', 'firestore', 'cosmosdb', 'postgres-jsonb']),\n eventBus: z.enum(['in-process', 'eventbridge', 'pubsub', 'service-bus', 'redis-streams']),\n compute: z.enum(['in-process', 'lambda', 'cloud-functions', 'azure-functions', 'worker-threads']),\n})\n\nexport const securitySchema = z.object({\n adapter: z.enum(['middleware', 'cloudflare', 'aws-waf', 'akamai']),\n rateLimit: z\n .record(\n z.string().regex(rateLimitPathPattern, {\n message: 'rate limit keys must start with \"/\" and use only letters, numbers, -, _, /, *, :',\n }),\n rateLimitRuleSchema,\n )\n .default({}),\n botProtection: z\n .object({\n mode: z.enum(['off', 'managed', 'strict']).default('off'),\n allowList: z.array(z.string()).default([]),\n })\n .default({ mode: 'off', allowList: [] }),\n headers: z\n .object({\n hsts: z.boolean().default(true),\n contentSecurityPolicy: z\n .union([z.enum(['strict', 'relaxed', 'off']), z.string()])\n .default('strict'),\n referrerPolicy: z.string().default('strict-origin-when-cross-origin'),\n xFrameOptions: z.enum(['deny', 'sameorigin']).default('deny'),\n })\n .default({}),\n csrf: z.boolean().default(true),\n auth: z\n .object({\n jwtSecret: z.string().min(16).default(DEFAULT_JWT_SECRET),\n accessTtl: z\n .string()\n .regex(/^\\d+(ms|s|m|h|d)$/, 'TTL must look like \"15m\"')\n .default('15m'),\n refreshTtl: z\n .string()\n .regex(/^\\d+(ms|s|m|h|d)$/, 'TTL must look like \"7d\"')\n .default('7d'),\n })\n .default({}),\n})\n\n/** A slot's block: its provider must be one the slot knows, and an unknown one is named with the slot's list. */\nfunction adapterBlock<const P extends readonly [string, ...string[]]>(\n slot: CommerceSlot,\n providers: P,\n) {\n const known = providers.map((p) => `'${p}'`).join(', ')\n return z.object({\n provider: z.enum(providers, {\n errorMap: (issue, ctx) =>\n issue.code === z.ZodIssueCode.invalid_enum_value\n ? {\n message: `unknown ${slot} provider '${String(issue.received)}'; the ${slot} providers are ${known}`,\n }\n : { message: ctx.defaultError },\n }),\n config: z.record(z.string(), z.unknown()).optional(),\n })\n}\n\nexport const commerceSchema = z.object({\n payments: adapterBlock('payments', KNOWN_PROVIDERS.payments),\n email: adapterBlock('email', KNOWN_PROVIDERS.email),\n reviews: adapterBlock('reviews', KNOWN_PROVIDERS.reviews),\n search: adapterBlock('search', KNOWN_PROVIDERS.search),\n analytics: adapterBlock('analytics', KNOWN_PROVIDERS.analytics),\n shipping: adapterBlock('shipping', KNOWN_PROVIDERS.shipping),\n tax: adapterBlock('tax', KNOWN_PROVIDERS.tax),\n ai: adapterBlock('ai', KNOWN_PROVIDERS.ai),\n orders: z\n .object({\n numberPrefix: z.string().min(1).default('NYM'),\n numberStart: z.number().int().nonnegative().default(1000),\n })\n .default({}),\n})\n\nexport const httpSchema = z.object({\n adapter: z.enum(['fastify', 'hono']).default('fastify'),\n port: z.number().int().positive().default(3001),\n host: z.string().default('0.0.0.0'),\n /** Whether `X-Forwarded-For` sets the client IP the rate limiter keys on; only behind a proxy you run. */\n trustProxy: z.boolean().default(false),\n cors: z\n .object({\n allowedOrigins: z\n .array(z.string())\n .default(['http://localhost:3000', 'http://localhost:4321']),\n credentials: z.boolean().default(true),\n })\n .default({}),\n})\n\nexport const deploymentSchema = z.object({\n strategy: z.enum(['standard', 'blue-green']).default('standard'),\n})\n\nexport const featuresSchema = z.object({\n staging: z.boolean().default(false),\n heartbeat: z.boolean().default(false),\n autoUpdates: z.boolean().default(false),\n})\n\nexport const nymbalConfigSchema = z\n .object({\n store: storeSchema,\n template: z.enum(['astro', 'nextjs']),\n infrastructure: infrastructureSchema,\n security: securitySchema,\n commerce: commerceSchema,\n http: httpSchema,\n deployment: deploymentSchema,\n features: featuresSchema.default({\n staging: false,\n heartbeat: false,\n autoUpdates: false,\n }),\n })\n .superRefine((cfg, ctx) => {\n // Local infrastructure restricts which document-store / event-bus options make sense.\n if (cfg.infrastructure.cloud === 'local') {\n if (!['in-memory', 'postgres-jsonb'].includes(cfg.infrastructure.documentStore)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['infrastructure', 'documentStore'],\n message: `cloud=local only supports 'in-memory' or 'postgres-jsonb' for documentStore`,\n })\n }\n if (!['in-process', 'redis-streams'].includes(cfg.infrastructure.eventBus)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['infrastructure', 'eventBus'],\n message: `cloud=local only supports 'in-process' or 'redis-streams' for eventBus`,\n })\n }\n if (!['in-process', 'worker-threads'].includes(cfg.infrastructure.compute)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['infrastructure', 'compute'],\n message: `cloud=local only supports 'in-process' or 'worker-threads' for compute`,\n })\n }\n }\n\n // SMTP left the kernel for @nymbalhq/adapter-smtp; a native block still asking for it would print to the console.\n const email = cfg.commerce.email\n if (email.provider === 'native' && email.config?.['transport'] === 'smtp') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['commerce', 'email', 'config', 'transport'],\n message: `the native email provider only prints to the console; for SMTP mail set email.provider to 'smtp' (@nymbalhq/adapter-smtp)`,\n })\n }\n\n // middleware security adapter is v0.1 and not intended for managed-cloud production deployments.\n if (cfg.security.adapter === 'middleware') {\n if (['aws', 'gcp', 'azure'].includes(cfg.infrastructure.cloud)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['security', 'adapter'],\n message: `security.adapter='middleware' is intended for local/docker development. Use a WAF adapter ('cloudflare', 'aws-waf', 'akamai') for cloud=${cfg.infrastructure.cloud}.`,\n })\n }\n }\n })\n\nexport type NymbalConfigInput = z.input<typeof nymbalConfigSchema>\nexport type NymbalConfig = z.output<typeof nymbalConfigSchema>\n"],"mappings":"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","names":["z","ConfigError","ConfigError","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nymbalhq/config",
3
- "version": "0.2.0",
3
+ "version": "1.0.0",
4
4
  "description": "Typed configuration surface for Nymbal",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -29,7 +29,7 @@
29
29
  "dependencies": {
30
30
  "jiti": "^2.4.0",
31
31
  "zod": "^3.23.8",
32
- "@nymbalhq/types": "0.2.0"
32
+ "@nymbalhq/types": "1.0.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "tsup": "^8.3.5",