c56660fca9
* feat: add tax calculation strategy (#885) * feat: add tax calculation strategy * fix: adds strategy loader * fix: eslint ignore * chore: cleanup * fix: allow plugin overwrites * fix: allow plugin overwrites * fix: fake region * Update packages/medusa/src/loaders/strategies.ts Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com> Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com> * feat: adds tax related db entities + tax provider (#896) * feat: adds tax related db entities + tax provider * fix: add tax provider tests * fix: add tax service unit tests * fix: tests + migrations * fix: add inherited tax lines * chore: rm tax-line repo * fix: test * fix: pr comments * fix: unit test * feat: totals service to ts (#911) * feat: adds tax related db entities + tax provider * fix: add tax provider tests * fix: add tax service unit tests * fix: tests + migrations * feat: totals service to ts * fix: remove totals.js * fix: add shipping methods * fix: add inherited tax lines * chore: rm tax-line repo * fix: test * fix: tests * fix: tests * fix: unit test * fix: adds TotalsServiceProps * feat: adds integration tests for automatic tax calculation + shipping tax rates (#945) * feat: adds tax related db entities + tax provider * fix: add tax provider tests * fix: add tax service unit tests * fix: tests + migrations * feat: totals service to ts * fix: remove totals.js * fix: add shipping methods * fix: add inherited tax lines * chore: rm tax-line repo * fix: test * fix: tests * fix: tests * fix: unit test * fix: integration test helpers * fix: adds factories + tests automatic tax rates * fix: remove verbose * fix: adds TotalsServiceProps * fix: add shipping tax lines * fix: add migration for shipping taxes * fix: integration tests for shipping taxes * fix: integration tests for shipping taxes * fix: jsdoc types * Feat/manual taxes (#950) * feat: adds tax related db entities + tax provider * fix: add tax provider tests * fix: add tax service unit tests * fix: tests + migrations * feat: totals service to ts * fix: remove totals.js * fix: add shipping methods * fix: add inherited tax lines * chore: rm tax-line repo * fix: test * fix: tests * fix: tests * fix: unit test * fix: integration test helpers * fix: adds factories + tests automatic tax rates * fix: remove verbose * fix: adds TotalsServiceProps * fix: add shipping tax lines * fix: add migration for shipping taxes * fix: integration tests for shipping taxes * fix: integration tests for shipping taxes * fix: add integration tests for manual taxes * fix: cart service - cleanup jsdoc * feat: add /carts/id/taxes to manually calculate taxes * feat: add integration tests for order tax calculations * fix: unit tests * fix: merge * fix: rm verbose * fix: unit tests * fix: object -> cartOrOrder * fix: rounding * Feat/complete order w tax lines (#951) * feat: adds tax related db entities + tax provider * fix: add tax provider tests * fix: add tax service unit tests * fix: tests + migrations * feat: totals service to ts * fix: remove totals.js * fix: add shipping methods * fix: add inherited tax lines * chore: rm tax-line repo * fix: test * fix: tests * fix: tests * fix: unit test * fix: integration test helpers * fix: adds factories + tests automatic tax rates * fix: remove verbose * fix: adds TotalsServiceProps * fix: add shipping tax lines * fix: add migration for shipping taxes * fix: integration tests for shipping taxes * fix: integration tests for shipping taxes * fix: add integration tests for manual taxes * fix: cart service - cleanup jsdoc * feat: add /carts/id/taxes to manually calculate taxes * feat: add integration tests for order tax calculations * feat: adds cart completion strategy + create order w. tax lines * fix: unit tests * fix: merge * fix: rm verbose * fix: unit tests * fix: unit tests * fix: unit tests * fix: ensure calculation for list orders * fix: unit tests * fix: integration tests * fix: adds cart order type gaurds * Docs/tax api (#954) * feat: adds tax related db entities + tax provider * fix: add tax provider tests * fix: add tax service unit tests * fix: tests + migrations * feat: totals service to ts * fix: remove totals.js * fix: add shipping methods * fix: add inherited tax lines * chore: rm tax-line repo * fix: test * fix: tests * fix: tests * fix: unit test * fix: integration test helpers * fix: adds factories + tests automatic tax rates * fix: remove verbose * fix: adds TotalsServiceProps * fix: add shipping tax lines * fix: add migration for shipping taxes * fix: integration tests for shipping taxes * fix: integration tests for shipping taxes * fix: add integration tests for manual taxes * fix: cart service - cleanup jsdoc * feat: add /carts/id/taxes to manually calculate taxes * feat: add integration tests for order tax calculations * feat: adds cart completion strategy + create order w. tax lines * fix: unit tests * fix: merge * fix: rm verbose * fix: unit tests * fix: unit tests * fix: unit tests * fix: ensure calculation for list orders * fix: unit tests * fix: integration tests * docs: documents tax related methods and types * fix: require either item_id or shipping_method_id * feat: product type tax rate (#969) * feat: adds tax related db entities + tax provider * fix: add tax provider tests * fix: add tax service unit tests * fix: tests + migrations * feat: totals service to ts * fix: remove totals.js * fix: add shipping methods * fix: add inherited tax lines * chore: rm tax-line repo * fix: test * fix: tests * fix: tests * fix: unit test * fix: integration test helpers * fix: adds factories + tests automatic tax rates * fix: remove verbose * fix: adds TotalsServiceProps * fix: add shipping tax lines * fix: add migration for shipping taxes * fix: integration tests for shipping taxes * fix: integration tests for shipping taxes * fix: add integration tests for manual taxes * fix: cart service - cleanup jsdoc * feat: add /carts/id/taxes to manually calculate taxes * feat: add integration tests for order tax calculations * feat: adds cart completion strategy + create order w. tax lines * fix: unit tests * fix: merge * fix: rm verbose * fix: unit tests * fix: unit tests * fix: unit tests * fix: ensure calculation for list orders * fix: unit tests * fix: integration tests * docs: documents tax related methods and types * fix: require either item_id or shipping_method_id * feat: adds returns tests for new tax system * feat: adds return lines + integration tests for swaps * feat: return integration tests * feat: adds product type tax rates * feat: add tax management endpoints * fix: create single migration * fix: adds tax rates to js client * fix: strats * Fix/plugin tests (#998) * plugin testing setup * fix: test sendgrid plugin * fix: test sendgrid plugin * chore: clean * chore: clean * fix: clean up tests * fix: remove dirty import * fix: sendgrid + brightpearl * fix: plugin integration tests * fix: klarna * fix: shipping method tax * fix: remove taxrates * fix: unit tests * fix: integration * fix: integration * fix: plugins tests * fix: ignore plugins * fix: tests * fix: taxes (#1017) * fix: taxes * fix: taxes * fix: faulty ref * fix: create tax-lines with claim items * fix: snapshot tax-liens * fix: allows integration test teardown to force deleting tables * fix: tests * fix: merge * fix: adds tax-rates to client * fix: adds tax-rates to medusa-react * fix: tests * fix: tests * fix: add product types * fix: adds tax provider endpoint + cascaded deletes on tax rate relations * fix: move errors to service layer * fix: cleanup api * fix: unit tests * fix: error handler in base-service * fix: Add order region to swap on createFulfillment (#1110) Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
308 lines
7.6 KiB
JavaScript
308 lines
7.6 KiB
JavaScript
import stackTrace from "stack-trace"
|
||
import { ulid } from "ulid"
|
||
import winston from "winston"
|
||
import ora from "ora"
|
||
import { track } from "medusa-telemetry"
|
||
|
||
import { panicHandler } from "./panic-handler"
|
||
|
||
const LOG_LEVEL = process.env.LOG_LEVEL || "silly"
|
||
const NODE_ENV = process.env.NODE_ENV || "development"
|
||
const IS_DEV = NODE_ENV === "development"
|
||
|
||
const transports = []
|
||
if (!IS_DEV) {
|
||
transports.push(new winston.transports.Console())
|
||
} else {
|
||
transports.push(
|
||
new winston.transports.Console({
|
||
format: winston.format.combine(
|
||
winston.format.cli(),
|
||
winston.format.splat()
|
||
),
|
||
})
|
||
)
|
||
}
|
||
|
||
const loggerInstance = winston.createLogger({
|
||
level: LOG_LEVEL,
|
||
levels: winston.config.npm.levels,
|
||
format: winston.format.combine(
|
||
winston.format.timestamp({
|
||
format: "YYYY-MM-DD HH:mm:ss",
|
||
}),
|
||
winston.format.errors({ stack: true }),
|
||
winston.format.splat(),
|
||
winston.format.json()
|
||
),
|
||
transports,
|
||
})
|
||
|
||
export class Reporter {
|
||
constructor({ logger, activityLogger }) {
|
||
this.activities_ = []
|
||
this.loggerInstance_ = logger
|
||
this.ora_ = activityLogger
|
||
}
|
||
|
||
panic = (data) => {
|
||
const parsedPanic = panicHandler(data)
|
||
|
||
this.loggerInstance_.log({
|
||
level: "error",
|
||
details: data,
|
||
message: parsedPanic.message,
|
||
})
|
||
|
||
track("PANIC_ERROR_REACHED", {
|
||
id: data.id,
|
||
})
|
||
|
||
process.exit(1)
|
||
}
|
||
|
||
/**
|
||
* Determines if the logger should log at a given level.
|
||
* @param {string} level - the level to check if logger is configured for
|
||
* @return {boolean} whether we should log
|
||
*/
|
||
shouldLog = (level) => {
|
||
level = this.loggerInstance_.levels[level]
|
||
const logLevel = this.loggerInstance_.levels[this.loggerInstance_.level]
|
||
return level <= logLevel
|
||
}
|
||
|
||
/**
|
||
* Sets the log level of the logger.
|
||
* @param {string} level - the level to set the logger to
|
||
*/
|
||
setLogLevel = (level) => {
|
||
this.loggerInstance_.level = level
|
||
}
|
||
|
||
/**
|
||
* Resets the logger to the value specified by the LOG_LEVEL env var. If no
|
||
* LOG_LEVEL is set it defaults to "silly".
|
||
*/
|
||
unsetLogLevel = () => {
|
||
this.loggerInstance_.level = LOG_LEVEL
|
||
}
|
||
|
||
/**
|
||
* Begin an activity. In development an activity is displayed as a spinner;
|
||
* in other environments it will log the activity at the info level.
|
||
* @param {string} message - the message to log the activity under
|
||
* @returns {string} the id of the activity; this should be passed to do
|
||
* further operations on the activity such as success, failure, progress.
|
||
*/
|
||
activity = (message, config = {}) => {
|
||
const id = ulid()
|
||
if (IS_DEV && this.shouldLog("info")) {
|
||
const activity = this.ora_(message).start()
|
||
|
||
this.activities_[id] = {
|
||
activity,
|
||
config,
|
||
start: Date.now(),
|
||
}
|
||
|
||
return id
|
||
} else {
|
||
this.activities_[id] = {
|
||
start: Date.now(),
|
||
config,
|
||
}
|
||
this.loggerInstance_.log({
|
||
activity_id: id,
|
||
level: "info",
|
||
config,
|
||
message,
|
||
})
|
||
|
||
return id
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Reports progress on an activity. In development this will update the
|
||
* activity log message, in other environments a log message will be issued
|
||
* at the info level. Logging will include the activityId.
|
||
* @param {string} activityId - the id of the activity as returned by activity
|
||
* @param {string} message - the message to log
|
||
*/
|
||
progress = (activityId, message) => {
|
||
const toLog = {
|
||
level: "info",
|
||
message,
|
||
}
|
||
|
||
if (typeof activityId === "string" && this.activities_[activityId]) {
|
||
const activity = this.activities_[activityId]
|
||
if (activity.activity) {
|
||
activity.text = message
|
||
} else {
|
||
toLog.activity_id = activityId
|
||
this.loggerInstance_.log(toLog)
|
||
}
|
||
} else {
|
||
this.loggerInstance_.log(toLog)
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Logs an error. If an error object is provided the stack trace for the error
|
||
* will also be logged.
|
||
* @param {String | Error} messageOrError - can either be a string with a
|
||
* message to log the error under; or an error object.
|
||
* @param {Error?} error - an error object to log message with
|
||
*/
|
||
error = (messageOrError, error) => {
|
||
let message = messageOrError
|
||
if (typeof messageOrError === "object") {
|
||
message = messageOrError.message
|
||
error = messageOrError
|
||
}
|
||
|
||
const toLog = {
|
||
level: "error",
|
||
message,
|
||
}
|
||
|
||
if (error) {
|
||
toLog.stack = stackTrace.parse(error)
|
||
}
|
||
|
||
this.loggerInstance_.log(toLog)
|
||
|
||
// Give stack traces and details in dev
|
||
if (error && IS_DEV) {
|
||
console.log(error)
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Reports failure of an activity. In development the activity will be udpated
|
||
* with the failure message in other environments the failure will be logged
|
||
* at the error level.
|
||
* @param {string} activityId - the id of the activity as returned by activity
|
||
* @param {string} message - the message to log
|
||
* @returns {object} data about the activity
|
||
*/
|
||
failure = (activityId, message) => {
|
||
const time = Date.now()
|
||
const toLog = {
|
||
level: "error",
|
||
message,
|
||
}
|
||
|
||
if (typeof activityId === "string" && this.activities_[activityId]) {
|
||
const activity = this.activities_[activityId]
|
||
if (activity.activity) {
|
||
activity.activity.fail(`${message} – ${time - activity.start}`)
|
||
} else {
|
||
toLog.duration = time - activity.start
|
||
toLog.activity_id = activityId
|
||
this.loggerInstance_.log(toLog)
|
||
}
|
||
} else {
|
||
this.loggerInstance_.log(toLog)
|
||
}
|
||
|
||
if (this.activities_[activityId]) {
|
||
const activity = this.activities_[activityId]
|
||
return {
|
||
...activity,
|
||
duration: time - activity.start,
|
||
}
|
||
}
|
||
|
||
return null
|
||
}
|
||
|
||
/**
|
||
* Reports success of an activity. In development the activity will be udpated
|
||
* with the failure message in other environments the failure will be logged
|
||
* at the info level.
|
||
* @param {string} activityId - the id of the activity as returned by activity
|
||
* @param {string} message - the message to log
|
||
* @returns {object} data about the activity
|
||
*/
|
||
success = (activityId, message) => {
|
||
const time = Date.now()
|
||
const toLog = {
|
||
level: "info",
|
||
message,
|
||
}
|
||
|
||
if (typeof activityId === "string" && this.activities_[activityId]) {
|
||
const activity = this.activities_[activityId]
|
||
if (activity.activity) {
|
||
activity.activity.succeed(`${message} – ${time - activity.start}ms`)
|
||
} else {
|
||
toLog.duration = time - activity.start
|
||
toLog.activity_id = activityId
|
||
this.loggerInstance_.log(toLog)
|
||
}
|
||
} else {
|
||
this.loggerInstance_.log(toLog)
|
||
}
|
||
|
||
if (this.activities_[activityId]) {
|
||
const activity = this.activities_[activityId]
|
||
return {
|
||
...activity,
|
||
duration: time - activity.start,
|
||
}
|
||
}
|
||
|
||
return null
|
||
}
|
||
|
||
/**
|
||
* Logs a message at the info level.
|
||
* @param {string} message - the message to log
|
||
*/
|
||
debug = (message) => {
|
||
this.loggerInstance_.log({
|
||
level: "debug",
|
||
message,
|
||
})
|
||
}
|
||
|
||
/**
|
||
* Logs a message at the info level.
|
||
* @param {string} message - the message to log
|
||
*/
|
||
info = (message) => {
|
||
this.loggerInstance_.log({
|
||
level: "info",
|
||
message,
|
||
})
|
||
}
|
||
|
||
/**
|
||
* Logs a message at the warn level.
|
||
* @param {string} message - the message to log
|
||
*/
|
||
warn = (message) => {
|
||
this.loggerInstance_.warn({
|
||
level: "warn",
|
||
message,
|
||
})
|
||
}
|
||
|
||
/**
|
||
* A wrapper around winston's log method.
|
||
*/
|
||
log = (...args) => {
|
||
this.loggerInstance_.log(...args)
|
||
}
|
||
}
|
||
|
||
const logger = new Reporter({
|
||
logger: loggerInstance,
|
||
activityLogger: ora,
|
||
})
|
||
|
||
export default logger
|