UNPKG

intlayer-editor

Version:

Integrate the Intlayer visual editor into your Intlayer projects, enabling CMS-like content management with multilingual support.

1 lines 5.58 kB
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { getConfiguration, getEnvFilePath } from '@intlayer/config';\nimport { configurationRouter } from '@routes/config.routes';\nimport { dictionaryRouter } from '@routes/dictionary.routes';\nimport { checkPortAvailability } from '@utils/checkPortAvailability';\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport cors, { type CorsOptions } from 'cors';\nimport express, { type Express } from 'express';\nimport { intlayer } from 'express-intlayer';\nimport helmet from 'helmet';\nimport mime from 'mime';\nimport { existsSync, lstatSync, readFileSync } from 'node:fs';\nimport path, { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst envFileOptions = {\n env: process.env.NODE_ENV,\n envFile: process.env.ENV_FILE,\n};\n\n// Load package.json\nconst packageJson = JSON.parse(\n readFileSync(resolve(__dirname, '../../package.json'), 'utf8')\n);\n\nconst app: Express = express();\n\n// Load internationalization request handler\napp.use(intlayer());\n\nconst FALLBACK_PORT = 8000;\nconst config = getConfiguration(envFileOptions);\nconst port = config.editor.port ?? FALLBACK_PORT;\n\nconst clientDistPath = resolve(__dirname, '../../client/dist');\n\nconst corsOptions: CorsOptions = {\n origin: '*',\n credentials: true,\n};\n\nconst startServer = async (app: Express) => {\n const isPortAvailable = await checkPortAvailability(port);\n\n if (!isPortAvailable) {\n console.error(`\\x1b[1;31mError: Port ${port} is already in use.\\x1b[0m`);\n process.exit(255);\n }\n\n app.disable('x-powered-by'); // Disabled to prevent attackers from knowing that the app is running Express\n app.use(\n helmet({\n contentSecurityPolicy: false,\n })\n );\n\n app.use(cors(corsOptions));\n\n // Compress all HTTP responses\n app.use(compression());\n\n app.use(express.json());\n\n app.use(cookieParser());\n\n // Parse incoming requests with urlencoded payloads\n app.use(express.urlencoded({ extended: true }));\n\n app.use('/api/dictionary', dictionaryRouter);\n app.use('/api/config', configurationRouter);\n\n app.use(express.static(clientDistPath));\n\n // For single-page applications, redirect all unmatched routes to index.html\n app.get(/(.*)/, (req, res) => {\n const requestedPath = path.join(clientDistPath, req.url); // Full path of the requested file\n\n if (existsSync(requestedPath) && lstatSync(requestedPath).isFile()) {\n // If the requested file exists, determine its MIME type and serve it\n const mimeType =\n mime.getType(requestedPath) ?? 'application/octet-stream';\n res.setHeader('Content-Type', mimeType);\n res.sendFile(requestedPath);\n } else {\n // Otherwise, serve the index.html for React Router fallback\n res.sendFile(resolve(clientDistPath, 'index.html'));\n }\n });\n\n app.listen(port, () => {\n const dotEnvFilePath = getEnvFilePath(\n envFileOptions.env,\n envFileOptions.envFile\n );\n\n console.log(`\n \\x1b[1;90mINTLAYER v${packageJson.version}\\x1b[0m\n\n Editor running at: \\x1b[90mhttp://localhost:${port}\\x1b[0m\n - Watching application at: ${config.editor.applicationURL === '' ? '-' : `\\x1b[90m${config.editor.applicationURL}\\x1b[0m`}\n - Access key: ${config.editor.clientId ?? '-'}\n - Environment: ${dotEnvFilePath ?? '-'}\n `);\n });\n};\n\n// Start it up!\nstartServer(app);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAiD;AACjD,IAAAA,iBAAoC;AACpC,wBAAiC;AACjC,mCAAsC;AACtC,yBAAwB;AACxB,2BAAyB;AACzB,kBAAuC;AACvC,qBAAsC;AACtC,8BAAyB;AACzB,oBAAmB;AACnB,kBAAiB;AACjB,qBAAoD;AACpD,uBAAuC;AACvC,sBAA8B;AAb9B;AAeA,MAAM,gBAAY,8BAAQ,+BAAc,YAAY,GAAG,CAAC;AAExD,MAAM,iBAAiB;AAAA,EACrB,KAAK,QAAQ,IAAI;AAAA,EACjB,SAAS,QAAQ,IAAI;AACvB;AAGA,MAAM,cAAc,KAAK;AAAA,MACvB,iCAAa,0BAAQ,WAAW,oBAAoB,GAAG,MAAM;AAC/D;AAEA,MAAM,UAAe,eAAAC,SAAQ;AAG7B,IAAI,QAAI,kCAAS,CAAC;AAElB,MAAM,gBAAgB;AACtB,MAAM,aAAS,gCAAiB,cAAc;AAC9C,MAAM,OAAO,OAAO,OAAO,QAAQ;AAEnC,MAAM,qBAAiB,0BAAQ,WAAW,mBAAmB;AAE7D,MAAM,cAA2B;AAAA,EAC/B,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,cAAc,OAAOC,SAAiB;AAC1C,QAAM,kBAAkB,UAAM,oDAAsB,IAAI;AAExD,MAAI,CAAC,iBAAiB;AACpB,YAAQ,MAAM,yBAAyB,IAAI,4BAA4B;AACvE,YAAQ,KAAK,GAAG;AAAA,EAClB;AAEA,EAAAA,KAAI,QAAQ,cAAc;AAC1B,EAAAA,KAAI;AAAA,QACF,cAAAC,SAAO;AAAA,MACL,uBAAuB;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,EAAAD,KAAI,QAAI,YAAAE,SAAK,WAAW,CAAC;AAGzB,EAAAF,KAAI,QAAI,mBAAAG,SAAY,CAAC;AAErB,EAAAH,KAAI,IAAI,eAAAD,QAAQ,KAAK,CAAC;AAEtB,EAAAC,KAAI,QAAI,qBAAAI,SAAa,CAAC;AAGtB,EAAAJ,KAAI,IAAI,eAAAD,QAAQ,WAAW,EAAE,UAAU,KAAK,CAAC,CAAC;AAE9C,EAAAC,KAAI,IAAI,mBAAmB,kCAAgB;AAC3C,EAAAA,KAAI,IAAI,eAAe,kCAAmB;AAE1C,EAAAA,KAAI,IAAI,eAAAD,QAAQ,OAAO,cAAc,CAAC;AAGtC,EAAAC,KAAI,IAAI,QAAQ,CAAC,KAAK,QAAQ;AAC5B,UAAM,gBAAgB,iBAAAK,QAAK,KAAK,gBAAgB,IAAI,GAAG;AAEvD,YAAI,2BAAW,aAAa,SAAK,0BAAU,aAAa,EAAE,OAAO,GAAG;AAElE,YAAM,WACJ,YAAAC,QAAK,QAAQ,aAAa,KAAK;AACjC,UAAI,UAAU,gBAAgB,QAAQ;AACtC,UAAI,SAAS,aAAa;AAAA,IAC5B,OAAO;AAEL,UAAI,aAAS,0BAAQ,gBAAgB,YAAY,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,EAAAN,KAAI,OAAO,MAAM,MAAM;AACrB,UAAM,qBAAiB;AAAA,MACrB,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAEA,YAAQ,IAAI;AAAA,0BACU,YAAY,OAAO;AAAA;AAAA,2DAEc,IAAI;AAAA,kCAC7B,OAAO,OAAO,mBAAmB,KAAK,MAAM,WAAW,OAAO,OAAO,cAAc,SAAS;AAAA,kCAC5F,OAAO,OAAO,YAAY,GAAG;AAAA,kCAC7B,kBAAkB,GAAG;AAAA,KAClD;AAAA,EACH,CAAC;AACH;AAGA,YAAY,GAAG;","names":["import_config","express","app","helmet","cors","compression","cookieParser","path","mime"]}