UNPKG

@intlayer/chokidar

Version:

Uses chokidar to scan and build Intlayer declaration files into dictionaries based on Intlayer configuration.

332 lines (330 loc) 18.7 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); const require_runtime = require('../_virtual/_rolldown/runtime.cjs'); const require_initConfig_index = require('../initConfig/index.cjs'); const require_init_utils_configManipulation = require('./utils/configManipulation.cjs'); const require_init_utils_fileSystem = require('./utils/fileSystem.cjs'); const require_init_utils_jsonParser = require('./utils/jsonParser.cjs'); const require_init_utils_tsConfig = require('./utils/tsConfig.cjs'); let node_path = require("node:path"); let _intlayer_config_logger = require("@intlayer/config/logger"); let _intlayer_config_node = require("@intlayer/config/node"); let _intlayer_config_utils = require("@intlayer/config/utils"); let _intlayer_config_colors = require("@intlayer/config/colors"); _intlayer_config_colors = require_runtime.__toESM(_intlayer_config_colors); //#region src/init/index.ts /** * Documentation URL Constants */ const DocumentationRouter = { NextJS: "https://intlayer.org/doc/environment/nextjs.md", NextJS_15: "https://intlayer.org/doc/environment/nextjs/15.md", NextJS_14: "https://intlayer.org/doc/environment/nextjs/14.md", CRA: "https://intlayer.org/doc/environment/create-react-app.md", Astro: "https://intlayer.org/doc/environment/astro.md", ViteAndReact: "https://intlayer.org/doc/environment/vite-and-react.md", ViteAndReact_ReactRouterV7: "https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md", ViteAndReact_ReactRouterV7_FSRoutes: "https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md", ViteAndVue: "https://intlayer.org/doc/environment/vite-and-vue.md", ViteAndSolid: "https://intlayer.org/doc/environment/vite-and-solid.md", ViteAndSvelte: "https://intlayer.org/doc/environment/vite-and-svelte.md", ViteAndPreact: "https://intlayer.org/doc/environment/vite-and-preact.md", TanStackRouter: "https://intlayer.org/doc/environment/tanstack.md", NuxtAndVue: "https://intlayer.org/doc/environment/nuxt-and-vue.md", Angular: "https://intlayer.org/doc/environment/angular.md", SvelteKit: "https://intlayer.org/doc/environment/sveltekit.md", ReactNativeAndExpo: "https://intlayer.org/doc/environment/react-native-and-expo.md", Lynx: "https://intlayer.org/doc/environment/lynx-and-react.md", Express: "https://intlayer.org/doc/environment/express.md", NestJS: "https://intlayer.org/doc/environment/nestjs.md", Fastify: "https://intlayer.org/doc/environment/fastify.md", Default: "https://intlayer.org/doc/get-started", NextIntl: "https://intlayer.org/blog/intlayer-with-next-intl.md", ReactI18Next: "https://intlayer.org/blog/intlayer-with-react-i18next.md", ReactIntl: "https://intlayer.org/blog/intlayer-with-react-intl.md", NextI18Next: "https://intlayer.org/blog/intlayer-with-next-i18next.md", VueI18n: "https://intlayer.org/blog/intlayer-with-vue-i18n.md" }; /** * Helper: Detects the environment and returns the doc URL */ const getDocumentationUrl = (packageJson) => { const deps = { ...packageJson.dependencies, ...packageJson.devDependencies }; /** * Helper to check if a version string matches a specific major version * Matches: "15", "^15.0.0", "~15.2", "15.0.0-beta" */ const isVersion = (versionString, major) => { if (!versionString || typeof versionString !== "string") return false; return new RegExp(`^[\\^~]?${major}(?:\\.|$)`).test(versionString); }; if (deps["@lynx-js/react"] || deps["@lynx-js/core"]) return DocumentationRouter.Lynx; if (deps["react-native"] || deps.expo) return DocumentationRouter.ReactNativeAndExpo; if (deps.next) { const version = deps.next; if (isVersion(version, 14)) return DocumentationRouter.NextJS_14; if (isVersion(version, 15)) return DocumentationRouter.NextJS_15; return DocumentationRouter.NextJS; } if (deps.nuxt) return DocumentationRouter.NuxtAndVue; if (deps.astro) return DocumentationRouter.Astro; if (deps["@sveltejs/kit"]) return DocumentationRouter.SvelteKit; if (deps["@tanstack/react-router"]) return DocumentationRouter.TanStackRouter; const reactRouterVersion = deps["react-router"]; if (reactRouterVersion && typeof reactRouterVersion === "string") { if (deps["@react-router/fs-routes"]) return DocumentationRouter.ViteAndReact_ReactRouterV7_FSRoutes; if (isVersion(reactRouterVersion, 7)) return DocumentationRouter.ViteAndReact_ReactRouterV7; } if (deps.vite) { if (deps.vue) return DocumentationRouter.ViteAndVue; if (deps["solid-js"]) return DocumentationRouter.ViteAndSolid; if (deps.svelte) return DocumentationRouter.ViteAndSvelte; if (deps.preact) return DocumentationRouter.ViteAndPreact; return DocumentationRouter.ViteAndReact; } if (deps["react-scripts"]) return DocumentationRouter.CRA; if (deps["@angular/core"]) return DocumentationRouter.Angular; if (deps["@nestjs/core"]) return DocumentationRouter.NestJS; if (deps.express) return DocumentationRouter.Express; if (deps.fastify) return DocumentationRouter.Fastify; if (deps["next-intl"]) return DocumentationRouter.NextIntl; if (deps["react-i18next"] || deps.i18next) return DocumentationRouter.ReactI18Next; if (deps["react-intl"]) return DocumentationRouter.ReactIntl; if (deps["next-i18next"]) return DocumentationRouter.NextI18Next; if (deps["vue-i18n"]) return DocumentationRouter.VueI18n; return DocumentationRouter.Default; }; /** * MAIN LOGIC */ const initIntlayer = async (rootDir, options) => { (0, _intlayer_config_logger.logger)((0, _intlayer_config_logger.colorize)("Checking Intlayer configuration...", _intlayer_config_colors.CYAN)); const packageJsonPath = "package.json"; if (!await require_init_utils_fileSystem.exists(rootDir, packageJsonPath)) { (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} No ${(0, _intlayer_config_logger.colorizePath)("package.json")} found. Please run this script from the project root.`, { level: "error" }); process.exit(1); } const packageJsonContent = await require_init_utils_fileSystem.readFileFromRoot(rootDir, packageJsonPath); let packageJson; try { packageJson = JSON.parse(packageJsonContent); } catch { (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} Could not parse ${(0, _intlayer_config_logger.colorizePath)("package.json")}.`, { level: "error" }); process.exit(1); } const guideUrl = getDocumentationUrl(packageJson); const gitignorePath = ".gitignore"; if (!options?.noGitignore && await require_init_utils_fileSystem.exists(rootDir, gitignorePath)) { const gitignoreContent = await require_init_utils_fileSystem.readFileFromRoot(rootDir, gitignorePath); if (!gitignoreContent.includes("intlayer")) { await require_init_utils_fileSystem.writeFileToRoot(rootDir, gitignorePath, `${gitignoreContent}\n# Intlayer\n.intlayer\n`); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Added ${(0, _intlayer_config_logger.colorizePath)(".intlayer")} to ${(0, _intlayer_config_logger.colorizePath)(gitignorePath)}`); } else (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} ${(0, _intlayer_config_logger.colorizePath)(gitignorePath)} already includes .intlayer`); } const vscodeDir = ".vscode"; const extensionsJsonPath = (0, node_path.join)(vscodeDir, "extensions.json"); const extensionId = "intlayer.intlayer-vs-code-extension"; try { let extensionsConfig = { recommendations: [] }; if (await require_init_utils_fileSystem.exists(rootDir, extensionsJsonPath)) extensionsConfig = require_init_utils_jsonParser.parseJSONWithComments(await require_init_utils_fileSystem.readFileFromRoot(rootDir, extensionsJsonPath)); else await require_init_utils_fileSystem.ensureDirectory(rootDir, vscodeDir); if (!extensionsConfig.recommendations) extensionsConfig.recommendations = []; if (!extensionsConfig.recommendations.includes(extensionId)) { extensionsConfig.recommendations.push(extensionId); await require_init_utils_fileSystem.writeFileToRoot(rootDir, extensionsJsonPath, JSON.stringify(extensionsConfig, null, 2)); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Added ${(0, _intlayer_config_logger.colorize)(extensionId, _intlayer_config_colors.MAGENTA)} to ${(0, _intlayer_config_logger.colorizePath)(extensionsJsonPath)}`); } else (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} ${(0, _intlayer_config_logger.colorizePath)(extensionsJsonPath)} already includes ${(0, _intlayer_config_logger.colorize)(extensionId, _intlayer_config_colors.MAGENTA)}`); } catch { (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} Could not update ${(0, _intlayer_config_logger.colorizePath)(extensionsJsonPath)}. You may need to add ${(0, _intlayer_config_logger.colorize)(extensionId, _intlayer_config_colors.MAGENTA)} manually.`, { level: "warn" }); } const tsConfigFiles = await require_init_utils_tsConfig.findTsConfigFiles(rootDir); let hasTsConfig = false; for (const fileName of tsConfigFiles) if (await require_init_utils_fileSystem.exists(rootDir, fileName)) { hasTsConfig = true; try { const config = require_init_utils_jsonParser.parseJSONWithComments(await require_init_utils_fileSystem.readFileFromRoot(rootDir, fileName)); const typeDefinition = ".intlayer/**/*.ts"; let updated = false; if (!config.include) {} else if (Array.isArray(config.include) && !config.include.some((pattern) => pattern.includes(".intlayer"))) { config.include.push(typeDefinition); updated = true; } else if (config.include.includes(typeDefinition)) (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} ${(0, _intlayer_config_logger.colorizePath)(fileName)} already includes intlayer types`); if (updated) { await require_init_utils_fileSystem.writeFileToRoot(rootDir, fileName, JSON.stringify(config, null, 2)); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Updated ${(0, _intlayer_config_logger.colorizePath)(fileName)} to include intlayer types`); } } catch { (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} Could not parse or update ${(0, _intlayer_config_logger.colorizePath)(fileName)}. You may need to add ${(0, _intlayer_config_logger.colorizePath)(".intlayer/types/**/*.ts")} manually.`, { level: "warn" }); } } await require_initConfig_index.initConfig(hasTsConfig ? "intlayer.config.ts" : "intlayer.config.mjs", rootDir); let hasAliasConfiguration = false; for (const file of [ "vite.config.ts", "vite.config.js", "vite.config.mjs" ]) if (await require_init_utils_fileSystem.exists(rootDir, file)) { hasAliasConfiguration = true; const content = await require_init_utils_fileSystem.readFileFromRoot(rootDir, file); if (!content.includes("vite-intlayer")) { await require_init_utils_fileSystem.writeFileToRoot(rootDir, file, require_init_utils_configManipulation.updateViteConfig(content, file.split(".").pop())); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Updated ${(0, _intlayer_config_logger.colorizePath)(file)} to include Intlayer plugin`); } break; } const nextConfigs = [ "next.config.js", "next.config.mjs", "next.config.ts" ]; let isNextJsProject = false; for (const file of nextConfigs) if (await require_init_utils_fileSystem.exists(rootDir, file)) { isNextJsProject = true; hasAliasConfiguration = true; const content = await require_init_utils_fileSystem.readFileFromRoot(rootDir, file); if (!content.includes("next-intlayer")) { await require_init_utils_fileSystem.writeFileToRoot(rootDir, file, require_init_utils_configManipulation.updateNextConfig(content, file.split(".").pop())); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Updated ${(0, _intlayer_config_logger.colorizePath)(file)} to include Intlayer plugin`); } break; } for (const file of [ "astro.config.mjs", "astro.config.js", "astro.config.ts", "astro.config.cjs" ]) if (await require_init_utils_fileSystem.exists(rootDir, file)) { hasAliasConfiguration = true; if (file.startsWith("astro.config.")) { const content = await require_init_utils_fileSystem.readFileFromRoot(rootDir, file); if (!content.includes("astro-intlayer")) { await require_init_utils_fileSystem.writeFileToRoot(rootDir, file, require_init_utils_configManipulation.updateAstroConfig(content, file.split(".").pop())); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Updated ${(0, _intlayer_config_logger.colorizePath)(file)} to include Intlayer integration`); } } break; } for (const file of ["nuxt.config.js", "nuxt.config.ts"]) if (await require_init_utils_fileSystem.exists(rootDir, file)) { hasAliasConfiguration = true; const content = await require_init_utils_fileSystem.readFileFromRoot(rootDir, file); if (!content.includes("nuxt-intlayer")) { await require_init_utils_fileSystem.writeFileToRoot(rootDir, file, require_init_utils_configManipulation.updateNuxtConfig(content, file.split(".").pop())); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Updated ${(0, _intlayer_config_logger.colorizePath)(file)} to include Intlayer module`); } break; } for (const file of ["svelte.config.js", "svelte.config.ts"]) if (await require_init_utils_fileSystem.exists(rootDir, file)) { hasAliasConfiguration = true; const content = await require_init_utils_fileSystem.readFileFromRoot(rootDir, file); if (!content.includes("@ts-check")) { await require_init_utils_fileSystem.writeFileToRoot(rootDir, file, require_init_utils_configManipulation.updateSvelteConfig(content, file.split(".").pop())); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Updated ${(0, _intlayer_config_logger.colorizePath)(file)} to include Intlayer typing`); } break; } const allDeps = { ...packageJson.dependencies, ...packageJson.devDependencies }; const isVersionGreaterOrEqual = (versionString, major) => { if (!versionString || typeof versionString !== "string") return false; const match = versionString.match(/^[^\d]*(\d+)/); if (!match) return false; return parseInt(match[1], 10) >= major; }; const backendIntlayerPackages = [ "express-intlayer", "fastify-intlayer", "adonis-intlayer", "hono-intlayer" ]; const devScript = packageJson.scripts?.dev; let newDevScript; if ((isNextJsProject && isVersionGreaterOrEqual(allDeps.next, 16) || backendIntlayerPackages.some((pkg) => allDeps[pkg])) && !devScript.includes("intlayer watch")) newDevScript = `intlayer watch --with '${devScript}'`; if (newDevScript) { packageJson.scripts.dev = newDevScript; await require_init_utils_fileSystem.writeFileToRoot(rootDir, packageJsonPath, JSON.stringify(packageJson, null, 2)); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Updated ${(0, _intlayer_config_logger.colorizePath)("package.json")} dev script to run intlayer watch`); } for (const file of [ "webpack.config.js", "webpack.config.ts", "webpack.config.mjs", "webpack.config.cjs" ]) if (await require_init_utils_fileSystem.exists(rootDir, file)) { hasAliasConfiguration = true; (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Found ${(0, _intlayer_config_logger.colorizePath)(file)}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`); break; } if ([ "express", "fastify", "@adonisjs/core", "hono", ...backendIntlayerPackages ].some((pkg) => allDeps[pkg])) hasAliasConfiguration = true; if (!hasAliasConfiguration) { const aliases = (0, _intlayer_config_utils.getAlias)({ configuration: (0, _intlayer_config_node.getConfiguration)({ baseDir: rootDir }) }); if (hasTsConfig && tsConfigFiles.length > 0) { const tsConfigPath = tsConfigFiles.find((file) => file === "tsconfig.json") || tsConfigFiles[0]; const config = require_init_utils_jsonParser.parseJSONWithComments(await require_init_utils_fileSystem.readFileFromRoot(rootDir, tsConfigPath)); config.compilerOptions ??= {}; config.compilerOptions.paths ??= {}; let updated = false; Object.entries(aliases).forEach(([alias, path]) => { if (!config.compilerOptions.paths[alias]) { config.compilerOptions.paths[alias] = [path]; updated = true; } }); if (updated) { await require_init_utils_fileSystem.writeFileToRoot(rootDir, tsConfigPath, JSON.stringify(config, null, 2)); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Updated ${(0, _intlayer_config_logger.colorizePath)(tsConfigPath)} to include Intlayer aliases`); } } else { const jsConfigPath = "jsconfig.json"; if (await require_init_utils_fileSystem.exists(rootDir, jsConfigPath)) { const config = require_init_utils_jsonParser.parseJSONWithComments(await require_init_utils_fileSystem.readFileFromRoot(rootDir, jsConfigPath)); config.compilerOptions ??= {}; config.compilerOptions.paths ??= {}; let updated = false; Object.entries(aliases).forEach(([alias, path]) => { if (!config.compilerOptions.paths[alias]) { config.compilerOptions.paths[alias] = [path]; updated = true; } }); if (updated) { await require_init_utils_fileSystem.writeFileToRoot(rootDir, jsConfigPath, JSON.stringify(config, null, 2)); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Updated ${(0, _intlayer_config_logger.colorizePath)(jsConfigPath)} to include Intlayer aliases`); } } else { packageJson.imports ??= {}; let updated = false; Object.entries(aliases).forEach(([alias, path]) => { const importAlias = alias.replace("@", "#"); const importPath = path.startsWith(".") ? path : `./${path}`; if (!packageJson.imports[importAlias]) { packageJson.imports[importAlias] = importPath; updated = true; } }); if (updated) { await require_init_utils_fileSystem.writeFileToRoot(rootDir, packageJsonPath, JSON.stringify(packageJson, null, 2)); (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Updated ${(0, _intlayer_config_logger.colorizePath)(packageJsonPath)} to include Intlayer imports`); } } } } (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} ${(0, _intlayer_config_logger.colorize)("Intlayer init setup complete.", _intlayer_config_colors.GREEN)}`); (0, _intlayer_config_logger.logger)([ (0, _intlayer_config_logger.colorize)("Next →", _intlayer_config_colors.MAGENTA), (0, _intlayer_config_logger.colorize)(`Follow the instructions in the documentation to complete the setup:`, _intlayer_config_colors.GREY_LIGHT), (0, _intlayer_config_logger.colorizePath)(guideUrl) ]); }; //#endregion exports.initIntlayer = initIntlayer; //# sourceMappingURL=index.cjs.map