UNPKG

intlayer-editor

Version:

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

1 lines 5.47 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,SAAS,kBAAkB,sBAAsB;AACjD,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,OAAO,iBAAiB;AACxB,OAAO,kBAAkB;AACzB,OAAO,UAAgC;AACvC,OAAO,aAA+B;AACtC,SAAS,gBAAgB;AACzB,OAAO,YAAY;AACnB,OAAO,UAAU;AACjB,SAAS,YAAY,WAAW,oBAAoB;AACpD,OAAO,QAAQ,SAAS,eAAe;AACvC,SAAS,qBAAqB;AAE9B,MAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AAExD,MAAM,iBAAiB;AAAA,EACrB,KAAK,QAAQ,IAAI;AAAA,EACjB,SAAS,QAAQ,IAAI;AACvB;AAGA,MAAM,cAAc,KAAK;AAAA,EACvB,aAAa,QAAQ,WAAW,oBAAoB,GAAG,MAAM;AAC/D;AAEA,MAAM,MAAe,QAAQ;AAG7B,IAAI,IAAI,SAAS,CAAC;AAElB,MAAM,gBAAgB;AACtB,MAAM,SAAS,iBAAiB,cAAc;AAC9C,MAAM,OAAO,OAAO,OAAO,QAAQ;AAEnC,MAAM,iBAAiB,QAAQ,WAAW,mBAAmB;AAE7D,MAAM,cAA2B;AAAA,EAC/B,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,cAAc,OAAOA,SAAiB;AAC1C,QAAM,kBAAkB,MAAM,sBAAsB,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,IACF,OAAO;AAAA,MACL,uBAAuB;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,EAAAA,KAAI,IAAI,KAAK,WAAW,CAAC;AAGzB,EAAAA,KAAI,IAAI,YAAY,CAAC;AAErB,EAAAA,KAAI,IAAI,QAAQ,KAAK,CAAC;AAEtB,EAAAA,KAAI,IAAI,aAAa,CAAC;AAGtB,EAAAA,KAAI,IAAI,QAAQ,WAAW,EAAE,UAAU,KAAK,CAAC,CAAC;AAE9C,EAAAA,KAAI,IAAI,mBAAmB,gBAAgB;AAC3C,EAAAA,KAAI,IAAI,eAAe,mBAAmB;AAE1C,EAAAA,KAAI,IAAI,QAAQ,OAAO,cAAc,CAAC;AAGtC,EAAAA,KAAI,IAAI,QAAQ,CAAC,KAAK,QAAQ;AAC5B,UAAM,gBAAgB,KAAK,KAAK,gBAAgB,IAAI,GAAG;AAEvD,QAAI,WAAW,aAAa,KAAK,UAAU,aAAa,EAAE,OAAO,GAAG;AAElE,YAAM,WACJ,KAAK,QAAQ,aAAa,KAAK;AACjC,UAAI,UAAU,gBAAgB,QAAQ;AACtC,UAAI,SAAS,aAAa;AAAA,IAC5B,OAAO;AAEL,UAAI,SAAS,QAAQ,gBAAgB,YAAY,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,EAAAA,KAAI,OAAO,MAAM,MAAM;AACrB,UAAM,iBAAiB;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":["app"]}