jaypie 0.1.10 → 1.0.1

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/README.md CHANGED
@@ -44,24 +44,692 @@ Jaypie strives to be "mockable-first" meaning all components should be easily te
44
44
 
45
45
  ### Installation
46
46
 
47
+ #### Base Package
48
+
47
49
  ```bash
48
50
  npm install jaypie
49
51
  ```
50
52
 
51
- TODO: need to document peer dependencies
53
+ `@jaypie/core` is included in `jaypie`. Almost every Jaypie package requires core.
54
+
55
+ #### Peer Dependencies
56
+
57
+ You must install peer dependencies for your project.
58
+
59
+ | Package | Exports | Description |
60
+ | ------- | ------- | ----------- |
61
+ | `@jaypie/aws` | `getSecret` | AWS helpers |
62
+ | `@jaypie/lambda` | `lambdaHandler` | Lambda entry point |
63
+ | `@jaypie/mongoose` | `connectFromSecretEnv`, `disconnect`, `mongoose` | MongoDB management |
64
+
65
+ #### TestKit
66
+
67
+ Matchers, mocks, and utilities to test Jaypie projects.
68
+
69
+ ```bash
70
+ npm install --save-dev @jaypie/testkit
71
+ ```
52
72
 
53
73
  ### Example
54
74
 
55
- TODO: Example should include one trivial and possibly one thorough example of using the library
75
+ ```bash
76
+ npm install jaypie @jaypie/lambda
77
+ ```
78
+
79
+ ```javascript
80
+ const { InternalError, lambdaHandler, log } = require("jaypie");
81
+
82
+ export const handler = lambdaHandler(async({event}) => {
83
+ // await new Promise(r => setTimeout(r, 2000));
84
+ if (event.something === "problem") {
85
+ throw new InternalError();
86
+ }
87
+ // log.debug("Hello World");
88
+ return "Hello World";
89
+ }, { name: "example"});
90
+ ```
91
+
92
+ This example would then be deployed to AWS via CDK or similar orchestration.
93
+
94
+ _A `@jaypie/cdk` package is intended_
56
95
 
57
96
  ## 📖 Reference
58
97
 
59
- TODO: Reference should be a complete list of everything in the package
98
+ ### AWS
99
+
100
+ ```javascript
101
+ import { getSecret } from '@jaypie/aws';
102
+
103
+ const secret = await getSecret("MongoConnectionStringN0NC3-nSg1bR1sh");
104
+ // secret = "mongodb+srv://username:password@env-project.n0nc3.mongodb.net/app?retryWrites=true&w=majority";
105
+ ```
106
+
107
+ ### Constants
108
+
109
+ ```javascript
110
+ import {
111
+ CDK,
112
+ ERROR,
113
+ HTTP,
114
+ LOG,
115
+ VALIDATE,
116
+ } from "jaypie";
117
+ ```
118
+
119
+ #### `CDK`
120
+
121
+ * `CDK.ACCOUNT`
122
+ * `CDK.ENV`
123
+ * `CDK.ROLE`
124
+ * `CDK.SERVICE`
125
+ * `CDK.TAG`
126
+
127
+ See [constants.js in @jaypie/core](https://github.com/finlaysonstudio/jaypie-core/blob/main/src/core/constants.js).
128
+
129
+ #### `ERROR`
130
+
131
+ Default messages and titles for Jaypie errors.
132
+
133
+ * `ERROR.MESSAGE`
134
+ * `ERROR.TITLE`
135
+
136
+ See `HTTP` for status codes.
137
+
138
+ #### `HTTP`
139
+
140
+ * `HTTP.ALLOW.ANY`
141
+ * `HTTP.CODE`: `OK`, `CREATED`, ...
142
+ * `HTTP.CONTENT.ANY`
143
+ * `HTTP.CONTENT.HTML`
144
+ * `HTTP.CONTENT.JSON`
145
+ * `HTTP.CONTENT.TEXT`
146
+ * `HTTP.HEADER`: ...
147
+ * `HTTP.METHOD`: `GET`, `POST`, ...
148
+
149
+ #### `LOG`
150
+
151
+ * `LOG.FORMAT`
152
+ * `LOG.LEVEL`
153
+
154
+ #### `VALIDATE`
155
+
156
+ * `VALIDATE.ANY` - Default
157
+ * `VALIDATE.ARRAY`
158
+ * `VALIDATE.CLASS`
159
+ * `VALIDATE.FUNCTION`
160
+ * `VALIDATE.NUMBER`
161
+ * `VALIDATE.NULL`
162
+ * `VALIDATE.OBJECT`
163
+ * `VALIDATE.STRING`
164
+ * `VALIDATE.UNDEFINED`
165
+
166
+ #### Internal Constants
167
+
168
+ * `JAYPIE` - for consistency across Jaypie
169
+ * `PROJECT` - for consistency across projects
170
+
171
+ ### Errors
172
+
173
+ #### Throwing/Catching Errors
174
+
175
+ ``` javascript
176
+ // See `Error Reference` for full list
177
+ const { InternalError } = require("@knowdev/errors");
178
+
179
+ try {
180
+ // Code happens...
181
+ throw InternalError("Oh, I am slain!");
182
+ } catch (error) {
183
+ // Is this from a jaypie project?
184
+ if(error.isProjectError) {
185
+ {
186
+ name, // ProjectError
187
+ title, // "Internal Server Error"
188
+ detail, // "Oh, I am slain"
189
+ status, // 500 (HTTP code)
190
+ } = error;
191
+ } else {
192
+ // Not from jaypie
193
+ throw error;
194
+ }
195
+ }
196
+ ```
197
+
198
+ #### Format Error
199
+
200
+ ``` javascript
201
+ if(error.isProjectError) {
202
+ return error.json();
203
+ }
204
+ ```
205
+
206
+ #### Multi-Error Usage
207
+
208
+ ``` javascript
209
+ const errors = [];
210
+ errors.push(BadGatewayError());
211
+ errors.push(NotFoundError());
212
+ throw MultiError(errors);
213
+ ```
214
+
215
+ #### Error Reference
216
+
217
+ | Error | Status | Notes |
218
+ | ----------------------- | ------ | ----- |
219
+ | `BadGatewayError` | 502 | Something I need gave me an error |
220
+ | `BadRequestError` | 400 | You did something wrong |
221
+ | `ConfigurationError` | 500 | "The developer" (probably you) or an associate did something wrong |
222
+ | `ForbiddenError` | 403 | You are not allowed |
223
+ | `GatewayTimeoutError` | 504 | Something I need is taking too long |
224
+ | `GoneError` | 410 | The thing you are looking for was here but is now gone forever |
225
+ | `IllogicalError` | 500 | Code is in a state that "should never happen" |
226
+ | `InternalError` | 500 | General "something went wrong" |
227
+ | `MethodNotAllowedError` | 405 | You tried a good path but the wrong method |
228
+ | `MultiError` | Varies | Takes an array of errors |
229
+ | `NotFoundError` | 404 | The thing you are looking for is not here and maybe never was |
230
+ | `NotImplementedError` | 400 | "The developer" (you again?) didn't finish this part yet - hopefully a temporary message |
231
+ | `RejectedError` | 403 | Request filtered prior to processing |
232
+ | `TeapotError` | 418 | RFC 2324 section-2.3.2 |
233
+ | `UnavailableError` | 503 | The thing you are looking for cannot come to the phone right now |
234
+ | `UnhandledError` | 500 | An error that should have been handled wasn't |
235
+ | `UnreachableCodeError` | 500 | Should not be possible |
236
+
237
+ ##### Special Errors
238
+
239
+ ALWAYS internal to the app, NEVER something the client did
240
+
241
+ * Configuration
242
+ * "The person writing the code did something wrong" like forgot to pass or passed bad arguments
243
+ * "The person who configured the application made a mistake" like set mutually exclusive settings to true
244
+ * Illogical
245
+ * A combination of truth conditions occurred that should not be able to occur at the same time
246
+ * Not Implemented
247
+ * A marker to come back and finish this, but allows stubbing out HTTP endpoints
248
+ * Unhandled
249
+ * Internal to Jaypie, should not be thrown directly
250
+ * Jaypie expects code in handlers to handler errors and re-throw a Jaypie error
251
+ * If an unexpected error escapes the handler, Jaypie returns this when it is caught
252
+ * Unreachable
253
+ * In theory the block is literally not reachable and we want to put something there to make sure it stays that way
254
+ * For example, a complicated chain of `if`/`else` that should always return and cover all cases, may throw this as the last `else`
255
+ * A configuration error means what happened was possible but should not have happened, an unreachable error means it should not have been possible
256
+
257
+ ### Functions
258
+
259
+ #### `cloneDeep`
260
+
261
+ `lodash.clonedeep` from [NPM](https://www.npmjs.com/package/lodash.clonedeep)
262
+
263
+ ```javascript
264
+ import { cloneDeep } from "jaypie";
265
+
266
+ const original = { a: 1, b: { c: 2 }};
267
+ const clone = cloneDeep(original);
268
+ ```
269
+
270
+ #### `envBoolean`
271
+
272
+ Look up a key in `process.env` and coerce it into a boolean.
273
+ Returns `true` for `true` (case-insensitive) and `1` for string, boolean, and numeric types.
274
+ Returns `false` for `false` (case-insensitive) and `0` for string, boolean, and numeric types.
275
+ Returns `undefined` otherwise.
276
+
277
+ ``` javascript
278
+ const { envBoolean } = require("@knowdev/functions");
279
+
280
+ process.env.AWESOME = true;
281
+
282
+ if (envBoolean("AWESOME")) {
283
+ console.log("Awesome!");
284
+ }
285
+ ```
286
+
287
+ ##### `envBoolean`: `defaultValue`
288
+
289
+ ``` javascript
290
+ const { envBoolean } = require("@knowdev/functions");
291
+
292
+ if (envBoolean("AWESOME", { defaultValue: true })) {
293
+ console.log("Awesome!");
294
+ }
295
+ ```
296
+
297
+ #### `force`
298
+
299
+ Coerce a value into a type or throw an error.
300
+ Forcing arrays is the primary use case.
301
+
302
+ ```javascript
303
+ import { force } from "jaypie";
304
+
305
+ argument = force(thing, Array);
306
+ argument = force([thing], Array);
307
+ // argument = [thing]
308
+ ```
309
+
310
+ `force` supports Array, Object, and String.
311
+
312
+ ```javascript
313
+ argument = force(argument, Array);
314
+ argument = force(argument, Object, "key");
315
+ argument = force(argument, String, "default");
316
+
317
+ // Convenience functions
318
+ argument = force.array(argument);
319
+ argument = force.object(argument, "key");
320
+ argument = force.string(argument);
321
+ ```
322
+
323
+ #### `getHeaderFrom`
324
+
325
+ `getHeaderFrom(headerKey:string, searchObject:object)`
326
+
327
+ Case-insensitive search inside `searchObject` for `headerKey`. Also looks in `header` and `headers` child object of `searchObject`, if `headerKey` not found at top-level.
328
+
329
+ #### `placeholders`
330
+
331
+ Lightweight string interpolation
332
+
333
+ ```javascript
334
+ import { placeholders } from "jaypie";
335
+
336
+ const string = placeholders("Hello, {name}!", { name: "World" });
337
+ // string = "Hello, World!"
338
+ ```
339
+
340
+ The code for placeholders was written by Chris Ferdinandi and distributed under the MIT License in 2018-2019. Their web site is https://gomakethings.com
341
+
342
+ #### `validate`
343
+
344
+ ```javascript
345
+ import { validate, VALIDATE } from "jaypie";
346
+
347
+ validate(argument, {
348
+ type: VALIDATE.ANY,
349
+ falsy: false, // When `true`, allows "falsy" values that match the type (e.g., `0`, `""`)
350
+ required: true, // When `false`, allows `undefined` as a valid value
351
+ throws: true // When `false`, returns `false` instead of throwing error
352
+ });
353
+ ```
354
+
355
+ ##### Validate Convenience Functions
356
+
357
+ ``` javascript
358
+ import { validate } from "jaypie";
359
+
360
+ validate.array(argument);
361
+ validate.class(argument);
362
+ validate.function(argument);
363
+ validate.null(argument);
364
+ validate.number(argument);
365
+ validate.object(argument);
366
+ validate.string(argument);
367
+ validate.undefined(argument);
368
+ ```
369
+
370
+ ##### Intuitive Validate Types
371
+
372
+ _Does not include any, class, or undefined_
373
+
374
+ ``` javascript
375
+ validate(argument, {
376
+ // One of:
377
+ type: Array,
378
+ type: Function,
379
+ type: Number,
380
+ type: null,
381
+ type: Object,
382
+ type: String,
383
+ })
384
+ ```
385
+
386
+ ### Jaypie Handler
387
+
388
+ The Jaypie handler can be used directly but is more likely to be wrapped in a more specific handler. The Jaypie handler will call lifecycle methods and provide logging. Unhandled errors will be thrown as `UnhandledError`.
389
+
390
+ ```javascript
391
+ import { jaypieHandler } from "jaypie";
392
+
393
+ const handler = jaypieHandler(async(...args) => {
394
+ // await new Promise(r => setTimeout(r, 2000));
395
+ // log.var({ args });
396
+ return "Hello World";
397
+ }, { name: "jaypieReference"});
398
+ ```
399
+
400
+ #### Jaypie Lifecycle Methods
401
+
402
+ Each function receives the same arguments as the handler.
403
+
404
+ ##### `validate: [async Function]`
405
+
406
+ Returns `true` to validate the request. Throw an error or return `false` to reject the request.
407
+
408
+ ##### `setup: [async Function]`
409
+
410
+ Called before the handler (e.g., connect to a database). Throw an error to halt execution.
411
+
412
+ ##### `handler: async Function`
413
+
414
+ The main function to handle the request. Throw an error to halt execution.
415
+
416
+ ##### `teardown: [async Function]`
417
+
418
+ Called after the handler (e.g., disconnect from a database). Runs even if setup or handler throws errors.
419
+
420
+ ### Lambda Handler
421
+
422
+ The Lambda handler wraps the Jaypie handler that is specifically for AWS Lambda. It will call lifecycle methods and provide logging. Unhandled errors will be thrown as `UnhandledError`.
423
+
424
+ ```javascript
425
+ const { lambdaHandler } = require("jaypie");
426
+
427
+ const handler = lambdaHandler(async({event}) => {
428
+ // await new Promise(r => setTimeout(r, 2000));
429
+ // log.debug("Hello World");
430
+ return "Hello World";
431
+ }, { name: "lambdaReference"});
432
+ ```
433
+
434
+ ### Logging
435
+
436
+ ```javascript
437
+ import {
438
+ log,
439
+ LOG, // LOG.FORMAT, LOG.LEVEL
440
+ } from "jaypie";
441
+ ```
442
+
443
+ #### log
444
+
445
+ ```javascript
446
+ import { log } from "jaypie";
447
+
448
+ log.trace();
449
+ log.debug();
450
+ log.info();
451
+ log.warn();
452
+ log.error();
453
+ log.fatal();
454
+ ```
455
+
456
+ ##### log.lib({ lib: "myLib" })
457
+
458
+ Uses `silent` by default. if `process.env.MODULE_LOG_LEVEL` is `true`, follows `process.env.LOG_LEVEL`. If `process.env.MODULE_LOG_LEVEL` is also set, uses that log level.
459
+
460
+ ```javascript
461
+ import { log } from "jaypie";
462
+
463
+ log.lib().trace();
464
+ log.lib({ lib: "myLib" }).trace();
465
+ ```
466
+
467
+ ##### log.var(key, value) or log.var({ key: value })
468
+
469
+ Log a key-value pair. In the `json` format, the key will be tagged as `var` and the value will be the value. Logging marker variables this way can be useful for debugging.
470
+
471
+ ```javascript
472
+ import { log } from "jaypie";
473
+
474
+ log.var("message", "Hello, world");
475
+ log.var({ message: "Hello, world" });
476
+
477
+ const message = "Hello, world";
478
+ log.var({ message });
479
+ ```
480
+
481
+ ##### log.with() - clone
482
+
483
+ Create a new log object with additional tags
484
+
485
+ ```javascript
486
+ import { log as defaultLogger } from "jaypie";
487
+
488
+ const log = defaultLogger.with({ customProperty: "customValue" });
489
+ ```
490
+
491
+ ### Mongoose
492
+
493
+ ```javascript
494
+ import {
495
+ connectFromSecretEnv,
496
+ disconnect,
497
+ mongoose,
498
+ } from "jaypie";
499
+ ```
500
+
501
+ #### `connectFromSecretEnv`
502
+
503
+ Jaypie lifecycle method to connect to MongoDB using `process.env.MONGO_CONNECTION_STRING`.
504
+
505
+ ```javascript
506
+ import { connectFromSecretEnv, disconnect, lambdaHandler, mongoose } from "jaypie";
507
+
508
+ const handler = lambdaHandler(async({event}) => {
509
+ // mongoose is already connected
510
+ return "Hello World";
511
+ }, {
512
+ name: "lambdaReference"
513
+ setup: [connectFromSecretEnv],
514
+ teardown: [disconnect],
515
+ });
516
+ ```
517
+
518
+ #### `disconnect`
519
+
520
+ Jaypie lifecycle method to disconnect from MongoDB.
521
+
522
+ ```javascript
523
+ import { disconnect, lambdaHandler } from "jaypie";
524
+
525
+ const handler = lambdaHandler(async({event}) => {
526
+ // ...
527
+ }, {
528
+ teardown: [disconnect],
529
+ });
530
+ ```
531
+
532
+ #### `mongoose`
533
+
534
+ `mongoose` from [NPM](https://www.npmjs.com/package/mongoose)
535
+
536
+ ```javascript
537
+ import { mongoose } from "jaypie";
538
+ ```
539
+
540
+ ### TestKit
541
+
542
+ ```bash
543
+ npm install --save-dev @jaypie/testkit
544
+ ```
545
+
546
+ #### Log Spying
547
+
548
+ ```javascript
549
+ import { restoreLog, spyLog } from "@jaypie/testkit";
550
+ import { log } from "@jaypie/core";
551
+
552
+ beforeEach(() => {
553
+ spyLog(log);
554
+ });
555
+ afterEach(() => {
556
+ restoreLog(log);
557
+ vi.clearAllMocks();
558
+ });
559
+
560
+ test("log", () => {
561
+ log.warn("Danger");
562
+ expect(log.warn).toHaveBeenCalled();
563
+ expect(log.error).not.toHaveBeenCalled();
564
+ });
565
+ ```
566
+
567
+ 👺 Logging Conventions:
568
+
569
+ * Only use `log.trace` or `log.var` during "happy path"
570
+ * Use `log.debug` for edge cases
571
+ * Now you can add an "observability" test that will fail as soon as new code triggers an unexpected edge condition
572
+
573
+ ```javascript
574
+ describe("Observability", () => {
575
+ it("Does not log above trace", async () => {
576
+ // Arrange
577
+ // TODO: "happy path" setup
578
+ // Act
579
+ await myNewFunction(); // TODO: add any "happy path" parameters
580
+ // Assert
581
+ expect(log.debug).not.toHaveBeenCalled();
582
+ expect(log.info).not.toHaveBeenCalled();
583
+ expect(log.warn).not.toHaveBeenCalled();
584
+ expect(log.error).not.toHaveBeenCalled();
585
+ expect(log.fatal).not.toHaveBeenCalled();
586
+ });
587
+ });
588
+ ```
589
+
590
+ > 👺 Follow the "arrange, act, assert" pattern
591
+
592
+ #### Test Matchers
593
+
594
+ testSetup.js
595
+
596
+ ```javascript
597
+ import { matchers as jaypieMatchers } from "@jaypie/testkit";
598
+ import * as extendedMatchers from "jest-extended";
599
+ import { expect } from "vitest";
600
+
601
+ expect.extend(extendedMatchers);
602
+ expect.extend(jaypieMatchers);
603
+ ```
604
+
605
+ test.spec.js
606
+
607
+ ```javascript
608
+ import { ConfigurationError } from "@jaypie/core";
609
+
610
+ const error = new ConfigurationError();
611
+ const json = error.json();
612
+ expect(error).toBeJaypieError();
613
+ expect(json).toBeJaypieError();
614
+ ```
615
+
616
+ ###### `expect(subject).toBeJaypieError()`
617
+
618
+ Validates instance objects:
619
+
620
+ ```javascript
621
+ try {
622
+ throw new Error("Sorpresa!");
623
+ } catch (error) {
624
+ expect(error).not.toBeJaypieError();
625
+ }
626
+ ```
627
+
628
+ Validates plain old JSON:
629
+
630
+ ```javascript
631
+ expect({ errors: [ { status, title, detail } ] }).toBeJaypieError();
632
+ ```
633
+
634
+ Jaypie errors, which are `ProjectErrors`, all have a `.json()` to convert
635
+
636
+ ###### `expect(subject).toBeValidSchema()`
637
+
638
+ ```javascript
639
+ import { jsonApiErrorSchema, jsonApiSchema } from "@jaypie/testkit";
640
+
641
+ expect(jsonApiErrorSchema).toBeValidSchema();
642
+ expect(jsonApiSchema).toBeValidSchema();
643
+ expect({ project: "mayhem" }).not.toBeValidSchema();
644
+ ```
645
+
646
+ From `jest-json-schema` [toBeValidSchema.js](https://github.com/americanexpress/jest-json-schema/blob/main/matchers/toBeValidSchema.js) (not documented in README)
647
+
648
+ ###### `expect(subject).toMatchSchema(schema)`
649
+
650
+ ```javascript
651
+ import { jsonApiErrorSchema, jsonApiSchema } from "@jaypie/testkit";
652
+ import { ConfigurationError } from "@jaypie/core";
653
+
654
+ const error = new ConfigurationError();
655
+ const json = error.json();
656
+ expect(json).toMatchSchema(jsonApiErrorSchema);
657
+ expect(json).not.toMatchSchema(jsonApiSchema);
658
+ ```
659
+
660
+ From `jest-json-schema`; see [README](https://github.com/americanexpress/jest-json-schema?tab=readme-ov-file#tomatchschemaschema)
661
+
662
+ #### TestKit Sundry
663
+
664
+ ```
665
+ import {
666
+ jsonApiErrorSchema,
667
+ jsonApiSchema,
668
+ mockLogFactory,
669
+ } from '@jaypie/testkit'
670
+ ```
671
+
672
+ ##### `jsonApiErrorSchema`
673
+
674
+ A [JSON Schema](https://json-schema.org/) validator for the [JSON:API](https://jsonapi.org/) error schema. Powers the `toBeJaypieError` matcher (via `toMatchSchema`).
675
+
676
+ ##### `jsonApiSchema`
677
+
678
+ A [JSON Schema](https://json-schema.org/) validator for the [JSON:API](https://jsonapi.org/) data schema.
679
+
680
+
681
+ ##### `mockLogFactory()`
682
+
683
+ Creates a mock of the `log` provided by `@jaypie/core`.
684
+
685
+ ```javascript
686
+ import { mockLogFactory } from "@jaypie/testkit";
687
+
688
+ const log = mockLogFactory();
689
+ log.warn("Danger");
690
+ expect(log.warn).toHaveBeenCalled();
691
+ expect(log.error).not.toHaveBeenCalled();
692
+ ```
693
+
694
+ ### `restoreLog(log)`
695
+
696
+ Restores the `log` provided by `@jaypie/core`, commonly performed `afterEach` with `spyLog` in `beforeEach`. See example with `spyLog`.
697
+
698
+ ### `spyLog(log)`
699
+
700
+ Spies on the `log` provided by `@jaypie/core`, commonly performed `beforeEach` with `restoreLog` in `afterEach`.
701
+
702
+ ```javascript
703
+ import { restoreLog, spyLog } from "@jaypie/testkit";
704
+ import { log } from "@jaypie/core";
705
+
706
+ beforeEach(() => {
707
+ spyLog(log);
708
+ });
709
+ afterEach(() => {
710
+ restoreLog(log);
711
+ vi.clearAllMocks();
712
+ });
713
+
714
+ test("log", () => {
715
+ log.warn("Danger");
716
+ expect(log.warn).toHaveBeenCalled();
717
+ expect(log.error).not.toHaveBeenCalled();
718
+ });
719
+ ```
720
+
721
+ ## 🌠 Wishlist
722
+
723
+ * `@jaypie/cdk` - CDK package
724
+ * `@jaypie/express` - Express package
725
+ * ...Nicely organized VitePress documentation 😅
60
726
 
61
727
  ## 📝 Changelog
62
728
 
63
729
  | Date | Version | Summary |
64
730
  | ---------- | ------- | -------------- |
731
+ | 3/19/2024 | 1.0.0 | First publish with `@jaypie/core@1.0.0` |
732
+ | 3/15/2024 | 0.1.0 | Initial deploy |
65
733
  | 3/15/2024 | 0.0.1 | Initial commit |
66
734
 
67
735
  ## 📜 License
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jaypie",
3
- "version": "0.1.10",
3
+ "version": "1.0.1",
4
4
  "author": "Finlayson Studio",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -17,7 +17,7 @@
17
17
  "test:spec:mongoose.package": "vitest run ./src/__tests__/mongoose.package.spec.js"
18
18
  },
19
19
  "dependencies": {
20
- "@jaypie/core": "^0.5.8"
20
+ "@jaypie/core": "^1.0.0"
21
21
  },
22
22
  "devDependencies": {
23
23
  "@jaypie/testkit": "^1.0.1",
@@ -33,9 +33,9 @@
33
33
  "vitest": "^1.4.0"
34
34
  },
35
35
  "peerDependencies": {
36
- "@jaypie/aws": "^0.1.3",
37
- "@jaypie/lambda": "^0.1.9",
38
- "@jaypie/mongoose": "^0.1.3"
36
+ "@jaypie/aws": "^1.0.0",
37
+ "@jaypie/lambda": "^1.0.0",
38
+ "@jaypie/mongoose": "^1.0.0"
39
39
  },
40
40
  "peerDependenciesMeta": {
41
41
  "@jaypie/aws": {