mirror of
				https://github.com/strapi/strapi.git
				synced 2025-10-31 01:47:13 +00:00 
			
		
		
		
	chore: move commands from admin back to strapi/strapi
This commit is contained in:
		
							parent
							
								
									da439790ee
								
							
						
					
					
						commit
						3124f474fe
					
				| @ -1,37 +0,0 @@ | |||||||
| import { build as nodeBuild, BuildOptions } from '../../node/build'; |  | ||||||
| import { handleUnexpectedError } from '../../node/core/errors'; |  | ||||||
| 
 |  | ||||||
| interface BuildCLIOptions extends BuildOptions { |  | ||||||
|   /** |  | ||||||
|    * @deprecated use `minify` instead |  | ||||||
|    */ |  | ||||||
|   optimization?: boolean; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const build = async (options: BuildCLIOptions) => { |  | ||||||
|   try { |  | ||||||
|     if (typeof process.env.STRAPI_ENFORCE_SOURCEMAPS !== 'undefined') { |  | ||||||
|       options.logger.warn( |  | ||||||
|         "[@strapi/strapi]: STRAPI_ENFORCE_SOURCEMAPS is now deprecated. You can enable sourcemaps by passing '--sourcemaps' to the build command." |  | ||||||
|       ); |  | ||||||
|     } |  | ||||||
|     if (typeof options.optimization !== 'undefined' && options.optimization !== true) { |  | ||||||
|       options.logger.warn( |  | ||||||
|         "[@strapi/strapi]: The optimization argument is now deprecated. Use '--minify' instead." |  | ||||||
|       ); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const envSourceMaps = process.env.STRAPI_ENFORCE_SOURCEMAPS === 'true'; |  | ||||||
| 
 |  | ||||||
|     await nodeBuild({ |  | ||||||
|       ...options, |  | ||||||
|       minify: options.optimization ?? options.minify, |  | ||||||
|       sourcemaps: options.sourcemaps || envSourceMaps, |  | ||||||
|     }); |  | ||||||
|   } catch (err) { |  | ||||||
|     handleUnexpectedError(err); |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export { build }; |  | ||||||
| export type { BuildCLIOptions }; |  | ||||||
| @ -1,29 +0,0 @@ | |||||||
| import { develop as nodeDevelop, DevelopOptions } from '../../node/develop'; |  | ||||||
| import { handleUnexpectedError } from '../../node/core/errors'; |  | ||||||
| 
 |  | ||||||
| interface DevelopCLIOptions extends DevelopOptions { |  | ||||||
|   /** |  | ||||||
|    * @deprecated |  | ||||||
|    */ |  | ||||||
|   browser?: boolean; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const develop = async (options: DevelopCLIOptions) => { |  | ||||||
|   try { |  | ||||||
|     if (typeof options.browser !== 'undefined') { |  | ||||||
|       options.logger.warn( |  | ||||||
|         "[@strapi/strapi]: The browser argument, this is now deprecated. Use '--open' instead." |  | ||||||
|       ); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     await nodeDevelop({ |  | ||||||
|       ...options, |  | ||||||
|       open: options.browser ?? options.open, |  | ||||||
|     }); |  | ||||||
|   } catch (err) { |  | ||||||
|     handleUnexpectedError(err); |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export { develop }; |  | ||||||
| export type { DevelopCLIOptions }; |  | ||||||
| @ -1,56 +0,0 @@ | |||||||
| import type { StrapiCommand } from '@strapi/strapi'; |  | ||||||
| import type { BuildCLIOptions } from './commands/build'; |  | ||||||
| import type { DevelopCLIOptions } from './commands/develop'; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * `$ strapi build` |  | ||||||
|  */ |  | ||||||
| const build: StrapiCommand = ({ command, ctx }) => { |  | ||||||
|   command |  | ||||||
|     .command('build') |  | ||||||
|     .option('-d, --debug', 'Enable debugging mode with verbose logs', false) |  | ||||||
|     .option('--ignore-prompts', 'Ignore all prompts', false) |  | ||||||
|     .option('--minify', 'Minify the output', true) |  | ||||||
|     .option('--no-optimization', '[deprecated]: use minify instead') |  | ||||||
|     .option('--silent', "Don't log anything", false) |  | ||||||
|     .option('--sourcemap', 'Produce sourcemaps', false) |  | ||||||
|     .option('--stats', 'Print build statistics to the console', false) |  | ||||||
|     .description('Build the strapi admin app') |  | ||||||
|     .action(async (options: BuildCLIOptions) => { |  | ||||||
|       const { build } = await import('./commands/build'); |  | ||||||
| 
 |  | ||||||
|       return build({ ...options, ...ctx }); |  | ||||||
|     }); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * `$ strapi develop` |  | ||||||
|  */ |  | ||||||
| const develop: StrapiCommand = ({ command, ctx }) => { |  | ||||||
|   command |  | ||||||
|     .command('develop') |  | ||||||
|     .alias('dev') |  | ||||||
|     .option('-d, --debug', 'Enable debugging mode with verbose logs', false) |  | ||||||
|     .option('--silent', "Don't log anything", false) |  | ||||||
|     .option('--ignore-prompts', 'Ignore all prompts', false) |  | ||||||
|     .option('--polling', 'Watch for file changes in network directories', false) |  | ||||||
|     .option('--watch-admin', 'Watch the admin panel for hot changes', false) |  | ||||||
|     .option( |  | ||||||
|       '--no-build', |  | ||||||
|       '[deprecated]: there is middleware for the server, it is no longer a separate process' |  | ||||||
|     ) |  | ||||||
|     .option( |  | ||||||
|       '--watch-admin', |  | ||||||
|       '[deprecated]: there is now middleware for watching, it is no longer a separate process' |  | ||||||
|     ) |  | ||||||
|     .option('--browser <name>', '[deprecated]: use open instead') |  | ||||||
|     .option('--open', 'Open the admin in your browser', true) |  | ||||||
|     .description('Start your Strapi application in development mode') |  | ||||||
|     .action(async (options: DevelopCLIOptions) => { |  | ||||||
|       const { develop } = await import('./commands/develop'); |  | ||||||
| 
 |  | ||||||
|       return develop({ ...options, ...ctx }); |  | ||||||
|     }); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export const commands = [build, develop]; |  | ||||||
| @ -1,4 +1 @@ | |||||||
| export { commands } from './cli'; | export { DefaultDocument } from '../admin/src/components/DefaultDocument'; | ||||||
| 
 |  | ||||||
| export * from './node/build'; |  | ||||||
| export * from './node/develop'; |  | ||||||
|  | |||||||
| @ -1,4 +1,3 @@ | |||||||
| export * from './components/DefaultDocument'; |  | ||||||
| export * from './render'; | export * from './render'; | ||||||
| 
 | 
 | ||||||
| export type { Store } from './core/store/configure'; | export type { Store } from './core/store/configure'; | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								packages/core/admin/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								packages/core/admin/index.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -1,22 +0,0 @@ | |||||||
| interface BuildArgs { |  | ||||||
|   optimize?: boolean; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| declare const build: (args: BuildArgs) => Promise<void>; |  | ||||||
| 
 |  | ||||||
| interface CleanArgs { |  | ||||||
|   appDir: string; |  | ||||||
|   buildDestDir: string; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| declare const clean: (args: CleanArgs) => Promise<void>; |  | ||||||
| 
 |  | ||||||
| interface WatchAdminArgs { |  | ||||||
|   browser?: string | boolean; |  | ||||||
|   open?: boolean; |  | ||||||
|   polling?: boolean; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| declare const watchAdmin: (args: WatchAdminArgs) => Promise<void>; |  | ||||||
| 
 |  | ||||||
| export { build, BuildArgs, clean, CleanArgs, watchAdmin, WatchAdminArgs }; |  | ||||||
| @ -1,255 +0,0 @@ | |||||||
| 'use strict'; |  | ||||||
| 
 |  | ||||||
| const path = require('path'); |  | ||||||
| const fs = require('fs/promises'); |  | ||||||
| const os = require('os'); |  | ||||||
| const chalk = require('chalk'); |  | ||||||
| const ora = require('ora'); |  | ||||||
| const ts = require('typescript'); |  | ||||||
| const { strapiFactory } = require('@strapi/strapi'); |  | ||||||
| const { build: nodeBuild, develop: nodeDevelop } = require('./dist/cli'); |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * @typedef {Object} BuildArgs |  | ||||||
|  * @property {boolean} optimize |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * @deprecated From V5 we will not be exporting build functions from the root export of the admin package. |  | ||||||
|  * |  | ||||||
|  * @type {(args: BuildArgs) => Promise<void>} |  | ||||||
|  */ |  | ||||||
| async function build({ optimize }) { |  | ||||||
|   console.warn( |  | ||||||
|     "[@strapi/admin]: the build api exported from this package is now deprecated. We don't plan to expose this for public consumption and this will be removed in V5." |  | ||||||
|   ); |  | ||||||
| 
 |  | ||||||
|   const enforceSourceMaps = process.env.STRAPI_ENFORCE_SOURCEMAPS === 'true' ?? false; |  | ||||||
| 
 |  | ||||||
|   const cwd = process.cwd(); |  | ||||||
|   const logger = createLogger({ debug: true, silent: false, timestamp: false }); |  | ||||||
| 
 |  | ||||||
|   const tsconfig = loadTsConfig({ |  | ||||||
|     cwd, |  | ||||||
|     path: 'tsconfig.json', |  | ||||||
|     logger, |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   const distDir = tsconfig?.config.options.outDir ?? ''; |  | ||||||
| 
 |  | ||||||
|   const strapiInstance = strapiFactory({ |  | ||||||
|     // Directories
 |  | ||||||
|     appDir: cwd, |  | ||||||
|     distDir, |  | ||||||
|     // Options
 |  | ||||||
|     autoReload: true, |  | ||||||
|     serveAdminPanel: false, |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   await nodeBuild({ |  | ||||||
|     cwd, |  | ||||||
|     logger, |  | ||||||
|     minify: optimize, |  | ||||||
|     sourcemaps: enforceSourceMaps, |  | ||||||
|     strapi: strapiInstance, |  | ||||||
|     tsconfig, |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * @typedef {Object} CleanArgs |  | ||||||
|  * @property {string} appDir |  | ||||||
|  * @property {string} buildDestDir |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * @deprecated From V5 we will not be exporting clean functions from the root export of the admin package. |  | ||||||
|  * |  | ||||||
|  * @type {(args: CleanArgs) => Promise<void>} |  | ||||||
|  */ |  | ||||||
| async function clean({ appDir, buildDestDir }) { |  | ||||||
|   console.warn( |  | ||||||
|     "[@strapi/admin]: the clean api exported from this package is now deprecated. We don't plan to expose this for public consumption and this will be removed in V5." |  | ||||||
|   ); |  | ||||||
| 
 |  | ||||||
|   const DIRECTORIES = [ |  | ||||||
|     path.join(buildDestDir, 'build'), |  | ||||||
|     path.join(appDir, '.cache'), |  | ||||||
|     path.join(appDir, '.strapi'), |  | ||||||
|   ]; |  | ||||||
| 
 |  | ||||||
|   await Promise.all(DIRECTORIES.map((dir) => fs.rmdir(dir, { recursive: true, force: true }))); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * @typedef {Object} WatchArgs |  | ||||||
|  * @property {boolean} browser |  | ||||||
|  * @property {boolean} open |  | ||||||
|  * @property {boolean} polling |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * @deprecated From V5 we will not be exporting watch functions from the root export of the admin package. |  | ||||||
|  * |  | ||||||
|  * @type {(args: WatchArgs) => Promise<void>} |  | ||||||
|  */ |  | ||||||
| async function watchAdmin({ browser, open, polling }) { |  | ||||||
|   console.warn( |  | ||||||
|     [ |  | ||||||
|       "[@strapi/admin]: the watchAdmin api exported from this package is now deprecated. We don't plan to expose this for public consumption and this will be removed in V5.", |  | ||||||
|       "This command is no longer necessary, the admin's dev server is now injected as a middleware to the strapi server. This is why we're about to start a strapi instance for you.", |  | ||||||
|     ].join(os.EOL) |  | ||||||
|   ); |  | ||||||
| 
 |  | ||||||
|   const cwd = process.cwd(); |  | ||||||
|   const logger = createLogger({ debug: true, silent: false, timestamp: false }); |  | ||||||
| 
 |  | ||||||
|   const tsconfig = loadTsConfig({ |  | ||||||
|     cwd, |  | ||||||
|     path: 'tsconfig.json', |  | ||||||
|     logger, |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   const distDir = tsconfig?.config.options.outDir ?? ''; |  | ||||||
| 
 |  | ||||||
|   const strapiInstance = strapi({ |  | ||||||
|     // Directories
 |  | ||||||
|     appDir: cwd, |  | ||||||
|     distDir, |  | ||||||
|     // Options
 |  | ||||||
|     autoReload: true, |  | ||||||
|     serveAdminPanel: false, |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   await nodeDevelop({ |  | ||||||
|     cwd, |  | ||||||
|     logger, |  | ||||||
|     browser, |  | ||||||
|     open, |  | ||||||
|     polling, |  | ||||||
|     strapi: strapiInstance, |  | ||||||
|     tsconfig, |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * @internal |  | ||||||
|  */ |  | ||||||
| const createLogger = (options = {}) => { |  | ||||||
|   const { silent = false, debug = false, timestamp = true } = options; |  | ||||||
| 
 |  | ||||||
|   const state = { errors: 0, warning: 0 }; |  | ||||||
| 
 |  | ||||||
|   return { |  | ||||||
|     get warnings() { |  | ||||||
|       return state.warning; |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     get errors() { |  | ||||||
|       return state.errors; |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     debug(...args) { |  | ||||||
|       if (silent || !debug) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       console.log( |  | ||||||
|         chalk.cyan(`[DEBUG]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), |  | ||||||
|         ...args |  | ||||||
|       ); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     info(...args) { |  | ||||||
|       if (silent) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       console.info( |  | ||||||
|         chalk.blue(`[INFO]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), |  | ||||||
|         ...args |  | ||||||
|       ); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     log(...args) { |  | ||||||
|       if (silent) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       console.info(chalk.blue(`${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     warn(...args) { |  | ||||||
|       state.warning += 1; |  | ||||||
| 
 |  | ||||||
|       if (silent) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       console.warn( |  | ||||||
|         chalk.yellow(`[WARN]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), |  | ||||||
|         ...args |  | ||||||
|       ); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     error(...args) { |  | ||||||
|       state.errors += 1; |  | ||||||
| 
 |  | ||||||
|       if (silent) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       console.error( |  | ||||||
|         chalk.red(`[ERROR]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), |  | ||||||
|         ...args |  | ||||||
|       ); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     spinner(text) { |  | ||||||
|       if (silent) { |  | ||||||
|         return { |  | ||||||
|           succeed() { |  | ||||||
|             return this; |  | ||||||
|           }, |  | ||||||
|           fail() { |  | ||||||
|             return this; |  | ||||||
|           }, |  | ||||||
|           start() { |  | ||||||
|             return this; |  | ||||||
|           }, |  | ||||||
|           text: '', |  | ||||||
|         }; |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       return ora(text); |  | ||||||
|     }, |  | ||||||
|   }; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * @internal |  | ||||||
|  */ |  | ||||||
| const loadTsConfig = ({ cwd, path, logger }) => { |  | ||||||
|   const configPath = ts.findConfigFile(cwd, ts.sys.fileExists, path); |  | ||||||
| 
 |  | ||||||
|   if (!configPath) { |  | ||||||
|     return undefined; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   const configFile = ts.readConfigFile(configPath, ts.sys.readFile); |  | ||||||
| 
 |  | ||||||
|   const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, cwd); |  | ||||||
| 
 |  | ||||||
|   logger.debug(`Loaded user TS config:`, os.EOL, parsedConfig); |  | ||||||
| 
 |  | ||||||
|   return { |  | ||||||
|     config: parsedConfig, |  | ||||||
|     path: configPath, |  | ||||||
|   }; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| module.exports = { |  | ||||||
|   clean, |  | ||||||
|   build, |  | ||||||
|   watchAdmin, |  | ||||||
| }; |  | ||||||
| @ -20,12 +20,6 @@ | |||||||
|     } |     } | ||||||
|   ], |   ], | ||||||
|   "exports": { |   "exports": { | ||||||
|     ".": { |  | ||||||
|       "types": "./index.d.ts", |  | ||||||
|       "source": "./index.js", |  | ||||||
|       "require": "./index.js", |  | ||||||
|       "default": "./index.js" |  | ||||||
|     }, |  | ||||||
|     "./strapi-admin": { |     "./strapi-admin": { | ||||||
|       "types": "./dist/admin/src/index.d.ts", |       "types": "./dist/admin/src/index.d.ts", | ||||||
|       "source": "./admin/src/index.ts", |       "source": "./admin/src/index.ts", | ||||||
| @ -33,25 +27,24 @@ | |||||||
|       "require": "./dist/admin/index.js", |       "require": "./dist/admin/index.js", | ||||||
|       "default": "./dist/admin/index.js" |       "default": "./dist/admin/index.js" | ||||||
|     }, |     }, | ||||||
|  |     "./_internal": { | ||||||
|  |       "types": "./dist/_internal/index.d.ts", | ||||||
|  |       "source": "./_internal/index.ts", | ||||||
|  |       "import": "./dist/_internal.mjs", | ||||||
|  |       "require": "./dist/_internal.js", | ||||||
|  |       "default": "./dist/_internal.js" | ||||||
|  |     }, | ||||||
|     "./strapi-server": { |     "./strapi-server": { | ||||||
|       "types": "./dist/server/src/index.d.ts", |       "types": "./dist/server/src/index.d.ts", | ||||||
|       "source": "./server/src/index.js", |       "source": "./server/src/index.js", | ||||||
|       "require": "./strapi-server.js", |       "require": "./strapi-server.js", | ||||||
|       "default": "./strapi-server.js" |       "default": "./strapi-server.js" | ||||||
|     }, |     }, | ||||||
|     "./cli": { |  | ||||||
|       "source": "./_internal/index.ts", |  | ||||||
|       "import": "./dist/cli.mjs", |  | ||||||
|       "require": "./dist/cli.js", |  | ||||||
|       "default": "./dist/cli.js" |  | ||||||
|     }, |  | ||||||
|     "./package.json": "./package.json" |     "./package.json": "./package.json" | ||||||
|   }, |   }, | ||||||
|   "files": [ |   "files": [ | ||||||
|     "dist/", |     "dist/", | ||||||
|     "strapi-server.js", |     "strapi-server.js" | ||||||
|     "index.js", |  | ||||||
|     "index.d.ts" |  | ||||||
|   ], |   ], | ||||||
|   "scripts": { |   "scripts": { | ||||||
|     "build": "pack-up build", |     "build": "pack-up build", | ||||||
| @ -69,7 +62,6 @@ | |||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@casl/ability": "6.5.0", |     "@casl/ability": "6.5.0", | ||||||
|     "@pmmmwh/react-refresh-webpack-plugin": "0.5.10", |  | ||||||
|     "@radix-ui/react-context": "1.0.1", |     "@radix-ui/react-context": "1.0.1", | ||||||
|     "@radix-ui/react-toolbar": "1.0.4", |     "@radix-ui/react-toolbar": "1.0.4", | ||||||
|     "@reduxjs/toolkit": "1.9.7", |     "@reduxjs/toolkit": "1.9.7", | ||||||
| @ -85,28 +77,17 @@ | |||||||
|     "axios": "1.6.0", |     "axios": "1.6.0", | ||||||
|     "bcryptjs": "2.4.3", |     "bcryptjs": "2.4.3", | ||||||
|     "boxen": "5.1.2", |     "boxen": "5.1.2", | ||||||
|     "browserslist": "^4.22.1", |  | ||||||
|     "browserslist-to-esbuild": "1.2.0", |  | ||||||
|     "chalk": "^4.1.2", |     "chalk": "^4.1.2", | ||||||
|     "chokidar": "3.5.3", |  | ||||||
|     "codemirror5": "npm:codemirror@^5.65.11", |     "codemirror5": "npm:codemirror@^5.65.11", | ||||||
|     "cross-env": "^7.0.3", |     "cross-env": "^7.0.3", | ||||||
|     "css-loader": "^6.8.1", |  | ||||||
|     "date-fns": "2.30.0", |     "date-fns": "2.30.0", | ||||||
|     "dotenv": "14.2.0", |  | ||||||
|     "esbuild": "0.19.2", |  | ||||||
|     "esbuild-loader": "^2.21.0", |  | ||||||
|     "esbuild-register": "3.5.0", |  | ||||||
|     "execa": "5.1.1", |     "execa": "5.1.1", | ||||||
|     "fast-deep-equal": "3.1.3", |     "fast-deep-equal": "3.1.3", | ||||||
|     "find-root": "1.1.0", |  | ||||||
|     "fork-ts-checker-webpack-plugin": "8.0.0", |  | ||||||
|     "formik": "2.4.0", |     "formik": "2.4.0", | ||||||
|     "fractional-indexing": "3.2.0", |     "fractional-indexing": "3.2.0", | ||||||
|     "fs-extra": "10.0.0", |     "fs-extra": "10.0.0", | ||||||
|     "highlight.js": "^10.4.1", |     "highlight.js": "^10.4.1", | ||||||
|     "history": "^4.9.0", |     "history": "^4.9.0", | ||||||
|     "html-webpack-plugin": "5.5.0", |  | ||||||
|     "immer": "9.0.19", |     "immer": "9.0.19", | ||||||
|     "inquirer": "8.2.5", |     "inquirer": "8.2.5", | ||||||
|     "invariant": "^2.2.4", |     "invariant": "^2.2.4", | ||||||
| @ -129,14 +110,11 @@ | |||||||
|     "markdown-it-mark": "^3.0.1", |     "markdown-it-mark": "^3.0.1", | ||||||
|     "markdown-it-sub": "^1.0.0", |     "markdown-it-sub": "^1.0.0", | ||||||
|     "markdown-it-sup": "1.0.0", |     "markdown-it-sup": "1.0.0", | ||||||
|     "mini-css-extract-plugin": "2.7.6", |  | ||||||
|     "node-schedule": "2.1.0", |     "node-schedule": "2.1.0", | ||||||
|     "ora": "5.4.1", |     "ora": "5.4.1", | ||||||
|     "outdent": "0.8.0", |  | ||||||
|     "p-map": "4.0.0", |     "p-map": "4.0.0", | ||||||
|     "passport-local": "1.0.0", |     "passport-local": "1.0.0", | ||||||
|     "pluralize": "8.0.0", |     "pluralize": "8.0.0", | ||||||
|     "prettier": "2.8.4", |  | ||||||
|     "prop-types": "^15.8.1", |     "prop-types": "^15.8.1", | ||||||
|     "qs": "6.11.1", |     "qs": "6.11.1", | ||||||
|     "react": "^18.2.0", |     "react": "^18.2.0", | ||||||
| @ -153,8 +131,6 @@ | |||||||
|     "react-router-dom": "5.3.4", |     "react-router-dom": "5.3.4", | ||||||
|     "react-select": "5.7.0", |     "react-select": "5.7.0", | ||||||
|     "react-window": "1.8.8", |     "react-window": "1.8.8", | ||||||
|     "read-pkg-up": "7.0.1", |  | ||||||
|     "resolve-from": "5.0.0", |  | ||||||
|     "rimraf": "3.0.2", |     "rimraf": "3.0.2", | ||||||
|     "sanitize-html": "2.11.0", |     "sanitize-html": "2.11.0", | ||||||
|     "semver": "7.5.4", |     "semver": "7.5.4", | ||||||
| @ -162,20 +138,14 @@ | |||||||
|     "slate": "0.94.1", |     "slate": "0.94.1", | ||||||
|     "slate-history": "0.93.0", |     "slate-history": "0.93.0", | ||||||
|     "slate-react": "0.98.3", |     "slate-react": "0.98.3", | ||||||
|     "style-loader": "3.3.1", |  | ||||||
|     "styled-components": "5.3.3", |     "styled-components": "5.3.3", | ||||||
|     "typescript": "5.3.2", |     "typescript": "5.3.2", | ||||||
|     "webpack": "^5.88.1", |  | ||||||
|     "webpack-bundle-analyzer": "^4.9.0", |  | ||||||
|     "webpack-dev-middleware": "6.1.1", |  | ||||||
|     "webpack-hot-middleware": "2.25.4", |  | ||||||
|     "yup": "0.32.9" |     "yup": "0.32.9" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@strapi/admin-test-utils": "4.15.5", |     "@strapi/admin-test-utils": "4.15.5", | ||||||
|     "@strapi/pack-up": "4.15.5", |     "@strapi/pack-up": "4.15.5", | ||||||
|     "@strapi/plugin-content-manager": "4.15.5", |     "@strapi/plugin-content-manager": "4.15.5", | ||||||
|     "@strapi/strapi": "4.15.5", |  | ||||||
|     "@testing-library/dom": "9.2.0", |     "@testing-library/dom": "9.2.0", | ||||||
|     "@testing-library/react": "14.0.0", |     "@testing-library/react": "14.0.0", | ||||||
|     "@testing-library/user-event": "14.4.3", |     "@testing-library/user-event": "14.4.3", | ||||||
| @ -203,7 +173,6 @@ | |||||||
|   }, |   }, | ||||||
|   "peerDependencies": { |   "peerDependencies": { | ||||||
|     "@strapi/data-transfer": "4.15.5", |     "@strapi/data-transfer": "4.15.5", | ||||||
|     "@strapi/strapi": "^4.3.4", |  | ||||||
|     "react": "^17.0.0 || ^18.0.0", |     "react": "^17.0.0 || ^18.0.0", | ||||||
|     "react-dom": "^17.0.0 || ^18.0.0", |     "react-dom": "^17.0.0 || ^18.0.0", | ||||||
|     "react-router-dom": "^5.2.0", |     "react-router-dom": "^5.2.0", | ||||||
|  | |||||||
| @ -13,9 +13,10 @@ const config: Config = defineConfig({ | |||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       source: './_internal/index.ts', |       source: './_internal/index.ts', | ||||||
|       import: './dist/cli.mjs', |       import: './dist/_internal.mjs', | ||||||
|       require: './dist/cli.js', |       require: './dist/_internal.js', | ||||||
|       runtime: 'node', |       types: './dist/_internal/index.d.ts', | ||||||
|  |       runtime: 'web', | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       source: './server/src/index.ts', |       source: './server/src/index.ts', | ||||||
|  | |||||||
| @ -103,6 +103,7 @@ | |||||||
|     "watch": "pack-up watch" |     "watch": "pack-up watch" | ||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|  |     "@pmmmwh/react-refresh-webpack-plugin": "0.5.10", | ||||||
|     "@strapi/admin": "4.15.5", |     "@strapi/admin": "4.15.5", | ||||||
|     "@strapi/core": "4.15.5", |     "@strapi/core": "4.15.5", | ||||||
|     "@strapi/data-transfer": "4.15.5", |     "@strapi/data-transfer": "4.15.5", | ||||||
| @ -120,17 +121,41 @@ | |||||||
|     "@strapi/typescript-utils": "4.15.5", |     "@strapi/typescript-utils": "4.15.5", | ||||||
|     "@strapi/utils": "4.15.5", |     "@strapi/utils": "4.15.5", | ||||||
|     "boxen": "5.1.2", |     "boxen": "5.1.2", | ||||||
|  |     "browserslist": "^4.22.1", | ||||||
|  |     "browserslist-to-esbuild": "1.2.0", | ||||||
|     "chalk": "4.1.2", |     "chalk": "4.1.2", | ||||||
|  |     "chokidar": "3.5.3", | ||||||
|     "cli-table3": "0.6.2", |     "cli-table3": "0.6.2", | ||||||
|     "commander": "8.3.0", |     "commander": "8.3.0", | ||||||
|     "copyfiles": "2.4.1", |     "copyfiles": "2.4.1", | ||||||
|  |     "css-loader": "^6.8.1", | ||||||
|  |     "dotenv": "14.2.0", | ||||||
|  |     "esbuild": "0.19.2", | ||||||
|  |     "esbuild-loader": "^2.21.0", | ||||||
|  |     "esbuild-register": "3.5.0", | ||||||
|     "execa": "5.1.1", |     "execa": "5.1.1", | ||||||
|  |     "find-root": "1.1.0", | ||||||
|  |     "fork-ts-checker-webpack-plugin": "8.0.0", | ||||||
|     "fs-extra": "10.0.0", |     "fs-extra": "10.0.0", | ||||||
|  |     "html-webpack-plugin": "5.5.0", | ||||||
|     "inquirer": "8.2.5", |     "inquirer": "8.2.5", | ||||||
|     "lodash": "4.17.21", |     "lodash": "4.17.21", | ||||||
|  |     "mini-css-extract-plugin": "2.7.6", | ||||||
|     "ora": "5.4.1", |     "ora": "5.4.1", | ||||||
|  |     "outdent": "0.8.0", | ||||||
|     "pkg-up": "3.1.0", |     "pkg-up": "3.1.0", | ||||||
|  |     "prettier": "2.8.4", | ||||||
|  |     "react": "^18.2.0", | ||||||
|  |     "react-dom": "^18.2.0", | ||||||
|  |     "read-pkg-up": "7.0.1", | ||||||
|  |     "resolve-from": "5.0.0", | ||||||
|  |     "semver": "7.5.4", | ||||||
|  |     "style-loader": "3.3.1", | ||||||
|     "typescript": "5.3.2", |     "typescript": "5.3.2", | ||||||
|  |     "webpack": "^5.88.1", | ||||||
|  |     "webpack-bundle-analyzer": "^4.9.0", | ||||||
|  |     "webpack-dev-middleware": "6.1.1", | ||||||
|  |     "webpack-hot-middleware": "2.25.4", | ||||||
|     "yup": "0.32.9" |     "yup": "0.32.9" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
| @ -141,6 +166,10 @@ | |||||||
|     "eslint-config-custom": "4.15.5", |     "eslint-config-custom": "4.15.5", | ||||||
|     "tsconfig": "4.15.5" |     "tsconfig": "4.15.5" | ||||||
|   }, |   }, | ||||||
|  |   "peerDependencies": { | ||||||
|  |     "react": "^17.0.0 || ^18.0.0", | ||||||
|  |     "react-dom": "^17.0.0 || ^18.0.0" | ||||||
|  |   }, | ||||||
|   "engines": { |   "engines": { | ||||||
|     "node": ">=18.0.0 <=20.x.x", |     "node": ">=18.0.0 <=20.x.x", | ||||||
|     "npm": ">=6.0.0" |     "npm": ">=6.0.0" | ||||||
|  | |||||||
| @ -0,0 +1,20 @@ | |||||||
|  | import { build as nodeBuild, BuildOptions } from '../../../node/build'; | ||||||
|  | import { handleUnexpectedError } from '../../../node/core/errors'; | ||||||
|  | 
 | ||||||
|  | interface BuildCLIOptions extends BuildOptions { | ||||||
|  |   /** | ||||||
|  |    * @deprecated use `minify` instead | ||||||
|  |    */ | ||||||
|  |   optimization?: boolean; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const build = async (options: BuildCLIOptions) => { | ||||||
|  |   try { | ||||||
|  |     await nodeBuild(options); | ||||||
|  |   } catch (err) { | ||||||
|  |     handleUnexpectedError(err); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export default build; | ||||||
|  | export type { BuildCLIOptions }; | ||||||
| @ -0,0 +1,24 @@ | |||||||
|  | import { createCommand } from 'commander'; | ||||||
|  | import type { StrapiCommand } from '../../types'; | ||||||
|  | import type { BuildCLIOptions } from './action'; | ||||||
|  | import action from './action'; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * `$ strapi build` | ||||||
|  |  */ | ||||||
|  | const command: StrapiCommand = ({ ctx }) => { | ||||||
|  |   return createCommand('build') | ||||||
|  |     .option('-d, --debug', 'Enable debugging mode with verbose logs', false) | ||||||
|  |     .option('--ignore-prompts', 'Ignore all prompts', false) | ||||||
|  |     .option('--minify', 'Minify the output', true) | ||||||
|  |     .option('--no-optimization', '[deprecated]: use minify instead') | ||||||
|  |     .option('--silent', "Don't log anything", false) | ||||||
|  |     .option('--sourcemap', 'Produce sourcemaps', false) | ||||||
|  |     .option('--stats', 'Print build statistics to the console', false) | ||||||
|  |     .description('Build the strapi admin app') | ||||||
|  |     .action(async (options: BuildCLIOptions) => { | ||||||
|  |       return action({ ...options, ...ctx }); | ||||||
|  |     }); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export default command; | ||||||
							
								
								
									
										20
									
								
								packages/core/strapi/src/commands/actions/develop/action.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								packages/core/strapi/src/commands/actions/develop/action.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | import { develop as nodeDevelop, DevelopOptions } from '../../../node/develop'; | ||||||
|  | import { handleUnexpectedError } from '../../../node/core/errors'; | ||||||
|  | 
 | ||||||
|  | interface DevelopCLIOptions extends DevelopOptions { | ||||||
|  |   /** | ||||||
|  |    * @deprecated | ||||||
|  |    */ | ||||||
|  |   browser?: boolean; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const develop = async (options: DevelopCLIOptions) => { | ||||||
|  |   try { | ||||||
|  |     await nodeDevelop(options); | ||||||
|  |   } catch (err) { | ||||||
|  |     handleUnexpectedError(err); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export default develop; | ||||||
|  | export type { DevelopCLIOptions }; | ||||||
							
								
								
									
										33
									
								
								packages/core/strapi/src/commands/actions/develop/command.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								packages/core/strapi/src/commands/actions/develop/command.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | import { createCommand } from 'commander'; | ||||||
|  | import type { StrapiCommand } from '../../types'; | ||||||
|  | import type { DevelopCLIOptions } from './action'; | ||||||
|  | import action from './action'; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * `$ strapi develop` | ||||||
|  |  */ | ||||||
|  | const command: StrapiCommand = ({ ctx }) => { | ||||||
|  |   return createCommand('develop') | ||||||
|  |     .alias('dev') | ||||||
|  |     .option('-d, --debug', 'Enable debugging mode with verbose logs', false) | ||||||
|  |     .option('--silent', "Don't log anything", false) | ||||||
|  |     .option('--ignore-prompts', 'Ignore all prompts', false) | ||||||
|  |     .option('--polling', 'Watch for file changes in network directories', false) | ||||||
|  |     .option('--watch-admin', 'Watch the admin panel for hot changes', false) | ||||||
|  |     .option( | ||||||
|  |       '--no-build', | ||||||
|  |       '[deprecated]: there is middleware for the server, it is no longer a separate process' | ||||||
|  |     ) | ||||||
|  |     .option( | ||||||
|  |       '--watch-admin', | ||||||
|  |       '[deprecated]: there is now middleware for watching, it is no longer a separate process' | ||||||
|  |     ) | ||||||
|  |     .option('--browser <name>', '[deprecated]: use open instead') | ||||||
|  |     .option('--open', 'Open the admin in your browser', true) | ||||||
|  |     .description('Start your Strapi application in development mode') | ||||||
|  |     .action(async (options: DevelopCLIOptions) => { | ||||||
|  |       return action({ ...options, ...ctx }); | ||||||
|  |     }); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export default command; | ||||||
| @ -1,14 +0,0 @@ | |||||||
| import { watchAdmin } from '@strapi/admin'; |  | ||||||
| import { CLIContext } from '../../types'; |  | ||||||
| 
 |  | ||||||
| interface WatchAdminOptions extends CLIContext { |  | ||||||
|   browser: boolean; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| export default async ({ browser, logger }: WatchAdminOptions) => { |  | ||||||
|   logger.warn('[@strapi/strapi]: watch-admin is deprecated, please use strapi develop instead'); |  | ||||||
| 
 |  | ||||||
|   await watchAdmin({ |  | ||||||
|     browser, |  | ||||||
|   }); |  | ||||||
| }; |  | ||||||
| @ -1,15 +0,0 @@ | |||||||
| import { createCommand } from 'commander'; |  | ||||||
| import type { StrapiCommand } from '../../types'; |  | ||||||
| import { runAction } from '../../utils/helpers'; |  | ||||||
| import action from './action'; |  | ||||||
| /** |  | ||||||
|  * `$ strapi watch-admin` |  | ||||||
|  */ |  | ||||||
| const command: StrapiCommand = () => { |  | ||||||
|   return createCommand('watch-admin') |  | ||||||
|     .option('--browser <name>', 'Open the browser', true) |  | ||||||
|     .description('Start the admin development server') |  | ||||||
|     .action(runAction('watch-admin', action)); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export default command; |  | ||||||
| @ -21,7 +21,8 @@ import enableTelemetry from './actions/telemetry/enable/command'; | |||||||
| import generateTemplates from './actions/templates/generate/command'; | import generateTemplates from './actions/templates/generate/command'; | ||||||
| import generateTsTypes from './actions/ts/generate-types/command'; | import generateTsTypes from './actions/ts/generate-types/command'; | ||||||
| import versionCommand from './actions/version/command'; | import versionCommand from './actions/version/command'; | ||||||
| import watchAdminCommand from './actions/watch-admin/command'; | import buildCommand from './actions/build-command/command'; | ||||||
|  | import developCommand from './actions/develop/command'; | ||||||
| 
 | 
 | ||||||
| import buildPluginCommand from './actions/plugin/build-command/command'; | import buildPluginCommand from './actions/plugin/build-command/command'; | ||||||
| import watchPluginCommand from './actions/plugin/watch/command'; | import watchPluginCommand from './actions/plugin/watch/command'; | ||||||
| @ -52,7 +53,8 @@ const strapiCommands = [ | |||||||
|   generateTemplates, |   generateTemplates, | ||||||
|   generateTsTypes, |   generateTsTypes, | ||||||
|   versionCommand, |   versionCommand, | ||||||
|   watchAdminCommand, |   buildCommand, | ||||||
|  |   developCommand, | ||||||
|   /** |   /** | ||||||
|    * Plugins |    * Plugins | ||||||
|    */ |    */ | ||||||
| @ -66,10 +68,6 @@ const buildStrapiCommand = async (argv: string[], command = new Command()) => { | |||||||
|     // eslint-disable-next-line @typescript-eslint/no-var-requires
 |     // eslint-disable-next-line @typescript-eslint/no-var-requires
 | ||||||
|     const dtsCommands = require(require.resolve('@strapi/data-transfer')).commands; |     const dtsCommands = require(require.resolve('@strapi/data-transfer')).commands; | ||||||
|     strapiCommands.push(...dtsCommands); |     strapiCommands.push(...dtsCommands); | ||||||
| 
 |  | ||||||
|     // eslint-disable-next-line @typescript-eslint/no-var-requires, node/no-missing-require
 |  | ||||||
|     const adminCommands = require(require.resolve('@strapi/admin/cli')).commands; |  | ||||||
|     strapiCommands.push(...adminCommands); |  | ||||||
|   } catch (e) { |   } catch (e) { | ||||||
|     // noop
 |     // noop
 | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| import type { CLIContext } from '@strapi/strapi'; |  | ||||||
| import * as tsUtils from '@strapi/typescript-utils'; | import * as tsUtils from '@strapi/typescript-utils'; | ||||||
|  | import type { CLIContext } from '../commands/types'; | ||||||
| import { checkRequiredDependencies } from './core/dependencies'; | import { checkRequiredDependencies } from './core/dependencies'; | ||||||
| import { getTimer, prettyTime } from './core/timer'; | import { getTimer, prettyTime } from './core/timer'; | ||||||
| import { createBuildContext } from './createBuildContext'; | import { createBuildContext } from './create-build-context'; | ||||||
| import { writeStaticClientFiles } from './staticFiles'; | import { writeStaticClientFiles } from './staticFiles'; | ||||||
| import { build as buildWebpack } from './webpack/build'; | import { build as buildWebpack } from './webpack/build'; | ||||||
| 
 | 
 | ||||||
| @ -67,6 +67,7 @@ const build = async ({ logger, cwd, tsconfig, ignorePrompts, ...options }: Build | |||||||
|     tsconfig, |     tsconfig, | ||||||
|     options, |     options, | ||||||
|   }); |   }); | ||||||
|  | 
 | ||||||
|   const contextDuration = timer.end('createBuildContext'); |   const contextDuration = timer.end('createBuildContext'); | ||||||
|   contextSpinner.text = `Building build context (${prettyTime(contextDuration)})`; |   contextSpinner.text = `Building build context (${prettyTime(contextDuration)})`; | ||||||
|   contextSpinner.succeed(); |   contextSpinner.succeed(); | ||||||
| @ -1,6 +1,6 @@ | |||||||
| import path from 'node:path'; | import path from 'node:path'; | ||||||
| import { convertSystemPathToModulePath, pathExists } from '../core/files'; | import { convertSystemPathToModulePath, pathExists } from './files'; | ||||||
| import { BuildContext } from '../createBuildContext'; | import type { BaseContext } from '../types'; | ||||||
| 
 | 
 | ||||||
| const ADMIN_APP_FILES = ['app.js', 'app.mjs', 'app.ts', 'app.jsx', 'app.tsx']; | const ADMIN_APP_FILES = ['app.js', 'app.mjs', 'app.ts', 'app.jsx', 'app.tsx']; | ||||||
| 
 | 
 | ||||||
| @ -8,7 +8,7 @@ interface AdminCustomisations { | |||||||
|   config?: { |   config?: { | ||||||
|     locales?: string[]; |     locales?: string[]; | ||||||
|   }; |   }; | ||||||
|   bootstrap?: Function; |   bootstrap?: (...args: any[]) => any; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| interface AppFile { | interface AppFile { | ||||||
| @ -25,7 +25,7 @@ interface AppFile { | |||||||
| const loadUserAppFile = async ({ | const loadUserAppFile = async ({ | ||||||
|   runtimeDir, |   runtimeDir, | ||||||
|   appDir, |   appDir, | ||||||
| }: Pick<BuildContext, 'appDir' | 'runtimeDir'>): Promise<AppFile | undefined> => { | }: Pick<BaseContext, 'appDir' | 'runtimeDir'>): Promise<AppFile | undefined> => { | ||||||
|   for (const file of ADMIN_APP_FILES) { |   for (const file of ADMIN_APP_FILES) { | ||||||
|     const filePath = path.join(appDir, 'src', 'admin', file); |     const filePath = path.join(appDir, 'src', 'admin', file); | ||||||
| 
 | 
 | ||||||
| @ -136,9 +136,9 @@ const checkRequiredDependencies = async ({ | |||||||
|        */ |        */ | ||||||
|       await execa(file, args, { cwd, stdio: 'inherit' }); |       await execa(file, args, { cwd, stdio: 'inherit' }); | ||||||
|       return { didInstall: true }; |       return { didInstall: true }; | ||||||
|     } else { |  | ||||||
|       return { didInstall: false }; |  | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     return { didInstall: false }; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if (review.length) { |   if (review.length) { | ||||||
| @ -51,9 +51,9 @@ const loadFile = async (path: string): Promise<undefined | any> => { | |||||||
| const convertSystemPathToModulePath = (sysPath: string) => { | const convertSystemPathToModulePath = (sysPath: string) => { | ||||||
|   if (process.platform === 'win32') { |   if (process.platform === 'win32') { | ||||||
|     return sysPath.split(path.sep).join(path.posix.sep); |     return sysPath.split(path.sep).join(path.posix.sep); | ||||||
|   } else { |  | ||||||
|     return sysPath; |  | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   return sysPath; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -66,9 +66,9 @@ const convertSystemPathToModulePath = (sysPath: string) => { | |||||||
| const convertModulePathToSystemPath = (modulePath: string) => { | const convertModulePathToSystemPath = (modulePath: string) => { | ||||||
|   if (process.platform === 'win32') { |   if (process.platform === 'win32') { | ||||||
|     return modulePath.split(path.posix.sep).join(path.sep); |     return modulePath.split(path.posix.sep).join(path.sep); | ||||||
|   } else { |  | ||||||
|     return modulePath; |  | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   return modulePath; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export { pathExists, loadFile, convertSystemPathToModulePath, convertModulePathToSystemPath }; | export { pathExists, loadFile, convertSystemPathToModulePath, convertModulePathToSystemPath }; | ||||||
| @ -5,7 +5,7 @@ import camelCase from 'lodash/camelCase'; | |||||||
| import { env } from '@strapi/utils'; | import { env } from '@strapi/utils'; | ||||||
| import { getModule, PackageJson } from './dependencies'; | import { getModule, PackageJson } from './dependencies'; | ||||||
| import { convertModulePathToSystemPath, convertSystemPathToModulePath, loadFile } from './files'; | import { convertModulePathToSystemPath, convertSystemPathToModulePath, loadFile } from './files'; | ||||||
| import { BuildContext } from '../createBuildContext'; | import type { BaseContext } from '../types'; | ||||||
| import { isError } from './errors'; | import { isError } from './errors'; | ||||||
| 
 | 
 | ||||||
| interface LocalPluginMeta { | interface LocalPluginMeta { | ||||||
| @ -75,7 +75,7 @@ const getEnabledPlugins = async ({ | |||||||
|   logger, |   logger, | ||||||
|   runtimeDir, |   runtimeDir, | ||||||
|   strapi, |   strapi, | ||||||
| }: Pick<BuildContext, 'cwd' | 'logger' | 'strapi' | 'runtimeDir'>): Promise< | }: Pick<BaseContext, 'cwd' | 'logger' | 'strapi' | 'runtimeDir'>): Promise< | ||||||
|   Record<string, PluginMeta> |   Record<string, PluginMeta> | ||||||
| > => { | > => { | ||||||
|   const plugins: Record<string, PluginMeta> = {}; |   const plugins: Record<string, PluginMeta> = {}; | ||||||
| @ -31,5 +31,5 @@ export function getTimer(): TimeMeasurer { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export const prettyTime = (timeInMs: number): string => { | export const prettyTime = (timeInMs: number): string => { | ||||||
|   return Math.ceil(timeInMs) + 'ms'; |   return `${Math.ceil(timeInMs)}ms`; | ||||||
| }; | }; | ||||||
| @ -2,79 +2,36 @@ import os from 'node:os'; | |||||||
| import path from 'node:path'; | import path from 'node:path'; | ||||||
| import fs from 'node:fs/promises'; | import fs from 'node:fs/promises'; | ||||||
| import browserslist from 'browserslist'; | import browserslist from 'browserslist'; | ||||||
| import { strapiFactory, CLIContext } from '@strapi/strapi'; | import { strapiFactory } from '@strapi/core'; | ||||||
| import { getConfigUrls } from '@strapi/utils'; | import { getConfigUrls } from '@strapi/utils'; | ||||||
|  | import { Strapi } from '@strapi/types'; | ||||||
| 
 | 
 | ||||||
|  | import type { CLIContext } from '../commands/types'; | ||||||
| import { getStrapiAdminEnvVars, loadEnv } from './core/env'; | import { getStrapiAdminEnvVars, loadEnv } from './core/env'; | ||||||
| 
 | 
 | ||||||
| import type { BuildOptions } from './build'; |  | ||||||
| import { DevelopOptions } from './develop'; |  | ||||||
| import { PluginMeta, getEnabledPlugins, getMapOfPluginsWithAdmin } from './core/plugins'; | import { PluginMeta, getEnabledPlugins, getMapOfPluginsWithAdmin } from './core/plugins'; | ||||||
| import { Strapi } from '@strapi/types'; |  | ||||||
| import { AppFile, loadUserAppFile } from './core/admin-customisations'; | import { AppFile, loadUserAppFile } from './core/admin-customisations'; | ||||||
|  | import type { BaseContext } from './types'; | ||||||
| 
 | 
 | ||||||
| interface BuildContext { | interface BuildContext<TOptions = unknown> extends BaseContext { | ||||||
|   /** |  | ||||||
|    * The absolute path to the app directory defined by the Strapi instance |  | ||||||
|    */ |  | ||||||
|   appDir: string; |  | ||||||
|   /** |  | ||||||
|    * If a user is deploying the project under a nested public path, we use |  | ||||||
|    * this path so all asset paths will be rewritten accordingly |  | ||||||
|    */ |  | ||||||
|   basePath: string; |  | ||||||
|   /** |   /** | ||||||
|    * The customisations defined by the user in their app.js file |    * The customisations defined by the user in their app.js file | ||||||
|    */ |    */ | ||||||
|   customisations?: AppFile; |   customisations?: AppFile; | ||||||
|   /** |  | ||||||
|    * The current working directory |  | ||||||
|    */ |  | ||||||
|   cwd: string; |  | ||||||
|   /** |  | ||||||
|    * The absolute path to the dist directory |  | ||||||
|    */ |  | ||||||
|   distPath: string; |  | ||||||
|   /** |  | ||||||
|    * The relative path to the dist directory |  | ||||||
|    */ |  | ||||||
|   distDir: string; |  | ||||||
|   /** |  | ||||||
|    * The absolute path to the entry file |  | ||||||
|    */ |  | ||||||
|   entry: string; |  | ||||||
|   /** |  | ||||||
|    * The environment variables to be included in the JS bundle |  | ||||||
|    */ |  | ||||||
|   env: Record<string, string>; |  | ||||||
|   logger: CLIContext['logger']; |  | ||||||
|   /** |   /** | ||||||
|    * The build options |    * The build options | ||||||
|    */ |    */ | ||||||
|   options: Pick<BuildOptions, 'minify' | 'sourcemaps' | 'stats'> & Pick<DevelopOptions, 'open'>; |   options: TOptions; | ||||||
|   /** |   /** | ||||||
|    * The plugins to be included in the JS bundle |    * The plugins to be included in the JS bundle | ||||||
|    * incl. internal plugins, third party plugins & local plugins |    * incl. internal plugins, third party plugins & local plugins | ||||||
|    */ |    */ | ||||||
|   plugins: PluginMeta[]; |   plugins: PluginMeta[]; | ||||||
|   /** |  | ||||||
|    * The absolute path to the runtime directory |  | ||||||
|    */ |  | ||||||
|   runtimeDir: string; |  | ||||||
|   /** |  | ||||||
|    * The Strapi instance |  | ||||||
|    */ |  | ||||||
|   strapi: Strapi; |  | ||||||
|   /** |  | ||||||
|    * The browserslist target either loaded from the user's workspace or falling back to the default |  | ||||||
|    */ |  | ||||||
|   target: string[]; |  | ||||||
|   tsconfig?: CLIContext['tsconfig']; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| interface CreateBuildContextArgs extends CLIContext { | interface CreateBuildContextArgs<TOptions = unknown> extends CLIContext { | ||||||
|   strapi?: Strapi; |   strapi?: Strapi; | ||||||
|   options?: BuildContext['options']; |   options?: TOptions; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const DEFAULT_BROWSERSLIST = [ | const DEFAULT_BROWSERSLIST = [ | ||||||
| @ -84,13 +41,13 @@ const DEFAULT_BROWSERSLIST = [ | |||||||
|   'not dead', |   'not dead', | ||||||
| ]; | ]; | ||||||
| 
 | 
 | ||||||
| const createBuildContext = async ({ | const createBuildContext = async <TOptions>({ | ||||||
|   cwd, |   cwd, | ||||||
|   logger, |   logger, | ||||||
|   tsconfig, |   tsconfig, | ||||||
|   strapi, |   strapi, | ||||||
|   options = {}, |   options = {} as TOptions, | ||||||
| }: CreateBuildContextArgs): Promise<BuildContext> => { | }: CreateBuildContextArgs<TOptions>): Promise<BuildContext<TOptions>> => { | ||||||
|   /** |   /** | ||||||
|    * If you make a new strapi instance when one already exists, |    * If you make a new strapi instance when one already exists, | ||||||
|    * you will overwrite the global and the app will _most likely_ |    * you will overwrite the global and the app will _most likely_ | ||||||
| @ -176,7 +133,7 @@ const createBuildContext = async ({ | |||||||
|     strapi: strapiInstance, |     strapi: strapiInstance, | ||||||
|     target, |     target, | ||||||
|     tsconfig, |     tsconfig, | ||||||
|   } satisfies BuildContext; |   } satisfies BuildContext<TOptions>; | ||||||
| 
 | 
 | ||||||
|   return buildContext; |   return buildContext; | ||||||
| }; | }; | ||||||
| @ -1,19 +1,18 @@ | |||||||
| import type { CLIContext } from '@strapi/strapi'; |  | ||||||
| import * as tsUtils from '@strapi/typescript-utils'; | import * as tsUtils from '@strapi/typescript-utils'; | ||||||
| import { joinBy } from '@strapi/utils'; | import { joinBy } from '@strapi/utils'; | ||||||
| import chokidar from 'chokidar'; | import chokidar from 'chokidar'; | ||||||
| import fs from 'node:fs/promises'; | import fs from 'node:fs/promises'; | ||||||
| import path from 'node:path'; | import path from 'node:path'; | ||||||
| 
 |  | ||||||
| import cluster from 'node:cluster'; | import cluster from 'node:cluster'; | ||||||
|  | import { strapiFactory } from '@strapi/core'; | ||||||
| 
 | 
 | ||||||
|  | import type { CLIContext } from '../commands/types'; | ||||||
| import { checkRequiredDependencies } from './core/dependencies'; | import { checkRequiredDependencies } from './core/dependencies'; | ||||||
| import { getTimer, prettyTime, type TimeMeasurer } from './core/timer'; | import { getTimer, prettyTime, type TimeMeasurer } from './core/timer'; | ||||||
| import { createBuildContext } from './createBuildContext'; | import { createBuildContext } from './create-build-context'; | ||||||
| import { build as buildWebpack } from './webpack/build'; | import { build as buildWebpack } from './webpack/build'; | ||||||
| import { watch as watchWebpack, WebpackWatcher } from './webpack/watch'; | import { watch as watchWebpack, WebpackWatcher } from './webpack/watch'; | ||||||
| 
 | 
 | ||||||
| import { strapiFactory } from '@strapi/strapi'; |  | ||||||
| import { writeStaticClientFiles } from './staticFiles'; | import { writeStaticClientFiles } from './staticFiles'; | ||||||
| 
 | 
 | ||||||
| interface DevelopOptions extends CLIContext { | interface DevelopOptions extends CLIContext { | ||||||
| @ -44,7 +43,7 @@ const cleanupDistDirectory = async ({ | |||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   const timerName = 'cleaningDist' + Date.now(); |   const timerName = `cleaningDist${Date.now()}`; | ||||||
|   timer.start(timerName); |   timer.start(timerName); | ||||||
|   const cleaningSpinner = logger.spinner(`Cleaning dist dir ${distDir}`).start(); |   const cleaningSpinner = logger.spinner(`Cleaning dist dir ${distDir}`).start(); | ||||||
| 
 | 
 | ||||||
| @ -4,10 +4,9 @@ import outdent from 'outdent'; | |||||||
| import { format } from 'prettier'; | import { format } from 'prettier'; | ||||||
| import { createElement } from 'react'; | import { createElement } from 'react'; | ||||||
| import { renderToStaticMarkup } from 'react-dom/server'; | import { renderToStaticMarkup } from 'react-dom/server'; | ||||||
| import camelCase from 'lodash/camelCase'; | import { DefaultDocument } from '@strapi/admin/_internal'; | ||||||
| import { DefaultDocument as Document } from '../../admin/src/components/DefaultDocument'; |  | ||||||
| 
 | 
 | ||||||
| import type { BuildContext } from './createBuildContext'; | import type { BuildContext } from './create-build-context'; | ||||||
| 
 | 
 | ||||||
| const getEntryModule = (ctx: BuildContext): string => { | const getEntryModule = (ctx: BuildContext): string => { | ||||||
|   const pluginsObject = ctx.plugins |   const pluginsObject = ctx.plugins | ||||||
| @ -48,7 +47,7 @@ const getEntryModule = (ctx: BuildContext): string => { | |||||||
|  * to load a user's Document component? |  * to load a user's Document component? | ||||||
|  */ |  */ | ||||||
| const getDocumentHTML = async ({ logger }: Pick<BuildContext, 'logger'>) => { | const getDocumentHTML = async ({ logger }: Pick<BuildContext, 'logger'>) => { | ||||||
|   const result = renderToStaticMarkup(createElement(Document)); |   const result = renderToStaticMarkup(createElement(DefaultDocument)); | ||||||
|   logger.debug('Rendered the HTML'); |   logger.debug('Rendered the HTML'); | ||||||
| 
 | 
 | ||||||
|   return outdent`<!DOCTYPE html>${result}`; |   return outdent`<!DOCTYPE html>${result}`; | ||||||
							
								
								
									
										53
									
								
								packages/core/strapi/src/node/types.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								packages/core/strapi/src/node/types.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | |||||||
|  | import { Strapi } from '@strapi/types'; | ||||||
|  | 
 | ||||||
|  | import type { CLIContext } from '../commands/types'; | ||||||
|  | 
 | ||||||
|  | interface BaseContext { | ||||||
|  |   /** | ||||||
|  |    * The absolute path to the app directory defined by the Strapi instance | ||||||
|  |    */ | ||||||
|  |   appDir: string; | ||||||
|  |   /** | ||||||
|  |    * If a user is deploying the project under a nested public path, we use | ||||||
|  |    * this path so all asset paths will be rewritten accordingly | ||||||
|  |    */ | ||||||
|  |   basePath: string; | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * The current working directory | ||||||
|  |    */ | ||||||
|  |   cwd: string; | ||||||
|  |   /** | ||||||
|  |    * The absolute path to the dist directory | ||||||
|  |    */ | ||||||
|  |   distPath: string; | ||||||
|  |   /** | ||||||
|  |    * The relative path to the dist directory | ||||||
|  |    */ | ||||||
|  |   distDir: string; | ||||||
|  |   /** | ||||||
|  |    * The absolute path to the entry file | ||||||
|  |    */ | ||||||
|  |   entry: string; | ||||||
|  |   /** | ||||||
|  |    * The environment variables to be included in the JS bundle | ||||||
|  |    */ | ||||||
|  |   env: Record<string, string>; | ||||||
|  |   logger: CLIContext['logger']; | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * The absolute path to the runtime directory | ||||||
|  |    */ | ||||||
|  |   runtimeDir: string; | ||||||
|  |   /** | ||||||
|  |    * The Strapi instance | ||||||
|  |    */ | ||||||
|  |   strapi: Strapi; | ||||||
|  |   /** | ||||||
|  |    * The browserslist target either loaded from the user's workspace or falling back to the default | ||||||
|  |    */ | ||||||
|  |   target: string[]; | ||||||
|  |   tsconfig?: CLIContext['tsconfig']; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export type { BaseContext }; | ||||||
| @ -3,15 +3,15 @@ import webpack from 'webpack'; | |||||||
| import { mergeConfigWithUserConfig, resolveProductionConfig } from './config'; | import { mergeConfigWithUserConfig, resolveProductionConfig } from './config'; | ||||||
| import { isError } from '../core/errors'; | import { isError } from '../core/errors'; | ||||||
| 
 | 
 | ||||||
| import type { BuildContext } from '../createBuildContext'; | import type { BuildContext } from '../create-build-context'; | ||||||
| 
 | 
 | ||||||
| const build = async (ctx: BuildContext) => | const build = async (ctx: BuildContext) => { | ||||||
|   new Promise(async (resolve, reject) => { |   const config = await resolveProductionConfig(ctx); | ||||||
|     const config = await resolveProductionConfig(ctx); |   const finalConfig = await mergeConfigWithUserConfig(config, ctx); | ||||||
|     const finalConfig = await mergeConfigWithUserConfig(config, ctx); |  | ||||||
| 
 | 
 | ||||||
|     ctx.logger.debug('Webpack config', finalConfig); |   ctx.logger.debug('Webpack config', finalConfig); | ||||||
| 
 | 
 | ||||||
|  |   return new Promise((resolve, reject) => { | ||||||
|     webpack(finalConfig, (err, stats) => { |     webpack(finalConfig, (err, stats) => { | ||||||
|       if (stats) { |       if (stats) { | ||||||
|         if (stats.hasErrors()) { |         if (stats.hasErrors()) { | ||||||
| @ -22,7 +22,7 @@ const build = async (ctx: BuildContext) => | |||||||
|             }) |             }) | ||||||
|           ); |           ); | ||||||
| 
 | 
 | ||||||
|           reject(false); |           reject(); | ||||||
|         } else if (ctx.options.stats) { |         } else if (ctx.options.stats) { | ||||||
|           ctx.logger.info( |           ctx.logger.info( | ||||||
|             stats.toString({ |             stats.toString({ | ||||||
| @ -37,9 +37,10 @@ const build = async (ctx: BuildContext) => | |||||||
| 
 | 
 | ||||||
|       if (err && isError(err)) { |       if (err && isError(err)) { | ||||||
|         ctx.logger.error(err.message); |         ctx.logger.error(err.message); | ||||||
|         reject(false); |         reject(); | ||||||
|       } |       } | ||||||
|     }); |     }); | ||||||
|   }); |   }); | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| export { build }; | export { build }; | ||||||
| @ -16,7 +16,7 @@ import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; | |||||||
| 
 | 
 | ||||||
| import { loadFile } from '../core/files'; | import { loadFile } from '../core/files'; | ||||||
| import { loadStrapiMonorepo } from '../core/monorepo'; | import { loadStrapiMonorepo } from '../core/monorepo'; | ||||||
| import type { BuildContext } from '../createBuildContext'; | import type { BuildContext } from '../create-build-context'; | ||||||
| import { getAliases } from './aliases'; | import { getAliases } from './aliases'; | ||||||
| 
 | 
 | ||||||
| const resolveBaseConfig = async (ctx: BuildContext) => { | const resolveBaseConfig = async (ctx: BuildContext) => { | ||||||
| @ -225,16 +225,16 @@ const mergeConfigWithUserConfig = async (config: Configuration, ctx: BuildContex | |||||||
|     if (typeof userConfig === 'function') { |     if (typeof userConfig === 'function') { | ||||||
|       const webpack = await import('webpack'); |       const webpack = await import('webpack'); | ||||||
|       return userConfig(config, webpack); |       return userConfig(config, webpack); | ||||||
|     } else { |  | ||||||
|       ctx.logger.warn( |  | ||||||
|         `You've exported something other than a function from ${path.join( |  | ||||||
|           ctx.appDir, |  | ||||||
|           'src', |  | ||||||
|           'admin', |  | ||||||
|           'webpack.config' |  | ||||||
|         )}, this will ignored.` |  | ||||||
|       ); |  | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     ctx.logger.warn( | ||||||
|  |       `You've exported something other than a function from ${path.join( | ||||||
|  |         ctx.appDir, | ||||||
|  |         'src', | ||||||
|  |         'admin', | ||||||
|  |         'webpack.config' | ||||||
|  |       )}, this will ignored.` | ||||||
|  |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   return config; |   return config; | ||||||
| @ -4,9 +4,9 @@ import { promisify } from 'node:util'; | |||||||
| import webpackDevMiddleware from 'webpack-dev-middleware'; | import webpackDevMiddleware from 'webpack-dev-middleware'; | ||||||
| import webpackHotMiddleware from 'webpack-hot-middleware'; | import webpackHotMiddleware from 'webpack-hot-middleware'; | ||||||
| import { webpack } from 'webpack'; | import { webpack } from 'webpack'; | ||||||
| import type { BuildContext } from '../createBuildContext'; | import { Common } from '@strapi/types'; | ||||||
|  | import type { BuildContext } from '../create-build-context'; | ||||||
| import { mergeConfigWithUserConfig, resolveDevelopmentConfig } from './config'; | import { mergeConfigWithUserConfig, resolveDevelopmentConfig } from './config'; | ||||||
| import { Common, Strapi } from '@strapi/types'; |  | ||||||
| 
 | 
 | ||||||
| interface WebpackWatcher { | interface WebpackWatcher { | ||||||
|   close(): Promise<void>; |   close(): Promise<void>; | ||||||
| @ -23,7 +23,7 @@ const watch = async (ctx: BuildContext): Promise<WebpackWatcher> => { | |||||||
| 
 | 
 | ||||||
|     const devMiddleware = webpackDevMiddleware(compiler); |     const devMiddleware = webpackDevMiddleware(compiler); | ||||||
| 
 | 
 | ||||||
|     // @ts-ignore
 |     // @ts-expect-error ignored
 | ||||||
|     const hotMiddleware = webpackHotMiddleware(compiler, { |     const hotMiddleware = webpackHotMiddleware(compiler, { | ||||||
|       log: false, |       log: false, | ||||||
|       path: '/__webpack_hmr', |       path: '/__webpack_hmr', | ||||||
| @ -40,7 +40,7 @@ const watch = async (ctx: BuildContext): Promise<WebpackWatcher> => { | |||||||
| 
 | 
 | ||||||
|     ctx.strapi.server.app.use((context, next) => { |     ctx.strapi.server.app.use((context, next) => { | ||||||
|       // wait for webpack-dev-middleware to signal that the build is ready
 |       // wait for webpack-dev-middleware to signal that the build is ready
 | ||||||
|       const ready = new Promise((resolve, reject) => { |       const ready = new Promise((resolve) => { | ||||||
|         devMiddleware.waitUntilValid(() => { |         devMiddleware.waitUntilValid(() => { | ||||||
|           resolve(true); |           resolve(true); | ||||||
|         }); |         }); | ||||||
| @ -50,14 +50,14 @@ const watch = async (ctx: BuildContext): Promise<WebpackWatcher> => { | |||||||
|         devMiddleware( |         devMiddleware( | ||||||
|           context.req, |           context.req, | ||||||
|           { |           { | ||||||
|             // @ts-expect-error
 |             // @ts-expect-error ignored
 | ||||||
|             end: (content) => { |             end(content) { | ||||||
|               // eslint-disable-next-line no-param-reassign
 |               // eslint-disable-next-line no-param-reassign
 | ||||||
|               context.body = content; |               context.body = content; | ||||||
|               resolve(true); |               resolve(true); | ||||||
|             }, |             }, | ||||||
|             getHeader: context.get.bind(context), |             getHeader: context.get.bind(context), | ||||||
|             // @ts-expect-error
 |             // @ts-expect-error ignored
 | ||||||
|             setHeader: context.set.bind(context), |             setHeader: context.set.bind(context), | ||||||
|             locals: context.state, |             locals: context.state, | ||||||
|           }, |           }, | ||||||
| @ -80,6 +80,7 @@ const watch = async (ctx: BuildContext): Promise<WebpackWatcher> => { | |||||||
|           return; |           return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
 | ||||||
|         const filename = path.resolve(finalConfig.output?.path!, 'index.html'); |         const filename = path.resolve(finalConfig.output?.path!, 'index.html'); | ||||||
|         ctx.type = 'html'; |         ctx.type = 'html'; | ||||||
|         ctx.body = devMiddleware.context.outputFileSystem.createReadStream(filename); |         ctx.body = devMiddleware.context.outputFileSystem.createReadStream(filename); | ||||||
| @ -1,7 +1,8 @@ | |||||||
| { | { | ||||||
|   "extends": "tsconfig/base.json", |   "extends": "tsconfig/base.json", | ||||||
|   "compilerOptions": { |   "compilerOptions": { | ||||||
|     "noEmit": true |     "noEmit": true, | ||||||
|  |     "rootDir": "./src" | ||||||
|   }, |   }, | ||||||
|   "include": ["src"], |   "include": ["src"], | ||||||
|   "exclude": ["node_modules"] |   "exclude": ["node_modules"] | ||||||
|  | |||||||
							
								
								
									
										52
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								yarn.lock
									
									
									
									
									
								
							| @ -8572,7 +8572,6 @@ __metadata: | |||||||
|   resolution: "@strapi/admin@workspace:packages/core/admin" |   resolution: "@strapi/admin@workspace:packages/core/admin" | ||||||
|   dependencies: |   dependencies: | ||||||
|     "@casl/ability": "npm:6.5.0" |     "@casl/ability": "npm:6.5.0" | ||||||
|     "@pmmmwh/react-refresh-webpack-plugin": "npm:0.5.10" |  | ||||||
|     "@radix-ui/react-context": "npm:1.0.1" |     "@radix-ui/react-context": "npm:1.0.1" | ||||||
|     "@radix-ui/react-toolbar": "npm:1.0.4" |     "@radix-ui/react-toolbar": "npm:1.0.4" | ||||||
|     "@reduxjs/toolkit": "npm:1.9.7" |     "@reduxjs/toolkit": "npm:1.9.7" | ||||||
| @ -8585,7 +8584,6 @@ __metadata: | |||||||
|     "@strapi/permissions": "npm:4.15.5" |     "@strapi/permissions": "npm:4.15.5" | ||||||
|     "@strapi/plugin-content-manager": "npm:4.15.5" |     "@strapi/plugin-content-manager": "npm:4.15.5" | ||||||
|     "@strapi/provider-audit-logs-local": "npm:4.15.5" |     "@strapi/provider-audit-logs-local": "npm:4.15.5" | ||||||
|     "@strapi/strapi": "npm:4.15.5" |  | ||||||
|     "@strapi/types": "npm:4.15.5" |     "@strapi/types": "npm:4.15.5" | ||||||
|     "@strapi/typescript-utils": "npm:4.15.5" |     "@strapi/typescript-utils": "npm:4.15.5" | ||||||
|     "@strapi/utils": "npm:4.15.5" |     "@strapi/utils": "npm:4.15.5" | ||||||
| @ -8614,28 +8612,17 @@ __metadata: | |||||||
|     axios: "npm:1.6.0" |     axios: "npm:1.6.0" | ||||||
|     bcryptjs: "npm:2.4.3" |     bcryptjs: "npm:2.4.3" | ||||||
|     boxen: "npm:5.1.2" |     boxen: "npm:5.1.2" | ||||||
|     browserslist: "npm:^4.22.1" |  | ||||||
|     browserslist-to-esbuild: "npm:1.2.0" |  | ||||||
|     chalk: "npm:^4.1.2" |     chalk: "npm:^4.1.2" | ||||||
|     chokidar: "npm:3.5.3" |  | ||||||
|     codemirror5: "npm:codemirror@^5.65.11" |     codemirror5: "npm:codemirror@^5.65.11" | ||||||
|     cross-env: "npm:^7.0.3" |     cross-env: "npm:^7.0.3" | ||||||
|     css-loader: "npm:^6.8.1" |  | ||||||
|     date-fns: "npm:2.30.0" |     date-fns: "npm:2.30.0" | ||||||
|     dotenv: "npm:14.2.0" |  | ||||||
|     esbuild: "npm:0.19.2" |  | ||||||
|     esbuild-loader: "npm:^2.21.0" |  | ||||||
|     esbuild-register: "npm:3.5.0" |  | ||||||
|     execa: "npm:5.1.1" |     execa: "npm:5.1.1" | ||||||
|     fast-deep-equal: "npm:3.1.3" |     fast-deep-equal: "npm:3.1.3" | ||||||
|     find-root: "npm:1.1.0" |  | ||||||
|     fork-ts-checker-webpack-plugin: "npm:8.0.0" |  | ||||||
|     formik: "npm:2.4.0" |     formik: "npm:2.4.0" | ||||||
|     fractional-indexing: "npm:3.2.0" |     fractional-indexing: "npm:3.2.0" | ||||||
|     fs-extra: "npm:10.0.0" |     fs-extra: "npm:10.0.0" | ||||||
|     highlight.js: "npm:^10.4.1" |     highlight.js: "npm:^10.4.1" | ||||||
|     history: "npm:^4.9.0" |     history: "npm:^4.9.0" | ||||||
|     html-webpack-plugin: "npm:5.5.0" |  | ||||||
|     immer: "npm:9.0.19" |     immer: "npm:9.0.19" | ||||||
|     inquirer: "npm:8.2.5" |     inquirer: "npm:8.2.5" | ||||||
|     invariant: "npm:^2.2.4" |     invariant: "npm:^2.2.4" | ||||||
| @ -8658,15 +8645,12 @@ __metadata: | |||||||
|     markdown-it-mark: "npm:^3.0.1" |     markdown-it-mark: "npm:^3.0.1" | ||||||
|     markdown-it-sub: "npm:^1.0.0" |     markdown-it-sub: "npm:^1.0.0" | ||||||
|     markdown-it-sup: "npm:1.0.0" |     markdown-it-sup: "npm:1.0.0" | ||||||
|     mini-css-extract-plugin: "npm:2.7.6" |  | ||||||
|     msw: "npm:1.3.0" |     msw: "npm:1.3.0" | ||||||
|     node-schedule: "npm:2.1.0" |     node-schedule: "npm:2.1.0" | ||||||
|     ora: "npm:5.4.1" |     ora: "npm:5.4.1" | ||||||
|     outdent: "npm:0.8.0" |  | ||||||
|     p-map: "npm:4.0.0" |     p-map: "npm:4.0.0" | ||||||
|     passport-local: "npm:1.0.0" |     passport-local: "npm:1.0.0" | ||||||
|     pluralize: "npm:8.0.0" |     pluralize: "npm:8.0.0" | ||||||
|     prettier: "npm:2.8.4" |  | ||||||
|     prop-types: "npm:^15.8.1" |     prop-types: "npm:^15.8.1" | ||||||
|     qs: "npm:6.11.1" |     qs: "npm:6.11.1" | ||||||
|     react: "npm:^18.2.0" |     react: "npm:^18.2.0" | ||||||
| @ -8683,8 +8667,6 @@ __metadata: | |||||||
|     react-router-dom: "npm:5.3.4" |     react-router-dom: "npm:5.3.4" | ||||||
|     react-select: "npm:5.7.0" |     react-select: "npm:5.7.0" | ||||||
|     react-window: "npm:1.8.8" |     react-window: "npm:1.8.8" | ||||||
|     read-pkg-up: "npm:7.0.1" |  | ||||||
|     resolve-from: "npm:5.0.0" |  | ||||||
|     rimraf: "npm:3.0.2" |     rimraf: "npm:3.0.2" | ||||||
|     sanitize-html: "npm:2.11.0" |     sanitize-html: "npm:2.11.0" | ||||||
|     semver: "npm:7.5.4" |     semver: "npm:7.5.4" | ||||||
| @ -8692,18 +8674,12 @@ __metadata: | |||||||
|     slate: "npm:0.94.1" |     slate: "npm:0.94.1" | ||||||
|     slate-history: "npm:0.93.0" |     slate-history: "npm:0.93.0" | ||||||
|     slate-react: "npm:0.98.3" |     slate-react: "npm:0.98.3" | ||||||
|     style-loader: "npm:3.3.1" |  | ||||||
|     styled-components: "npm:5.3.3" |     styled-components: "npm:5.3.3" | ||||||
|     typescript: "npm:5.3.2" |     typescript: "npm:5.3.2" | ||||||
|     vite: "npm:4.4.9" |     vite: "npm:4.4.9" | ||||||
|     webpack: "npm:^5.88.1" |  | ||||||
|     webpack-bundle-analyzer: "npm:^4.9.0" |  | ||||||
|     webpack-dev-middleware: "npm:6.1.1" |  | ||||||
|     webpack-hot-middleware: "npm:2.25.4" |  | ||||||
|     yup: "npm:0.32.9" |     yup: "npm:0.32.9" | ||||||
|   peerDependencies: |   peerDependencies: | ||||||
|     "@strapi/data-transfer": 4.15.5 |     "@strapi/data-transfer": 4.15.5 | ||||||
|     "@strapi/strapi": ^4.3.4 |  | ||||||
|     react: ^17.0.0 || ^18.0.0 |     react: ^17.0.0 || ^18.0.0 | ||||||
|     react-dom: ^17.0.0 || ^18.0.0 |     react-dom: ^17.0.0 || ^18.0.0 | ||||||
|     react-router-dom: ^5.2.0 |     react-router-dom: ^5.2.0 | ||||||
| @ -9583,6 +9559,7 @@ __metadata: | |||||||
|   version: 0.0.0-use.local |   version: 0.0.0-use.local | ||||||
|   resolution: "@strapi/strapi@workspace:packages/core/strapi" |   resolution: "@strapi/strapi@workspace:packages/core/strapi" | ||||||
|   dependencies: |   dependencies: | ||||||
|  |     "@pmmmwh/react-refresh-webpack-plugin": "npm:0.5.10" | ||||||
|     "@strapi/admin": "npm:4.15.5" |     "@strapi/admin": "npm:4.15.5" | ||||||
|     "@strapi/core": "npm:4.15.5" |     "@strapi/core": "npm:4.15.5" | ||||||
|     "@strapi/data-transfer": "npm:4.15.5" |     "@strapi/data-transfer": "npm:4.15.5" | ||||||
| @ -9603,20 +9580,47 @@ __metadata: | |||||||
|     "@types/lodash": "npm:^4.14.191" |     "@types/lodash": "npm:^4.14.191" | ||||||
|     "@types/node": "npm:18.18.4" |     "@types/node": "npm:18.18.4" | ||||||
|     boxen: "npm:5.1.2" |     boxen: "npm:5.1.2" | ||||||
|  |     browserslist: "npm:^4.22.1" | ||||||
|  |     browserslist-to-esbuild: "npm:1.2.0" | ||||||
|     chalk: "npm:4.1.2" |     chalk: "npm:4.1.2" | ||||||
|  |     chokidar: "npm:3.5.3" | ||||||
|     cli-table3: "npm:0.6.2" |     cli-table3: "npm:0.6.2" | ||||||
|     commander: "npm:8.3.0" |     commander: "npm:8.3.0" | ||||||
|     copyfiles: "npm:2.4.1" |     copyfiles: "npm:2.4.1" | ||||||
|  |     css-loader: "npm:^6.8.1" | ||||||
|  |     dotenv: "npm:14.2.0" | ||||||
|  |     esbuild: "npm:0.19.2" | ||||||
|  |     esbuild-loader: "npm:^2.21.0" | ||||||
|  |     esbuild-register: "npm:3.5.0" | ||||||
|     eslint-config-custom: "npm:4.15.5" |     eslint-config-custom: "npm:4.15.5" | ||||||
|     execa: "npm:5.1.1" |     execa: "npm:5.1.1" | ||||||
|  |     find-root: "npm:1.1.0" | ||||||
|  |     fork-ts-checker-webpack-plugin: "npm:8.0.0" | ||||||
|     fs-extra: "npm:10.0.0" |     fs-extra: "npm:10.0.0" | ||||||
|  |     html-webpack-plugin: "npm:5.5.0" | ||||||
|     inquirer: "npm:8.2.5" |     inquirer: "npm:8.2.5" | ||||||
|     lodash: "npm:4.17.21" |     lodash: "npm:4.17.21" | ||||||
|  |     mini-css-extract-plugin: "npm:2.7.6" | ||||||
|     ora: "npm:5.4.1" |     ora: "npm:5.4.1" | ||||||
|  |     outdent: "npm:0.8.0" | ||||||
|     pkg-up: "npm:3.1.0" |     pkg-up: "npm:3.1.0" | ||||||
|  |     prettier: "npm:2.8.4" | ||||||
|  |     react: "npm:^18.2.0" | ||||||
|  |     react-dom: "npm:^18.2.0" | ||||||
|  |     read-pkg-up: "npm:7.0.1" | ||||||
|  |     resolve-from: "npm:5.0.0" | ||||||
|  |     semver: "npm:7.5.4" | ||||||
|  |     style-loader: "npm:3.3.1" | ||||||
|     tsconfig: "npm:4.15.5" |     tsconfig: "npm:4.15.5" | ||||||
|     typescript: "npm:5.3.2" |     typescript: "npm:5.3.2" | ||||||
|  |     webpack: "npm:^5.88.1" | ||||||
|  |     webpack-bundle-analyzer: "npm:^4.9.0" | ||||||
|  |     webpack-dev-middleware: "npm:6.1.1" | ||||||
|  |     webpack-hot-middleware: "npm:2.25.4" | ||||||
|     yup: "npm:0.32.9" |     yup: "npm:0.32.9" | ||||||
|  |   peerDependencies: | ||||||
|  |     react: ^17.0.0 || ^18.0.0 | ||||||
|  |     react-dom: ^17.0.0 || ^18.0.0 | ||||||
|   bin: |   bin: | ||||||
|     strapi: ./bin/strapi.js |     strapi: ./bin/strapi.js | ||||||
|   languageName: unknown |   languageName: unknown | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Alexandre Bodin
						Alexandre Bodin