Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ dist
node_modules
public/missing-locales
public/images/custom
public/images/uicons
public/images/uicons
server/src/configs/
6 changes: 2 additions & 4 deletions .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
"inject": true
},
"rules": {
"global-require": 0,
"import/no-dynamic-require": 0,
"camelcase": 0,
"react/jsx-props-no-spreading": 0,
"linebreak-style": 0,
Expand Down Expand Up @@ -96,10 +98,6 @@
[
"@assets",
"./src/assets/"
],
[
"@classes",
"./src/classes/"
]
],
"extensions": [
Expand Down
3 changes: 2 additions & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ dist
node_modules
public/missing-locales
public/images/custom
public/images/uicons
public/images/uicons
server/src/configs/
5 changes: 2 additions & 3 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
"dbaeumer.vscode-eslint",
"lokalise.i18n-ally",
"esbenp.prettier-vscode",
"leizongmin.node-module-intellisense",
"eg2.vscode-npm-script",
"christian-kohler.npm-intellisense",
"graphql.vscode-graphql"
]
}
}
7 changes: 3 additions & 4 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
{
"i18n-ally.localesPaths": [
"public/base-locales"
],
"i18n-ally.localesPaths": ["public/base-locales"],
"i18n-ally.keystyle": "flat",
"[javascript]": {
"editor.autoClosingBrackets": "always",
Expand All @@ -11,4 +9,5 @@
"editor.autoClosingBrackets": "always",
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
}
"editor.formatOnSave": true
}
12 changes: 12 additions & 0 deletions ReactMap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* eslint-disable import/extensions */
const { generate } = require('./server/scripts/generateMasterfile')
const { locales } = require('./server/scripts/createLocales')
const { connection } = require('./server/knexfile.cjs')

connection.migrate.latest().then(() =>
generate(true).then(() =>
locales()
.then(() => require('./esbuild.config.js'))
.then(() => require('./server/src/index')),
),
)
15 changes: 5 additions & 10 deletions ReactMap.mjs
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
/* eslint-disable import/extensions */
import { generate } from './server/scripts/generateMasterfile.js'
import { locales } from './server/scripts/createLocales.js'
import { connection } from './server/knexfile.cjs'
/* eslint-disable no-console */
import './ReactMap.js'

connection.migrate.latest().then(() => (
generate(true)
.then(() => locales()
.then(() => import('./esbuild.config.mjs'))
.then(() => import('./server/src/index.js')))
))
console.warn(
'[WARN] ReactMap.mjs is being deprecated and support will be removed in version 1.8.0. Please change your PM2 script to use ReactMap.js instead.',
)
175 changes: 175 additions & 0 deletions esbuild.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
/* eslint-disable no-continue */
/* eslint-disable import/no-extraneous-dependencies */
/* eslint-disable no-console */
const { resolve, extname } = require('path')
const fs = require('fs')
const dotenv = require('dotenv')
const { build: compile } = require('esbuild')
const { createServer } = require('esbuild-server')
const { htmlPlugin } = require('@craftamap/esbuild-plugin-html')
const esbuildMxnCopy = require('esbuild-plugin-mxn-copy')
const aliasPlugin = require('esbuild-plugin-path-alias')
const { eslintPlugin } = require('esbuild-plugin-eslinter')

const env = fs.existsSync(resolve(__dirname, '.env'))
? dotenv.config()
: { parsed: process.env }
const { version } = JSON.parse(
fs.readFileSync(resolve(__dirname, 'package.json')),
)
const isDevelopment = Boolean(process.argv.includes('--dev'))
const isRelease = Boolean(process.argv.includes('--release'))
const isServing = Boolean(process.argv.includes('--serve'))

const hasCustom = (function checkFolders(folder, isCustom = false) {
const files = fs.readdirSync(folder)
for (let i = 0; i < files.length; i += 1) {
if (isCustom) return true
if (files[i].startsWith('.')) continue
if (!files[i].includes('.'))
isCustom = checkFolders(`${folder}/${files[i]}`, isCustom)
if (/\.custom.(jsx?|css)$/.test(files[i])) return true
}
return isCustom
})(resolve(__dirname, 'src'))

if (fs.existsSync(resolve(__dirname, 'dist'))) {
console.log('[BUILD] Cleaning up old build')
fs.rm(resolve(__dirname, 'dist'), { recursive: true }, (err) => {
if (err) console.log(err)
})
}

const plugins = [
htmlPlugin({
files: [
{
entryPoints: ['src/index.jsx'],
filename: 'index.html',
htmlTemplate: fs.readFileSync(resolve(__dirname, 'public/index.html')),
scriptLoading: 'defer',
favicon: fs.existsSync(resolve(__dirname, 'public/favicon/favicon.ico'))
? resolve(__dirname, 'public/favicon/favicon.ico')
: resolve(__dirname, 'public/favicon/fallback.ico'),
extraScripts: isServing
? [{ src: '/esbuild-livereload.js', attrs: { async: true } }]
: undefined,
},
],
}),
esbuildMxnCopy({
copy: [
{ from: resolve(__dirname, './public/images'), to: 'dist/' },
{ from: resolve(__dirname, './public/locales'), to: 'dist/' },
],
}),
aliasPlugin({
'@components': resolve(__dirname, './src/components'),
'@assets': resolve(__dirname, './src/assets'),
'@hooks': resolve(__dirname, './src/hooks'),
'@services': resolve(__dirname, './src/services'),
}),
]

if (isDevelopment) {
plugins.push(eslintPlugin())
} else {
if (hasCustom) {
plugins.push({
name: 'Custom Loader',
setup(build) {
const customPaths = []
build.onLoad({ filter: /\.(jsx?|css)$/ }, async (args) => {
const isNodeModule = /node_modules/.test(args.path)
if (!isNodeModule) {
const ext = extname(args.path)
const newPath = args.path.replace(ext, `.custom${ext}`)
// console.log(ext, newPath)
if (fs.existsSync(newPath)) {
customPaths.push(newPath)
return {
contents: fs.readFileSync(newPath, 'utf8'),
loader: ext.replace('.', ''),
watchFiles: isDevelopment ? [newPath] : undefined,
}
}
}
})
build.onEnd(() => {
if (customPaths.length && !isDevelopment) {
console.log(`
======================================================
WARNING:
Custom files aren't officially supported
Be sure to watch for breaking changes!

${customPaths.map((x, i) => ` ${i + 1}. src/${x.split('src/')[1]}`).join('\n')}

======================================================
`)
}
})
},
})
}
console.log(`[BUILD] Building production version: ${version}`)
}

const esbuild = {
entryPoints: ['src/index.jsx'],
legalComments: 'none',
bundle: true,
outdir: 'dist/',
publicPath: '/',
entryNames: isDevelopment ? undefined : `[name]-${version}-[hash]`,
metafile: true,
minify: env.parsed.NO_MINIFIED ? false : isRelease || !isDevelopment,
logLevel: isDevelopment ? 'info' : 'error',
target: ['safari11.1', 'chrome64', 'firefox66', 'edge88'],
watch: isDevelopment
? {
onRebuild(error) {
if (error) console.error('Recompiling failed:', error)
else console.log('Recompiled successfully')
},
}
: false,
sourcemap: isRelease || isDevelopment,
define: {
inject: JSON.stringify({
GOOGLE_ANALYTICS_ID: env.parsed.GOOGLE_ANALYTICS_ID || '',
ANALYTICS_DEBUG_MODE: env.parsed.ANALYTICS_DEBUG_MODE || false,
TITLE: env.parsed.TITLE || env.parsed.MAP_GENERAL_TITLE || '',
SENTRY_DSN: env.parsed.SENTRY_DSN || '',
SENTRY_TRACES_SAMPLE_RATE: env.parsed.SENTRY_TRACES_SAMPLE_RATE || 0.1,
SENTRY_DEBUG: env.parsed.SENTRY_DEBUG || false,
VERSION: version,
DEVELOPMENT: isDevelopment,
CUSTOM: hasCustom,
LOCALES: fs.readdirSync(resolve(__dirname, 'public/locales')),
}),
},
plugins,
}

try {
if (isServing) {
if (!env.parsed.DEV_PORT)
throw new Error(
'DEV_PORT is not set, in .env file, it should match the port you set in your config',
)
createServer(esbuild, {
port: +env.parsed.DEV_PORT + 1,
static: 'public',
open: true,
proxy: {
'/': `http://localhost:${env.parsed.DEV_PORT}`,
},
}).start()
} else {
compile(esbuild).then(() => console.log('[BUILD] React Map Compiled'))
}
} catch (e) {
console.error(e)
process.exit(1)
}
Loading