**What**
Changes the order of object type evaluation to properly handle null properties.
Previously, `stringifyNullProperties({ test: null })` would fail in the 2nd iteration due to an attempt to iterate `null` in `Object.keys(obj)`.
**What**
- convert fulfillment service to typescript
I have removed the `transform` parameter from the getFulfillmentItems_ function since it was not being used with different methods, only `validateFulfillmentLineItem_`. Instead I have just reference the validateFulfillmentLineItem_ function directly.
We have the same pattern across some different methods, is there a specific reason or just for future proofing?
### What
At the moment it is not possible to pass explicitly null on a property since the qs.stringify will transform it as `url?property=` which is then interpreted on the backend side as `""` value which is not what we expect.
The actual way to pass null value is to set the property as `{ prop: "null" }` in order to get the stringify method to send it correctly.
### How
I just created a small util that loop through the input object and transform all null values to "null" before being passed to the qs.stringify method.
The new util is only applied on the list batch job since this is for now the only place that require that behaviour.
### What
At the moment, it is not possible to not invalidate any queries>
Example, when we want to Create a new signed url, it does not require to invalidate any of the queries.
But the way it is done in the buildOptions, require to give either a key or an array of keys.
### How
The behaviour for empty array is to invalidate all the queries and here we would like to be able to just pass undefined in order to not trigger the invalidation. The update allow the arg to be optional and check for undefined explicitly before choosing the invalidation
* centralize common knowledge and checks for list-customers in repository
* convert customer service to typescript
* fix typing error in update-address
* add await
* add atomic phases
* update types for customerservice
* update api and model types
* pr feedback
* remove Promise.resolve
* typing of buildQuery
* remove atomic phase from private method
* add batch job strategy interface
* update plugin loaders
* remove comment
* make map async
* ensure that only one of each strategy is registered
* register strategies plural
* add identifier and batchType properties
* extend batch job strategy identification method
* initial test
* update loaders to accomodate different ways of accessing batch job strategies
* identifier batch type field
* redo merge in plugins
* update interface and load only js files
* use switches instead of elif
* remove comments
* use static properties for strategy registration
* update tests
* fix unit tests
* update test names
* update isBatchJobStrategy method
* add check for TransactionBaseService in services for plugins
* update interfaces export
* update batchjob strategy interface with a prepare script
* update loaders
* update batchjob strategy interface
* remove everything but public interface methods from batchJobStrategy
* add default implementation to prepareBathJobForProcessing
* remove unused import
* feat(medusa): Support transformQuery middleware
* feat(medusa): Add support for transformBody
* test(medusa): Fix unit tests
* feat(medusa): Cleanup import
* feat(medusa): Update pipe required fields
* feat(medusa): Cleanup
* feat(medusa): Types cleanup
* feat(medusa): Types cleanup
* feat(medusa): Improve global typings and add one more example
* fix(medusa): Wrong wording in the error for prepareListQuery utility
* fix: return prices when lsiting products with a query
* add: integration test
* fix: integration test
* fix: move WithRequiredProperty to common.ts
* fix: comment
* add file service interface initial
* pr feedback
* use abstract fileservice for file service plugins
* update plugin loader for services
* implement fileservices with abstractFileService and convert to ts
* update fileservice interface
* remove fileservice loading of old interface
* re-add loading of old fileservice interface
* re-rename digital ocean fileservice to javascript
* revert s3 to js
* revert minio to js
* remove irrelevant method implementation
* rename download stream method to reflect upload stream method
* update fileservice
* use isFileService in loaders
* remove fields from js class
* rename "generatePresignedDownloadUrl" to "getPresignedDownloadUrl"
* make methods abstract in AbstractFileService
* create download stream endpoint (#1583)
* Feat/upload to storage (#1580)
* add test generate endpoint to api
* rename method to getUploadStream
* cleanup generate example
* upload file example
* remove comment
* make vars const
* Feat/create presigned download url (#1582)
* implement "generatePresignedDownloadUrl"
* add get-download-url endpoint for testing
* remove examples
* update index ts
* create generalized method for aws update in DO fileservice
* update bucket configuration
* update interface types
* add typings to fileservice methods
* update service loaders
* update fileservice interface to extend transaction base service
* create download stream endpoint (#1583)
* Feat/upload to storage (#1580)
* add test generate endpoint to api
* rename method to getUploadStream
* cleanup generate example
* upload file example
* remove comment
* make vars const
* Feat/create presigned download url (#1582)
* implement "generatePresignedDownloadUrl"
* add get-download-url endpoint for testing
* remove examples
* update index ts
* create generalized method for aws update in DO fileservice
* update bucket configuration
* update interface types
* update download method name
* revert changes
* add filekey and optional extension to the fileservice result
* add key to the result of getUploadStream
* rename key to filekey
* rename key to filekey in getUploadStream result
* rename key to filekey in getDownloadStream and getPresignedDownloadUrl
* rename key to fileKey for getUploadedFileType
Co-authored-by: olivermrbl <oliver@mrbltech.com>