2024-08-15 16:48:39 +02:00
const path = require ( "path" )
const makeBarrelPath = finalPath => {
return path . resolve ( _ _dirname , ".." , finalPath )
}
const backendCoreBarrelPaths = [
makeBarrelPath ( path . join ( "packages" , "backend-core" , "src" , "index.ts" ) ) ,
makeBarrelPath ( path . join ( "packages" , "backend-core" , "src" ) ) ,
makeBarrelPath ( path . join ( "packages" , "backend-core" ) ) ,
]
2023-11-17 14:39:52 +01:00
module . exports = {
2024-04-10 18:27:15 +02:00
"no-console-error" : {
2024-08-15 16:48:39 +02:00
create : function ( context ) {
2024-04-10 18:27:15 +02:00
return {
CallExpression ( node ) {
if (
node . callee . type === "MemberExpression" &&
node . callee . object . name === "console" &&
node . callee . property . name === "error" &&
node . arguments . length === 1 &&
2024-04-10 18:39:12 +02:00
node . arguments [ 0 ] . name &&
2024-04-10 18:27:15 +02:00
node . arguments [ 0 ] . name . startsWith ( "err" )
) {
context . report ( {
node ,
2024-08-15 16:48:39 +02:00
message :
"Using console.error(err) on its own is not allowed. Either provide context to the error (console.error(msg, err)) or throw it." ,
2024-04-10 18:27:15 +02:00
} )
}
} ,
2024-08-15 16:48:39 +02:00
}
2024-04-10 18:27:15 +02:00
} ,
} ,
2023-11-17 14:39:52 +01:00
"no-budibase-imports" : {
create : function ( context ) {
return {
ImportDeclaration ( node ) {
const importPath = node . source . value
if (
/^@budibase\/[^/]+\/.*$/ . test ( importPath ) &&
2024-03-15 16:40:30 +01:00
importPath !== "@budibase/backend-core/tests" &&
2025-01-20 15:55:00 +01:00
importPath !== "@budibase/string-templates/test/utils" &&
importPath !== "@budibase/client/manifest.json"
2023-11-17 14:39:52 +01:00
) {
context . report ( {
node ,
2025-01-20 15:55:00 +01:00
message : ` Importing from @budibase is not allowed, except for @budibase/backend-core/tests, @budibase/string-templates/test/utils and @budibase/client/manifest.json. ` ,
2023-11-17 14:39:52 +01:00
} )
}
} ,
}
} ,
} ,
2024-02-08 17:32:14 +01:00
"no-test-com" : {
meta : {
type : "problem" ,
docs : {
description :
"disallow the use of 'test.com' in strings and replace it with 'example.com'" ,
} ,
2024-03-18 11:05:47 +01:00
schema : [ ] ,
fixable : "code" ,
2024-02-08 17:32:14 +01:00
} ,
create : function ( context ) {
return {
Literal ( node ) {
if (
typeof node . value === "string" &&
node . value . includes ( "test.com" )
) {
context . report ( {
node ,
message :
"test.com is a privately owned domain and could point anywhere, use example.com instead." ,
fix : function ( fixer ) {
const newText = node . raw . replace ( /test\.com/g , "example.com" )
return fixer . replaceText ( node , newText )
} ,
} )
}
} ,
}
} ,
} ,
2024-02-21 12:30:22 +01:00
"email-domain-example-com" : {
meta : {
type : "problem" ,
docs : {
description :
"enforce using the example.com domain for generator.email calls" ,
} ,
fixable : "code" ,
schema : [ ] ,
} ,
create : function ( context ) {
return {
CallExpression ( node ) {
if (
node . callee . type === "MemberExpression" &&
node . callee . object . name === "generator" &&
node . callee . property . name === "email" &&
node . arguments . length === 0
) {
context . report ( {
node ,
message :
"Prefer using generator.email with the domain \"{ domain: 'example.com' }\"." ,
fix : function ( fixer ) {
return fixer . replaceText (
node ,
'generator.email({ domain: "example.com" })'
)
} ,
} )
}
} ,
}
} ,
} ,
2024-08-15 16:48:39 +02:00
"no-barrel-imports" : {
meta : {
type : "problem" ,
docs : {
description :
"Disallow imports from the top-level backend-core barrel file" ,
category : "Best Practices" ,
recommended : false ,
} ,
schema : [ ] , // no options
messages : {
noBarrelImport :
"Avoid importing from the top-level barrel file 'backend-core/src/index.ts'. Import directly from the specific module instead." ,
} ,
} ,
create ( context ) {
return {
ImportDeclaration ( node ) {
const importPath = node . source . value
const importFullPath = path . resolve (
context . getFilename ( ) ,
".." ,
importPath
)
if ( backendCoreBarrelPaths . includes ( importFullPath ) ) {
context . report ( {
node ,
messageId : "noBarrelImport" ,
data : {
importFullPath ,
} ,
} )
}
} ,
}
} ,
} ,
2023-11-17 14:39:52 +01:00
}