@yannick-z/modulo 0.2.0

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 (49) hide show
  1. package/README.md +311 -0
  2. package/bin/modulo.js +22 -0
  3. package/dist/index.js +773 -0
  4. package/package.json +36 -0
  5. package/rslib.config.ts +22 -0
  6. package/src/args/cmd.ts +16 -0
  7. package/src/args/get-framework-name.ts +19 -0
  8. package/src/args/index.ts +80 -0
  9. package/src/args/mode.ts +38 -0
  10. package/src/args/node_env.ts +15 -0
  11. package/src/args/preset.ts +26 -0
  12. package/src/args/target.ts +44 -0
  13. package/src/cli/init.ts +12 -0
  14. package/src/cli/pack-code.ts +17 -0
  15. package/src/config/example/example-config.ts +46 -0
  16. package/src/config/example/example-externals.ts +47 -0
  17. package/src/config/externals.ts +70 -0
  18. package/src/config/generate_config.ts +105 -0
  19. package/src/config/index.ts +27 -0
  20. package/src/config/preset/alias.ts +3 -0
  21. package/src/config/preset/dev-server.ts +6 -0
  22. package/src/config/preset/dirs.ts +12 -0
  23. package/src/config/preset/html.ts +19 -0
  24. package/src/config/preset/index.ts +23 -0
  25. package/src/config/preset/libs.ts +5 -0
  26. package/src/config/preset/minify.ts +24 -0
  27. package/src/config/preset/url.ts +4 -0
  28. package/src/config/type.ts +17 -0
  29. package/src/index.ts +13 -0
  30. package/src/initiator/create-config-file.ts +46 -0
  31. package/src/initiator/modify-scripts.ts +52 -0
  32. package/src/packer/collect-modules.ts +77 -0
  33. package/src/packer/get-externals-and-tags.ts +65 -0
  34. package/src/packer/lib.ts +84 -0
  35. package/src/packer/page.ts +98 -0
  36. package/src/packer/prepare.ts +76 -0
  37. package/src/tools/debug-log.ts +37 -0
  38. package/src/tools/file.ts +19 -0
  39. package/src/tools/find-path-root.ts +29 -0
  40. package/src/tools/get-framework-name.ts +14 -0
  41. package/src/tools/get-ui-plugin.ts +23 -0
  42. package/src/tools/json.ts +11 -0
  43. package/src/tools/merge-user-config.ts +21 -0
  44. package/src/tools/omit-root-path.ts +11 -0
  45. package/src/tools/panic.ts +11 -0
  46. package/src/tools/string.ts +3 -0
  47. package/src/type/guard.ts +11 -0
  48. package/template/index.html +12 -0
  49. package/tsconfig.json +11 -0
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@yannick-z/modulo",
3
+ "description": "",
4
+ "type": "module",
5
+ "version": "0.2.0",
6
+ "main": "./src/index.ts",
7
+ "author": "oyangxiao",
8
+ "scripts": {
9
+ "build": "rslib build",
10
+ "dev": "rslib build -w"
11
+ },
12
+ "bin": {
13
+ "modulo": "./bin/modulo.js"
14
+ },
15
+ "dependencies": {
16
+ "@rsbuild/core":"^1.7.2",
17
+ "@rsbuild/plugin-less":"^1.5.0",
18
+ "@rsbuild/plugin-react":"^1.4.2",
19
+ "@rsbuild/plugin-umd":"^1.0.5",
20
+ "@rsbuild/plugin-vue2":"^1.0.5",
21
+ "@rslib/core":"^0.19.3",
22
+ "@types/node":"^24.0.0",
23
+ "@types/semver": "^7.7.1",
24
+ "minimist":"^1.2.8",
25
+ "picocolors":"^1.1.1",
26
+ "semver":"^7.7.3",
27
+ "typescript":"^5.9.3"
28
+ },
29
+ "devDependencies": {
30
+ "@types/minimist": "^1.2.5"
31
+ },
32
+ "license": "ISC",
33
+ "publishConfig": {
34
+ "registry": "https://registry.npmjs.org/"
35
+ }
36
+ }
@@ -0,0 +1,22 @@
1
+ import { defineConfig } from '@rslib/core';
2
+
3
+ export default defineConfig({
4
+ lib: [
5
+ {
6
+ dts: false,
7
+ format: 'esm',
8
+ syntax: 'esnext',
9
+ },
10
+ ],
11
+ output: {
12
+ distPath: {
13
+ root: './dist',
14
+ },
15
+ target: 'node',
16
+ },
17
+ source: {
18
+ entry: {
19
+ index: './src/index.ts',
20
+ },
21
+ },
22
+ });
@@ -0,0 +1,16 @@
1
+ import type minimist from "minimist";
2
+ import { PANIC_IF } from "../tools/panic.ts";
3
+
4
+ // 命令
5
+ export function get_cmd(argv: minimist.ParsedArgs) {
6
+ const cmd_list = ["build", "dev", "init"] as const;
7
+ const cmd = argv._[0] as (typeof cmd_list)[number];
8
+ PANIC_IF(
9
+ !cmd_list.includes(cmd),
10
+ `modulo必须执行 ${cmd_list.join(" 或 ")} 命令`
11
+ );
12
+ return cmd;
13
+ }
14
+
15
+ export type ModuloCmd_Pack = "build" | "dev";
16
+ export type ModuloCmd_Init = "init";
@@ -0,0 +1,19 @@
1
+ import { get_packagejson } from "../config/index.ts";
2
+ import { get_framework_name } from "../tools/get-framework-name.ts";
3
+ import { PANIC_IF } from "../tools/panic.ts";
4
+ import semver from "semver";
5
+
6
+ export function detect_preset() {
7
+ const { dependencies } = get_packagejson();
8
+
9
+ const framework_name = get_framework_name();
10
+ const version = semver.parse(dependencies[framework_name])!;
11
+
12
+ PANIC_IF(!version, `package.json中未识别到${framework_name}的版本信息`);
13
+
14
+ //需要识别
15
+
16
+ const preset = `${framework_name}${version.major}`;
17
+
18
+ return preset;
19
+ }
@@ -0,0 +1,80 @@
1
+ import minimist from "minimist";
2
+ import { default_config_file_name } from "../config/example/example-config.ts";
3
+ import type { preset_ui_libs } from "../config/preset/libs.ts";
4
+ import { get_cmd, type ModuloCmd_Init, type ModuloCmd_Pack } from "./cmd.ts";
5
+ import { get_env } from "./mode.ts";
6
+ import { set_node_env } from "./node_env.ts";
7
+ import { get_preset_for_init } from "./preset.ts";
8
+ import {
9
+ get_cmd_target,
10
+ type ModuloTarget_Init,
11
+ type ModuloTarget_Pack,
12
+ } from "./target.ts";
13
+
14
+ export interface ModuloArgs_Pack {
15
+ cmd: ModuloCmd_Pack;
16
+ target: ModuloTarget_Pack;
17
+ pack: {
18
+ config: string;
19
+ env: "dev" | "prd";
20
+ watch: boolean;
21
+ esm: boolean;
22
+ };
23
+ }
24
+
25
+ export interface ModuloArgs_Init {
26
+ cmd: ModuloCmd_Init;
27
+ target: ModuloTarget_Init;
28
+ init: {
29
+ path: string;
30
+ force: boolean;
31
+ preset: keyof typeof preset_ui_libs;
32
+ };
33
+ }
34
+
35
+ let args: ModuloArgs_Init | ModuloArgs_Pack;
36
+
37
+ const argv = minimist(process.argv.slice(2));
38
+ export const argv_debug = argv.debug === "true";
39
+ export const argv_verbose = argv.verbose === "true" || argv.v;
40
+
41
+ export function get_args() {
42
+ if (!args) {
43
+ const cmd = get_cmd(argv);
44
+
45
+ if (cmd === "build" || cmd === "dev") {
46
+ const target = get_cmd_target(argv, cmd);
47
+ // watch只能对单个构建目标使用
48
+ const watch = target === "all" ? false : argv.watch === "true" || argv.w;
49
+ args = {
50
+ cmd,
51
+ target,
52
+ // 是否是调试modulo
53
+ pack: {
54
+ // 配置文件路径
55
+ config:
56
+ (argv.config as string | undefined) || default_config_file_name,
57
+ // 运行模式, dev | prd
58
+ env: cmd === "build" || cmd === "dev" ? get_env(argv, cmd) : "prd",
59
+ watch,
60
+ esm: argv.format === "esm" || argv.f === "esm",
61
+ },
62
+ };
63
+ args.pack.env && set_node_env(args.pack.env);
64
+ } else {
65
+ args = {
66
+ cmd,
67
+ target: get_cmd_target(argv, cmd),
68
+ init: {
69
+ path: argv.path,
70
+ force: argv.force === "true" || argv.f,
71
+ preset: get_preset_for_init(argv),
72
+ },
73
+ };
74
+ }
75
+
76
+ if (argv_verbose) console.log("args: ", args);
77
+ }
78
+
79
+ return args;
80
+ }
@@ -0,0 +1,38 @@
1
+ import type minimist from "minimist";
2
+ import picocolors from "picocolors";
3
+ import { PANIC_IF } from "../tools/panic.ts";
4
+
5
+ const mode_list = ["dev", "development", "prd", "production"];
6
+
7
+ export function get_env(argv: minimist.ParsedArgs, cmd: "dev" | "build") {
8
+ // mode参数
9
+ let env = "" as "dev" | "prd";
10
+ if (argv.env) {
11
+ if (argv.env === "dev" || argv.env === "development") {
12
+ env = "dev";
13
+ } else if (argv.env === "prd" || argv.env === "production") {
14
+ env = "prd";
15
+ } else {
16
+ PANIC_IF(true, `env参数只能为 ${mode_list.join(" 或 ")}`);
17
+ }
18
+ console.log(picocolors.blue(`env = ${env}`));
19
+ } else if (cmd === "build" || cmd === "dev") {
20
+ if (process.env.NODE_ENV) {
21
+ env = process.env.NODE_ENV === "production" ? "prd" : "dev";
22
+ console.log(
23
+ picocolors.yellow("\n未设置env,将根据process.env.NODE_ENV自动设置\n"),
24
+ picocolors.yellow(
25
+ `process.env.NODE_ENV = ${process.env.NODE_ENV}, env = ${env}`
26
+ )
27
+ );
28
+ } else {
29
+ env = cmd === "build" ? "prd" : "dev";
30
+ console.log(
31
+ picocolors.yellow("\n未设置env,将根据build或dev命令自动设置\n"),
32
+ picocolors.yellow(`cmd = ${cmd}, env = ${env}`)
33
+ );
34
+ }
35
+ }
36
+
37
+ return env;
38
+ }
@@ -0,0 +1,15 @@
1
+ import picocolors from 'picocolors';
2
+
3
+ export function set_node_env(mode: 'dev' | 'prd') {
4
+ /**
5
+ * 保证process.env.NODE_ENV有值
6
+ */
7
+ const _node_env = mode === 'dev' ? 'development' : 'production';
8
+ if (process.env.NODE_ENV !== _node_env) {
9
+ console.log(
10
+ picocolors.yellow('\nprocess.env.NODE_ENV 与 mode 不一致, 将被强制设置为与mode匹配的值\n'),
11
+ picocolors.yellow(`mode = ${mode}, process.env.NODE_ENV = ${_node_env}\n`),
12
+ );
13
+ process.env.NODE_ENV = _node_env;
14
+ }
15
+ }
@@ -0,0 +1,26 @@
1
+ import type minimist from "minimist";
2
+ import picocolors from "picocolors";
3
+ import { detect_preset } from "./get-framework-name.ts";
4
+ import { PANIC_IF } from "../tools/panic.ts";
5
+
6
+ export function get_preset_for_init(argv: minimist.ParsedArgs) {
7
+ let preset = argv.preset;
8
+
9
+ if (!preset) {
10
+ preset = detect_preset();
11
+ console.log(
12
+ picocolors.blue(
13
+ "未输入preset,但是根据package.json中的依赖自动识别到preset为: " +
14
+ preset
15
+ )
16
+ );
17
+ }
18
+
19
+ preset &&
20
+ PANIC_IF(
21
+ preset !== "react17" && preset !== "vue2",
22
+ "目前只支持react17和vue2"
23
+ );
24
+
25
+ return preset;
26
+ }
@@ -0,0 +1,44 @@
1
+ import type minimist from "minimist";
2
+ import { PANIC_IF } from "../tools/panic.ts";
3
+ import type { ModuloCmd_Init, ModuloCmd_Pack } from "./cmd";
4
+
5
+ const pack_options = {
6
+ page: "构建页面",
7
+ module: "构建模块",
8
+ all: "页面和模块",
9
+ };
10
+ const init_options = {
11
+ config: "modulo的配置文件",
12
+ script: "package.json中modulo的启动命令",
13
+ };
14
+ const options = {
15
+ build: pack_options,
16
+ dev: {
17
+ page: pack_options.page,
18
+ module: pack_options.module,
19
+ },
20
+ init: init_options,
21
+ };
22
+
23
+ export type ModuloTarget_Pack = keyof typeof pack_options;
24
+ export type ModuloTarget_Init = keyof typeof init_options;
25
+
26
+ export function get_cmd_target<T extends ModuloCmd_Pack | ModuloCmd_Init>(
27
+ argv: minimist.ParsedArgs,
28
+ cmd: T
29
+ ) {
30
+ const target = argv._[1];
31
+
32
+ const target_list = options[cmd];
33
+
34
+ PANIC_IF(
35
+ !(target in target_list),
36
+ `modulo ${cmd} 命令必须执行 ${Object.entries(target_list).map(
37
+ ([k, v]) => `\n${k} - ${v}`
38
+ )} 几种目标`
39
+ );
40
+
41
+ return target as T extends ModuloCmd_Init
42
+ ? ModuloTarget_Init
43
+ : ModuloTarget_Pack;
44
+ }
@@ -0,0 +1,12 @@
1
+ import type { ModuloArgs_Init } from "../args/index.ts";
2
+ import { create_config_file } from "../initiator/create-config-file.ts";
3
+ import { modify_scripts } from "../initiator/modify-scripts.ts";
4
+
5
+ export function init_tool(args: ModuloArgs_Init) {
6
+ if (args.target === "config") {
7
+ create_config_file(args);
8
+ }
9
+ if (args.target === "script") {
10
+ modify_scripts();
11
+ }
12
+ }
@@ -0,0 +1,17 @@
1
+ import type { ModuloArgs_Pack } from "../args/index.ts";
2
+ import { lib_pack } from "../packer/lib.ts";
3
+ import { page_pack } from "../packer/page.ts";
4
+
5
+ export async function pack_code(args: ModuloArgs_Pack) {
6
+ const { target } = args;
7
+
8
+ //先构建页面,防止产物目录被清理掉
9
+ // target为all的时候不允许watch,只能分别启动两个进程
10
+ if (target === "page" || target === "all") {
11
+ await page_pack(args);
12
+ }
13
+
14
+ if (target === "module" || target === "all") {
15
+ await lib_pack(args);
16
+ }
17
+ }
@@ -0,0 +1,46 @@
1
+ import picocolors from "picocolors";
2
+ import { star_line } from "../../initiator/modify-scripts.ts";
3
+ import { preset_alias } from "../preset/alias.ts";
4
+ import { preset_config } from "../preset/index.ts";
5
+ import type { USER_CONFIG } from "../type.ts";
6
+ import { common_example_externals, presets } from "./example-externals.ts";
7
+
8
+ export function get_example_config(preset?: "react" | "vue" | undefined) {
9
+ console.log(
10
+ picocolors.magenta(
11
+ `\n${star_line}\n默认配置文件中的externals内容为推荐内容\n请注意手动替换配置文件中externals的url,以保证符合项目需求\n如果不需要externals部分依赖,也可以将他们从列表中删除\n${star_line}\n`
12
+ )
13
+ );
14
+ return {
15
+ // 提供一些常用的配置
16
+ input: preset_config.input,
17
+ output: {
18
+ filenameHash: true,
19
+ },
20
+ url: {
21
+ base: "/",
22
+ },
23
+ alias: preset_alias,
24
+ html: {
25
+ root: "app",
26
+ title: "Modulo Page",
27
+ meta: {},
28
+ tags: [
29
+ {
30
+ tag: "script",
31
+ attrs: {
32
+ src: "/packages/webhost/dist/webhost.system.js",
33
+ },
34
+ append: false,
35
+ publicPath: false,
36
+ },
37
+ ],
38
+ },
39
+ dev_server: {
40
+ proxy: preset_config.dev_server.proxy,
41
+ },
42
+ externals: preset ? presets[preset] : common_example_externals,
43
+ } as USER_CONFIG;
44
+ }
45
+
46
+ export const default_config_file_name = "modulo.config.json";
@@ -0,0 +1,47 @@
1
+ import type { ExternalLibs } from "../externals.ts";
2
+
3
+ // 构建会将以下依赖排除在外,不打包进产物,也可配置更多的依赖
4
+ export const vue2_example_externals: ExternalLibs = {
5
+ vue: {
6
+ // 支持多个importName,以避免import Vue from 'Vue'这种不正规的写法
7
+ importName: ["vue", "Vue"],
8
+ // preset代表初始化配置的时候能够减少无用配置,比如vue的preset会自动过滤只配置vue的externals
9
+ // url可以直接写字符串,则无论哪种打包模式,都使用这个url
10
+ // 也可以分别提供umd和esm的url,则会根据打包模式自动切换
11
+ // 另外还支持dev和prd模式分别提供不同的url
12
+ url: {
13
+ umd: "https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.min.js",
14
+ esm: "https://cdn.jsdelivr.net/npm/vue@2.7.16/+esm",
15
+ },
16
+ },
17
+ };
18
+ export const react17_example_externals: ExternalLibs = {
19
+ react: {
20
+ importName: ["react", "React"],
21
+ url: {
22
+ umd: "https://cdn.jsdelivr.net/npm/react@17.0.2/umd/react.production.min.js",
23
+ esm: "https://cdn.jsdelivr.net/npm/react@17.0.2/+esm",
24
+ },
25
+ },
26
+ // 不写importName,则默认使用libName作为importName
27
+ "react-dom": {
28
+ umd: "/packages/common/js/react-17.0.2/umd/react-dom.production.min.js",
29
+ esm: "https://cdn.jsdelivr.net/npm/react-dom@17.0.2/+esm",
30
+ },
31
+ "react/jsx-runtime": {
32
+ umd: "/packages/common/js/react-17.0.2/umd/react-jsx-runtime.js",
33
+ esm: "/packages/common/js/react-17.0.2/esm/react-jsx-runtime.js",
34
+ },
35
+ };
36
+ export const common_example_externals: ExternalLibs = {
37
+ jquery: "https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js",
38
+ rxjs: {
39
+ umd: "https://cdn.jsdelivr.net/npm/rxjs@7.8.2/dist/bundles/rxjs.umd.min.js",
40
+ esm: "https://cdn.jsdelivr.net/npm/rxjs@7.8.2/+esm",
41
+ },
42
+ };
43
+
44
+ export const presets = {
45
+ vue2: { ...vue2_example_externals, ...common_example_externals },
46
+ react17: { ...react17_example_externals, ...common_example_externals },
47
+ };
@@ -0,0 +1,70 @@
1
+ import { is_record, is_string } from "../type/guard.ts";
2
+
3
+ export interface UmdExternalUrl {
4
+ umd: string;
5
+ }
6
+
7
+ export interface EsmExternalUrl {
8
+ esm: string;
9
+ }
10
+
11
+ export function is_umd_url(data: unknown): data is UmdExternalUrl {
12
+ return is_record(data) && is_string(data.umd);
13
+ }
14
+
15
+ export function is_esm_url(data: unknown): data is EsmExternalUrl {
16
+ return is_record(data) && is_string(data.esm);
17
+ }
18
+
19
+ export type ModuleTypedExternalUrl = UmdExternalUrl | EsmExternalUrl;
20
+
21
+ export function is_module_typed_external_url(
22
+ data: unknown
23
+ ): data is ModuleTypedExternalUrl {
24
+ return is_umd_url(data) || is_esm_url(data);
25
+ }
26
+
27
+ export interface EnvExternalUrl {
28
+ dev: ModuleTypedExternalUrl | string;
29
+ prd: ModuleTypedExternalUrl | string;
30
+ }
31
+
32
+ export function is_env_external(data: unknown): data is EnvExternalUrl {
33
+ return (
34
+ is_record(data) &&
35
+ (is_string(data.dev) || is_module_typed_external_url(data.dev)) &&
36
+ (is_string(data.prd) || is_module_typed_external_url(data.prd))
37
+ );
38
+ }
39
+
40
+ export type ConfigExternalUrl =
41
+ | ModuleTypedExternalUrl
42
+ | EnvExternalUrl
43
+ | string;
44
+
45
+ export interface ImportExternal {
46
+ url: ConfigExternalUrl;
47
+ importName?: string | string[];
48
+ preset?: string;
49
+ }
50
+
51
+ export function is_url_config(data: unknown): data is ConfigExternalUrl {
52
+ return (
53
+ is_module_typed_external_url(data) ||
54
+ is_env_external(data) ||
55
+ is_string(data)
56
+ );
57
+ }
58
+
59
+ export function is_import_external(data: unknown): data is ImportExternal {
60
+ // 没有global的一概作为import的依赖
61
+ return is_record(data) && is_url_config(data.url) && !is_string(data.global);
62
+ }
63
+
64
+ export type ExternalLibs = {
65
+ [name: string]:
66
+ | ImportExternal
67
+ | ModuleTypedExternalUrl
68
+ | EnvExternalUrl
69
+ | string;
70
+ };
@@ -0,0 +1,105 @@
1
+ import { resolve } from "node:path";
2
+ import { cwd } from "node:process";
3
+ import type { ModuloArgs_Pack } from "../args/index.ts";
4
+ import { debug_log } from "../tools/debug-log.ts";
5
+ import { resolve_and_read } from "../tools/file.ts";
6
+ import { jsonparse } from "../tools/json.ts";
7
+ import { merge_user_config } from "../tools/merge-user-config.ts";
8
+ import { PANIC_IF } from "../tools/panic.ts";
9
+ import { preset_config } from "./preset/index.ts";
10
+ import { preset_minify_config } from "./preset/minify.ts";
11
+ import type { GLOBAL_CONFIG, USER_CONFIG } from "./type.ts";
12
+ /**
13
+ * 命令启动时候的目录作为根目录
14
+ */
15
+ export const root = cwd();
16
+ let global_config: GLOBAL_CONFIG;
17
+
18
+ export function get_global_config(args: ModuloArgs_Pack): GLOBAL_CONFIG {
19
+ if (!global_config) {
20
+ /**
21
+ * 读取配置文件
22
+ */
23
+
24
+ // biome-ignore lint/style/noNonNullAssertion: <有panic保护>
25
+ const user_config = jsonparse<USER_CONFIG>(
26
+ resolve_and_read(root, args.pack.config)
27
+ )!;
28
+ PANIC_IF(!user_config, "根目录下没有配置文件");
29
+ debug_log("input user config", user_config);
30
+
31
+ /**
32
+ * 将配置文件和默认配置合并
33
+ */
34
+ merge_user_config(preset_config, user_config);
35
+ const _config: GLOBAL_CONFIG = preset_config;
36
+
37
+ /**
38
+ * src目录
39
+ */
40
+ const src = resolve(root, _config.input.src);
41
+ const input = {
42
+ modules: resolve(src, _config.input.modules),
43
+ pages: resolve(src, _config.input.pages),
44
+ src: src,
45
+ };
46
+
47
+ /**
48
+ * dist目录
49
+ */
50
+ const dist = resolve(root, _config.output.dist);
51
+ const output = {
52
+ ..._config.output,
53
+ dist: dist,
54
+ modules: resolve(dist, _config.output.modules),
55
+ pages: resolve(dist, _config.output.pages),
56
+ };
57
+
58
+ /**
59
+ * 允许定制template
60
+ */
61
+ const html = _config.html?.template
62
+ ? { ..._config.html, template: resolve(root, _config.html.template) }
63
+ : _config.html;
64
+
65
+ /**
66
+ * 所有define的值都序列化以正确传入
67
+ */
68
+ const define = Object.fromEntries(
69
+ Object.entries({
70
+ ..._config.define,
71
+ "process.env.NODE_ENV": process.env.NODE_ENV,
72
+ "import.meta.env.MOUNT_ID": _config.html.root,
73
+ }).map(([k, v]) => [k, JSON.stringify(v)])
74
+ );
75
+ debug_log("当前模式", process.env.NODE_ENV);
76
+
77
+ /**
78
+ * minify代码的开关
79
+ */
80
+ const minify =
81
+ _config.minify === true ? preset_minify_config : _config.minify;
82
+
83
+ /**
84
+ * alias 允许使用{src}作为占位符,取值来自input.src
85
+ */
86
+ const alias = Object.fromEntries(
87
+ Object.entries(_config.alias).map(([k, v]) => [
88
+ k,
89
+ v.replace("{input.src}", input.src),
90
+ ])
91
+ );
92
+
93
+ global_config = {
94
+ ..._config,
95
+ define,
96
+ html,
97
+ input,
98
+ minify,
99
+ output,
100
+ alias,
101
+ };
102
+ debug_log("global config", global_config);
103
+ }
104
+ return global_config;
105
+ }
@@ -0,0 +1,27 @@
1
+ import { resolve_and_read } from "../tools/file.ts";
2
+ import { jsonparse } from "../tools/json.ts";
3
+ import { PANIC_IF } from "../tools/panic.ts";
4
+ import { root } from "./generate_config.ts";
5
+
6
+ interface PackageJson {
7
+ name: string;
8
+ dependencies: Record<string, string>;
9
+ scripts: undefined | Record<string, string>;
10
+ }
11
+ /**
12
+ * 读取package.json
13
+ */
14
+ let packagejson = null as PackageJson | null;
15
+ export function get_packagejson() {
16
+ if (!packagejson) {
17
+ // biome-ignore lint/style/noNonNullAssertion: <panic if content nullable>
18
+ packagejson = jsonparse<PackageJson>(
19
+ resolve_and_read(root, "package.json")
20
+ )!;
21
+ PANIC_IF(!packagejson, "根目录下没有package.json");
22
+ PANIC_IF(!packagejson.name, "package.json缺少name字段");
23
+ }
24
+ return packagejson;
25
+ }
26
+
27
+ export { get_global_config } from "./generate_config.ts";
@@ -0,0 +1,3 @@
1
+ export const preset_alias: Record<string, string> = {
2
+ "@": "{input.src}",
3
+ };
@@ -0,0 +1,6 @@
1
+ export const preset_dev_server_config = {
2
+ open: false as false | string[], // dev时是否自动打开指定页面
3
+ port: 8080, // 开发页面时, dev-server服务器端口
4
+ proxy: {} as Record<string, string | { target: string; pathRewrite?: Record<string, string> }>, // dev时的代理配置
5
+ };
6
+ export type DEV_SERVER_CONFIG = typeof preset_dev_server_config;
@@ -0,0 +1,12 @@
1
+ export const preset_input_dirs = {
2
+ src: "src", // 源码目录
3
+ pages: "pages", // 页面目录
4
+ modules: "modules", // 组件目录
5
+ };
6
+
7
+ export const preset_output_dirs = {
8
+ dist: "dist", // 源码目录
9
+ pages: "", // 页面目录输出目录,默认使用dist/..
10
+ modules: "modules", // 组件输出目录,默认使用dist/modules/..
11
+ filenameHash: true,
12
+ };
@@ -0,0 +1,19 @@
1
+ export interface Tag {
2
+ append?: boolean;
3
+ attrs?: Record<string, string>;
4
+ children?: string;
5
+ hash?: boolean | string;
6
+ head?: boolean;
7
+ publicPath?: string | boolean;
8
+ tag: string;
9
+ }
10
+
11
+ export const default_html_config = {
12
+ meta: {} as Record<string, string>,
13
+ root: '', // html挂载点id, 只允许id
14
+ tags: [] as Tag[],
15
+ template: '', // html模板的路径
16
+ title: '', // html标题
17
+ };
18
+
19
+ export type HTML_CONFIG = typeof default_html_config;