@unsetsoft/ryunix-presets 1.0.26-canary.4 → 1.0.26-canary.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/.generated/webpack/bin/compiler.js +5 -0
  2. package/.generated/webpack/bin/dev.server.js +115 -0
  3. package/.generated/webpack/bin/index.js +195 -0
  4. package/.generated/webpack/bin/prerender.js +81 -0
  5. package/.generated/webpack/bin/prod.server.js +356 -0
  6. package/.generated/webpack/config.typetest.js +15 -0
  7. package/.generated/webpack/eslint.config.js +39 -0
  8. package/.generated/webpack/index.js +4 -0
  9. package/.generated/webpack/loaders/ryunix-rsc-loader.js +108 -0
  10. package/.generated/webpack/loaders/ryunix-server-action-loader.js +77 -0
  11. package/.generated/webpack/plugins/remark-github-alerts.js +70 -0
  12. package/{webpack → .generated/webpack}/template/index.html +27 -19
  13. package/.generated/webpack/utils/ApiRouterPlugin.js +130 -0
  14. package/.generated/webpack/utils/apiHandler.js +152 -0
  15. package/.generated/webpack/utils/appRouterPlugin.js +651 -0
  16. package/.generated/webpack/utils/config.cjs +262 -0
  17. package/{webpack → .generated/webpack}/utils/envExist.cjs +14 -14
  18. package/.generated/webpack/utils/index.js +169 -0
  19. package/.generated/webpack/utils/settingfile.cjs +60 -0
  20. package/.generated/webpack/utils/ssg.js +760 -0
  21. package/.generated/webpack/utils/ssgPlugin.js +503 -0
  22. package/.generated/webpack/utils/ssgStaticParams.js +135 -0
  23. package/.generated/webpack/utils/ssrDevHandler.js +111 -0
  24. package/.generated/webpack/utils/styleConfig.cjs +90 -0
  25. package/.generated/webpack/utils/styleConfig.js +66 -0
  26. package/.generated/webpack/utils/styleFonts.cjs +169 -0
  27. package/.generated/webpack/webpack.config.js +849 -0
  28. package/README.es.md +126 -0
  29. package/README.md +133 -0
  30. package/package.json +61 -38
  31. package/webpack/config.d.ts +249 -85
  32. package/webpack/utils/config.cjs.d.ts +35 -0
  33. package/rspack/index.js +0 -92
  34. package/vite/index.js +0 -18
  35. package/webpack/bin/compiler.mjs +0 -6
  36. package/webpack/bin/dev.server.mjs +0 -115
  37. package/webpack/bin/index.mjs +0 -184
  38. package/webpack/bin/prerender.mjs +0 -54
  39. package/webpack/bin/prod.server.mjs +0 -407
  40. package/webpack/eslint.config.mjs +0 -43
  41. package/webpack/index.js +0 -6
  42. package/webpack/utils/ApiRouterPlugin.mjs +0 -140
  43. package/webpack/utils/apiHandler.mjs +0 -150
  44. package/webpack/utils/appRouterPlugin.mjs +0 -486
  45. package/webpack/utils/config.cjs +0 -173
  46. package/webpack/utils/index.mjs +0 -205
  47. package/webpack/utils/settingfile.cjs +0 -33
  48. package/webpack/utils/ssg.mjs +0 -371
  49. package/webpack/utils/ssgPlugin.mjs +0 -602
  50. package/webpack/webpack.config.mjs +0 -376
@@ -0,0 +1,5 @@
1
+ import webpack from 'webpack';
2
+ import webpackConfig from '../webpack.config.js';
3
+ webpackConfig.mode = 'production';
4
+ const compiler = webpack(webpackConfig);
5
+ export { compiler };
@@ -0,0 +1,115 @@
1
+ import Webpack from 'webpack';
2
+ import WebpackDevServer from 'webpack-dev-server';
3
+ import webpackConfig from '../webpack.config.js';
4
+ import { configFileExist } from '../utils/settingfile.cjs';
5
+ import envPath from '../utils/envExist.cjs';
6
+ import { getPackageVersion, resolveApp, cleanCacheDir } from '../utils/index.js';
7
+ import logger from 'terminal-log';
8
+ import chalk from 'chalk';
9
+ import net from 'net'; // Para verificar si el puerto está disponible
10
+ import boxen from 'boxen';
11
+ import defaultSettings from '../utils/config.cjs';
12
+ const checkPortInUse = (port) => {
13
+ return new Promise((resolve, reject) => {
14
+ const server = net.createServer();
15
+ server.once('error', (err) => {
16
+ if (err.code === 'EADDRINUSE') {
17
+ resolve(true); // Puerto en uso
18
+ }
19
+ else {
20
+ reject(err);
21
+ }
22
+ });
23
+ server.once('listening', () => {
24
+ server.close();
25
+ resolve(false); // Puerto libre
26
+ });
27
+ server.listen(port);
28
+ });
29
+ };
30
+ const findAvailablePort = async (port) => {
31
+ let isPortInUse = await checkPortInUse(port);
32
+ while (isPortInUse) {
33
+ logger.warn(chalk.yellow(`Port ${port} is in use, trying port ${port + 1}...`));
34
+ port += 1;
35
+ isPortInUse = await checkPortInUse(port);
36
+ }
37
+ return port;
38
+ };
39
+ const StartServer = async (cliSettings) => {
40
+ const cacheDir = resolveApp(process.cwd(), `${defaultSettings.buildDir}/cache`);
41
+ const mode = cliSettings.production || defaultSettings.webpack.production ? true : false;
42
+ if (!mode) {
43
+ cleanCacheDir(cacheDir);
44
+ }
45
+ const configs = webpackConfig;
46
+ const clientConfig = Array.isArray(configs)
47
+ ? configs.find((c) => c.name === 'client') || configs[0]
48
+ : configs;
49
+ if (Array.isArray(configs)) {
50
+ configs.forEach((c) => {
51
+ c.mode = mode ? 'production' : 'development';
52
+ });
53
+ }
54
+ else {
55
+ configs.mode = mode ? 'production' : 'development';
56
+ }
57
+ const compiler = Array.isArray(configs)
58
+ ? Webpack(configs)
59
+ : Webpack(configs);
60
+ const clientDevServer = clientConfig.devServer;
61
+ let port = clientDevServer?.port || 3000;
62
+ // Encontrar un puerto disponible
63
+ port = await findAvailablePort(port);
64
+ // Modificamos el puerto en la configuración
65
+ if (clientDevServer) {
66
+ clientDevServer.port = port;
67
+ }
68
+ const devServerOptions = { ...(clientDevServer || {}), ...cliSettings };
69
+ const server = new WebpackDevServer(devServerOptions, compiler);
70
+ const devMode = Boolean(!mode);
71
+ const { version } = await getPackageVersion();
72
+ const startServer = async () => {
73
+ try {
74
+ await server.start(); // Iniciar el servidor con el nuevo puerto
75
+ const url = `http://localhost:${port}`;
76
+ const cfgStatus = configFileExist()
77
+ ? chalk.green('✔ Loaded')
78
+ : chalk.red('✘ Not found');
79
+ const envStatus = envPath()
80
+ ? chalk.green('✔ Loaded')
81
+ : chalk.yellow('✘ Not found');
82
+ const modeLabel = mode
83
+ ? chalk.bold(chalk.magenta('production'))
84
+ : chalk.bold(chalk.cyan('development'));
85
+ const { version } = await getPackageVersion();
86
+ const content = [
87
+ `${chalk.bold(chalk.cyanBright('<Ryunix/>'))} ${chalk.gray(`v${version}`)}`,
88
+ '',
89
+ `${chalk.white('Ready at:')} ${chalk.underline(chalk.cyan(url))}`,
90
+ `${chalk.white('Config:')} ${cfgStatus}`,
91
+ `${chalk.white('Env:')} ${envStatus}`,
92
+ `${chalk.white('Mode:')} ${modeLabel}`,
93
+ ];
94
+ if (devMode) {
95
+ content.push('');
96
+ content.push(`${chalk.yellow('⚠️')} ${chalk.yellow('Development mode active')}`);
97
+ content.push(chalk.gray('Build for production to optimize performance'));
98
+ }
99
+ console.log(boxen(content.join('\n'), {
100
+ padding: 1,
101
+ margin: 1,
102
+ borderStyle: 'round',
103
+ borderColor: 'cyan',
104
+ title: chalk.bold('Dev Server'),
105
+ titleAlignment: 'center',
106
+ minimumWidth: 50,
107
+ }));
108
+ }
109
+ catch (err) {
110
+ logger.error(`[error] ${err.message}`);
111
+ }
112
+ };
113
+ await startServer();
114
+ };
115
+ export { StartServer as StartDevServer };
@@ -0,0 +1,195 @@
1
+ #! /usr/bin/env node
2
+ import yargs from 'yargs';
3
+ const hideBin = (argv) => argv.slice(2);
4
+ import { StartDevServer } from './dev.server.js';
5
+ import { compiler } from './compiler.js';
6
+ import logger from 'terminal-log';
7
+ import chalk from 'chalk';
8
+ import boxen from 'boxen';
9
+ import defaultSettings from '../utils/config.cjs';
10
+ import Prerender from './prerender.js';
11
+ import { resolveApp, getPackageVersion, } from '../utils/index.js';
12
+ import { ESLint } from 'eslint';
13
+ import eslintConfig from '../eslint.config.js';
14
+ import fs from 'fs';
15
+ import { fileURLToPath } from 'url';
16
+ import { dirname, join } from 'path';
17
+ import server from './prod.server.js';
18
+ import config from '../utils/config.cjs';
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = dirname(__filename);
21
+ const lint = {
22
+ command: 'lint',
23
+ describe: 'Lint code',
24
+ builder: {
25
+ fix: {
26
+ alias: 'f',
27
+ type: 'boolean',
28
+ default: false,
29
+ describe: 'Automatically fix problems',
30
+ },
31
+ },
32
+ handler: async (arg) => {
33
+ const classicConfig = eslintConfig[0];
34
+ const fix = arg.fix;
35
+ const eslint = new ESLint({
36
+ cwd: process.cwd(),
37
+ overrideConfigFile: true,
38
+ overrideConfig: classicConfig,
39
+ fix,
40
+ });
41
+ const results = await eslint.lintFiles(defaultSettings.eslint.files);
42
+ await ESLint.outputFixes(results);
43
+ const formatter = await eslint.loadFormatter('stylish');
44
+ const report = formatter.format(results);
45
+ console.log(report);
46
+ },
47
+ };
48
+ const dev = {
49
+ command: 'dev',
50
+ describe: 'Run server for developer mode.',
51
+ handler: async (arg) => {
52
+ process.env.RYUNIX_MODE = 'development';
53
+ const open = Boolean(arg.browser) || false;
54
+ const settings = {
55
+ open,
56
+ };
57
+ // add message to say the server is starting with chalk
58
+ console.log(chalk.cyan('Starting development server, please wait...'));
59
+ console.log(`${chalk.cyan('○')} Compiler: ${chalk.bold(config.compiler.toUpperCase())}`);
60
+ try {
61
+ await StartDevServer(settings);
62
+ }
63
+ catch (error) {
64
+ logger.error(chalk.red('Error starting development server:'), error);
65
+ process.exit(1);
66
+ }
67
+ },
68
+ };
69
+ const prod = {
70
+ command: 'start',
71
+ describe: 'Run server for production mode. Requiere .ryunix/static',
72
+ handler: async (arg) => {
73
+ process.env.RYUNIX_MODE = 'production';
74
+ if (!fs.existsSync(join(process.cwd(), config.buildDir, 'static'))) {
75
+ logger.error('You need build first!');
76
+ return;
77
+ }
78
+ const { version } = await getPackageVersion();
79
+ server.listen(config.port, () => {
80
+ const content = [
81
+ `${chalk.bold(chalk.cyanBright('<Ryunix/>'))} ${chalk.gray(`v${version}`)}`,
82
+ '',
83
+ `${chalk.white('Ready at:')} ${chalk.underline(chalk.cyan(`http://localhost:${config.port}/`))}`,
84
+ `${chalk.white('Mode:')} ${chalk.bold(chalk.magenta('production'))}`,
85
+ ];
86
+ console.log(boxen(content.join('\n'), {
87
+ padding: 1,
88
+ margin: 1,
89
+ borderStyle: 'round',
90
+ borderColor: 'magenta',
91
+ title: chalk.bold('Production Server'),
92
+ titleAlignment: 'center',
93
+ minimumWidth: 50,
94
+ }));
95
+ });
96
+ },
97
+ };
98
+ const build = {
99
+ command: 'build',
100
+ describe: 'Run builder',
101
+ handler: async (arg) => {
102
+ process.env.RYUNIX_MODE = 'production';
103
+ // ── Clean build output before each production build ───────────────────
104
+ // Clears static/ and server/ (except server/api/) but keeps cache/ intact.
105
+ const buildRoot = resolveApp(process.cwd(), defaultSettings.buildDir);
106
+ const clean = (dir) => {
107
+ if (fs.existsSync(dir)) {
108
+ fs.rmSync(dir, { recursive: true, force: true });
109
+ }
110
+ };
111
+ clean(join(buildRoot, 'static'));
112
+ clean(join(buildRoot, 'server', 'app'));
113
+ clean(join(buildRoot, 'server', 'app-router-server.bundle.js'));
114
+ // Note: server/api/ is cleaned by ApiRouterPlugin on its own (incremental recompile)
115
+ console.log(`${chalk.cyan('○')} Compiling using ${chalk.bold(config.compiler.toUpperCase())}...`);
116
+ const buildStart = Date.now();
117
+ compiler.run(async (err, stats) => {
118
+ if (err || stats.hasErrors()) {
119
+ logger.error(chalk.red('✘ Error during compilation:'));
120
+ if (err) {
121
+ logger.error(err);
122
+ }
123
+ else {
124
+ // MultiStats or Stats — toString works on both
125
+ const output = stats.toString('errors-only');
126
+ const lines = output.split('\n').filter(Boolean);
127
+ lines.forEach((line) => logger.error(line));
128
+ }
129
+ compiler.close(() => process.exit(1));
130
+ return;
131
+ }
132
+ // ── Build time ─────────────────────────────────────────────────────────
133
+ const buildTimeMs = Date.now() - buildStart;
134
+ const minutes = Math.floor(buildTimeMs / 60000);
135
+ const seconds = ((buildTimeMs % 60000) / 1000).toFixed(1);
136
+ const formattedTime = minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
137
+ // ── SSG Prerender ──────────────────────────────────────────────────────
138
+ if (defaultSettings.webpack.production) {
139
+ await Prerender(defaultSettings.buildDir);
140
+ }
141
+ // ── API Routes log ─────────────────────────────────────────────────────
142
+ const apiOutputDir = join(buildRoot, 'server', 'api');
143
+ if (fs.existsSync(apiOutputDir)) {
144
+ const collectRoutes = (dir, base = '') => {
145
+ const routes = [];
146
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
147
+ const fullPath = join(dir, entry.name);
148
+ if (entry.isDirectory()) {
149
+ routes.push(...collectRoutes(fullPath, `${base}/${entry.name}`));
150
+ }
151
+ else if (/^(route|router|endpoint)\.(mjs|js)$/.test(entry.name)) {
152
+ routes.push(base || '/');
153
+ }
154
+ }
155
+ return routes;
156
+ };
157
+ const apiRoutes = collectRoutes(apiOutputDir);
158
+ if (apiRoutes.length > 0) {
159
+ console.log(`${chalk.cyan('○')} API routes (${chalk.bold(apiRoutes.length)}):`);
160
+ apiRoutes.forEach((r) => console.log(` ${chalk.green('✔')} ${chalk.gray(`/api${r}`)}`));
161
+ console.log('');
162
+ }
163
+ }
164
+ logger.info(`${chalk.green('✔')} ${chalk.bold('Compilation successful! 🎉')}`);
165
+ logger.info(`${chalk.gray('Done in')} ${chalk.bold(formattedTime)}`);
166
+ compiler.close((closeErr) => {
167
+ if (closeErr) {
168
+ logger.error(chalk.red('Error closing the compiler:'), closeErr);
169
+ }
170
+ process.exit(0);
171
+ });
172
+ });
173
+ },
174
+ };
175
+ const extractHTML = {
176
+ command: 'customHtml',
177
+ describe: 'Extract HTML for customization',
178
+ handler: async (arg) => {
179
+ const runPath = process.cwd();
180
+ fs.copyFile(join(__dirname, '..', 'template/index.html'), join(runPath, 'public/index.html'), (err) => {
181
+ if (err) {
182
+ console.error('Error extracting HTML: ', err.message);
183
+ return;
184
+ }
185
+ console.log('File extracted successfully. Now you can enable the template with legacy.template inside ryunix.config.js');
186
+ });
187
+ },
188
+ };
189
+ yargs(hideBin(process.argv))
190
+ .command(dev)
191
+ .command(build)
192
+ .command(prod)
193
+ .command(lint)
194
+ .command(extractHTML)
195
+ .parse();
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Automatic Prerender - reads routes from manifest
3
+ */
4
+ import { buildSSG } from '../utils/ssg.js';
5
+ import { configFileExist } from '../utils/settingfile.cjs';
6
+ import defaultSettings from '../utils/config.cjs';
7
+ import { resolveApp } from '../utils/index.js';
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ const loadResolvedSSGRoutes = async (buildDirectory) => {
11
+ const serverBundleCandidates = [
12
+ path.join(buildDirectory, 'server', 'app-router-server.bundle.js'),
13
+ path.join(buildDirectory, 'server', 'app-router-server.bundle.mjs'),
14
+ ];
15
+ const serverBundlePath = serverBundleCandidates.find((candidate) => fs.existsSync(candidate));
16
+ if (!serverBundlePath)
17
+ return null;
18
+ try {
19
+ const serverModule = await import(`file://${serverBundlePath}?update=${Date.now()}`);
20
+ if (typeof serverModule.resolveSSGPaths === 'function') {
21
+ return await serverModule.resolveSSGPaths();
22
+ }
23
+ }
24
+ catch (error) {
25
+ console.warn('[SSG] Could not resolve dynamic routes from server bundle:', error.message);
26
+ }
27
+ return null;
28
+ };
29
+ const normalizeManifestRoutes = (routes) => routes
30
+ .filter((route) => route && route.path && !route.path.includes(':'))
31
+ .map((route) => ({
32
+ path: route.path,
33
+ meta: route.meta || {},
34
+ }));
35
+ const Prerender = async (directory) => {
36
+ const buildDirectory = resolveApp(process.cwd(), directory);
37
+ if (!configFileExist()) {
38
+ console.error('❌ No configuration file found.');
39
+ process.exit(1);
40
+ }
41
+ const manifestPath = path.join(process.cwd(), directory, 'cache/ssg', 'routes.json');
42
+ let routes = [];
43
+ if (fs.existsSync(manifestPath)) {
44
+ try {
45
+ routes = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
46
+ }
47
+ catch (error) {
48
+ console.error('[SSG] Error reading routes manifest:', error);
49
+ }
50
+ }
51
+ const resolvedRoutes = await loadResolvedSSGRoutes(buildDirectory);
52
+ if (resolvedRoutes) {
53
+ routes = resolvedRoutes;
54
+ if (defaultSettings.debug) {
55
+ console.log(`[SSG] Resolved ${routes.length} routes via generateStaticParams`);
56
+ }
57
+ }
58
+ else {
59
+ routes = normalizeManifestRoutes(routes);
60
+ }
61
+ const metaExist = routes.some((route) => route.meta);
62
+ if (metaExist &&
63
+ Object.keys(defaultSettings.legacy.seo.meta || {}).length > 0) {
64
+ console.error('[Ryunix Error] You are mixing static and dynamic meta tags; you can only use one of the two. Remove legacy.seo.meta from ryunix.config.js.');
65
+ process.exit(1);
66
+ }
67
+ if (routes.length === 0) {
68
+ const legacyRoutes = defaultSettings.legacy?.ssg?.prerender || [];
69
+ routes = legacyRoutes.map((route) => typeof route === 'string' ? { path: route, meta: {} } : route);
70
+ if (routes.length > 0) {
71
+ console.log(`[SSG] Using ${routes.length} routes from config`);
72
+ }
73
+ }
74
+ if (routes.length === 0) {
75
+ console.log('[SSG] No routes to prerender, skipping SSG generation.');
76
+ return;
77
+ }
78
+ await buildSSG(routes, defaultSettings, buildDirectory, defaultSettings.debug);
79
+ console.log('✅ SSG build complete');
80
+ };
81
+ export default Prerender;