swpp-backends 3.0.0-alpha.3 → 3.0.0-alpha.310

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 (58) hide show
  1. package/{types → dist}/index.d.ts +5 -4
  2. package/dist/index.js +25 -17
  3. package/{types → dist}/swpp/FileParser.d.ts +11 -6
  4. package/dist/swpp/FileParser.js +27 -13
  5. package/{types → dist}/swpp/JsonBuilder.d.ts +1 -3
  6. package/dist/swpp/JsonBuilder.js +3 -7
  7. package/dist/swpp/NetworkFileHandler.js +3 -3
  8. package/{types → dist}/swpp/ResourcesScanner.d.ts +11 -14
  9. package/dist/swpp/ResourcesScanner.js +94 -70
  10. package/{types → dist}/swpp/SwCompiler.d.ts +21 -8
  11. package/dist/swpp/SwCompiler.js +49 -15
  12. package/{types → dist}/swpp/config/ConfigCluster.d.ts +98 -63
  13. package/dist/swpp/config/ConfigCluster.js +60 -48
  14. package/dist/swpp/config/ConfigLoader.d.ts +78 -0
  15. package/dist/swpp/config/ConfigLoader.js +180 -89
  16. package/dist/swpp/config/SpecialConfig.d.ts +29 -0
  17. package/dist/swpp/config/SpecialConfig.js +53 -0
  18. package/{types → dist}/swpp/database/CompilationEnv.d.ts +19 -16
  19. package/dist/swpp/database/CompilationEnv.js +41 -197
  20. package/dist/swpp/database/CompilationFileParser.d.ts +81 -0
  21. package/dist/swpp/database/CompilationFileParser.js +267 -0
  22. package/{types → dist}/swpp/database/CrossDepCode.d.ts +4 -0
  23. package/dist/swpp/database/CrossDepCode.js +27 -1
  24. package/dist/swpp/database/CrossEnv.js +19 -2
  25. package/{types → dist}/swpp/database/DomCode.d.ts +4 -1
  26. package/dist/swpp/database/DomCode.js +34 -5
  27. package/dist/swpp/database/KeyValueDatabase.d.ts +72 -0
  28. package/dist/swpp/database/KeyValueDatabase.js +122 -27
  29. package/{types → dist}/swpp/database/RuntimeCoreCode.d.ts +2 -1
  30. package/dist/swpp/database/RuntimeCoreCode.js +6 -5
  31. package/{types → dist}/swpp/database/RuntimeDepCode.d.ts +8 -14
  32. package/dist/swpp/database/RuntimeDepCode.js +30 -50
  33. package/{types → dist}/swpp/database/RuntimeEventCode.d.ts +4 -0
  34. package/dist/swpp/database/RuntimeEventCode.js +8 -1
  35. package/{types → dist}/swpp/database/RuntimeKeyValueDatabase.d.ts +1 -1
  36. package/dist/swpp/database/RuntimeKeyValueDatabase.js +2 -2
  37. package/dist/swpp/debug/CallChainRecorder.d.ts +5 -0
  38. package/dist/swpp/debug/CallChainRecorder.js +29 -0
  39. package/{types → dist}/swpp/untils.d.ts +25 -18
  40. package/dist/swpp/untils.js +47 -53
  41. package/package.json +2 -2
  42. package/types/DomBuilder.d.ts +0 -6
  43. package/types/FileAnalyzer.d.ts +0 -96
  44. package/types/ServiceWorkerBuilder.d.ts +0 -7
  45. package/types/SwppConfig.d.ts +0 -139
  46. package/types/SwppRules.d.ts +0 -117
  47. package/types/UpdateJsonBuilder.d.ts +0 -44
  48. package/types/Utils.d.ts +0 -43
  49. package/types/Variant.d.ts +0 -58
  50. package/types/VersionAnalyzer.d.ts +0 -27
  51. package/types/browser/ServiceWorkerRuntimeTypes.d.ts +0 -18
  52. package/types/swpp/RuntimeEnv.d.ts +0 -39
  53. package/types/swpp/SwCodeInject.d.ts +0 -17
  54. package/types/swpp/config/ConfigLoader.d.ts +0 -53
  55. package/types/swpp/database/KeyValueDatabase.d.ts +0 -53
  56. package/types/swpp/database/RuntimeEnv.d.ts +0 -5
  57. /package/{types → dist}/swpp/NetworkFileHandler.d.ts +0 -0
  58. /package/{types → dist}/swpp/database/CrossEnv.d.ts +0 -0
@@ -1,10 +1,13 @@
1
1
  import { CompilationEnv } from './database/CompilationEnv';
2
+ import { CompilationFileParser } from './database/CompilationFileParser';
2
3
  import { CrossDepCode } from './database/CrossDepCode';
4
+ import { DomCode } from './database/DomCode';
3
5
  import { RuntimeCoreCode } from './database/RuntimeCoreCode';
4
6
  import { RuntimeDepCode } from './database/RuntimeDepCode';
5
7
  import { CrossEnv } from './database/CrossEnv';
6
8
  import { RuntimeEventCode } from './database/RuntimeEventCode';
7
9
  import { RuntimeKeyValueDatabase } from './database/RuntimeKeyValueDatabase';
10
+ import { CallChainRecorder } from './debug/CallChainRecorder';
8
11
  export declare class SwCompiler {
9
12
  private swCode;
10
13
  /**
@@ -15,24 +18,34 @@ export declare class SwCompiler {
15
18
  /** 运行时数据 */
16
19
  export declare class RuntimeData {
17
20
  /** 控制插入顺序 */
18
- readonly insertOrder: (Exclude<keyof RuntimeData, 'insertOrder'> | string)[];
21
+ insertOrder: (Exclude<keyof RuntimeData, 'insertOrder' | 'domConfig'> | string)[];
19
22
  /** 运行时环境变量 */
20
- readonly crossEnv: CrossEnv;
23
+ crossEnv: CrossEnv;
21
24
  /** 运行时工具函数 */
22
- readonly runtimeDep: RuntimeDepCode;
25
+ runtimeDep: RuntimeDepCode;
23
26
  /** 运行时核心功能函数 */
24
- readonly runtimeCore: RuntimeCoreCode;
27
+ runtimeCore: RuntimeCoreCode;
25
28
  /** 运行时事件注册 */
26
- readonly runtimeEvent: RuntimeEventCode;
29
+ runtimeEvent: RuntimeEventCode;
27
30
  /** 运行时/编译时工具函数 */
28
- readonly crossDep: CrossDepCode;
31
+ crossDep: CrossDepCode;
32
+ /** DOM 相关设置 */
33
+ domConfig: DomCode;
34
+ /** 追踪调用链 */
35
+ debugCallChain: CallChainRecorder;
36
+ constructor(compilationData: CompilationData);
29
37
  getDatabase(key: string): RuntimeKeyValueDatabase<any, {}>;
38
+ initCompilation(compilation: CompilationData): void;
39
+ freezeAll(): void;
30
40
  }
31
41
  /** 编译时数据 */
32
- export interface CompilationData {
42
+ export declare class CompilationData {
33
43
  compilationEnv: CompilationEnv;
34
- crossEnv: CrossEnv;
35
44
  crossDep: CrossDepCode;
45
+ crossEnv: CrossEnv;
46
+ fileParser: CompilationFileParser;
47
+ initRuntime(runtime: RuntimeData): void;
48
+ freezeAll(): void;
36
49
  }
37
50
  /** 版本号信息 */
38
51
  export interface BrowserVersion {
@@ -1,11 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RuntimeData = exports.SwCompiler = void 0;
3
+ exports.CompilationData = exports.RuntimeData = exports.SwCompiler = void 0;
4
+ const CompilationEnv_1 = require("./database/CompilationEnv");
5
+ const CompilationFileParser_1 = require("./database/CompilationFileParser");
4
6
  const CrossDepCode_1 = require("./database/CrossDepCode");
7
+ const DomCode_1 = require("./database/DomCode");
8
+ const KeyValueDatabase_1 = require("./database/KeyValueDatabase");
5
9
  const RuntimeCoreCode_1 = require("./database/RuntimeCoreCode");
6
10
  const RuntimeDepCode_1 = require("./database/RuntimeDepCode");
7
11
  const CrossEnv_1 = require("./database/CrossEnv");
8
12
  const RuntimeEventCode_1 = require("./database/RuntimeEventCode");
13
+ const CallChainRecorder_1 = require("./debug/CallChainRecorder");
9
14
  const untils_1 = require("./untils");
10
15
  class SwCompiler {
11
16
  constructor() {
@@ -18,7 +23,6 @@ class SwCompiler {
18
23
  buildSwCode(runtime) {
19
24
  if (this.swCode)
20
25
  return this.swCode;
21
- runtime.runtimeDep.fixDepFunction();
22
26
  this.swCode = '(() => {' + runtime.insertOrder
23
27
  .map(it => runtime.getDatabase(it).buildJsSource())
24
28
  .join(';\n')
@@ -29,35 +33,65 @@ class SwCompiler {
29
33
  exports.SwCompiler = SwCompiler;
30
34
  /** 运行时数据 */
31
35
  class RuntimeData {
32
- constructor() {
36
+ constructor(compilationData) {
33
37
  /** 控制插入顺序 */
34
38
  this.insertOrder = [
35
39
  'crossEnv', 'crossDep', 'runtimeDep', 'runtimeCore', 'runtimeEvent'
36
40
  ];
37
- /** 运行时环境变量 */
38
- this.crossEnv = new CrossEnv_1.CrossEnv();
39
41
  /** 运行时工具函数 */
40
42
  this.runtimeDep = new RuntimeDepCode_1.RuntimeDepCode();
41
43
  /** 运行时核心功能函数 */
42
44
  this.runtimeCore = new RuntimeCoreCode_1.RuntimeCoreCode();
43
45
  /** 运行时事件注册 */
44
46
  this.runtimeEvent = new RuntimeEventCode_1.RuntimeEventCode();
45
- /** 运行时/编译时工具函数 */
46
- this.crossDep = new CrossDepCode_1.CrossDepCode();
47
+ /** DOM 相关设置 */
48
+ this.domConfig = new DomCode_1.DomCode();
49
+ /** 追踪调用链 */
50
+ this.debugCallChain = new CallChainRecorder_1.CallChainRecorder();
51
+ this.crossDep = compilationData.crossDep;
52
+ this.crossEnv = compilationData.crossEnv;
47
53
  }
48
54
  getDatabase(key) {
49
55
  if (!(key in this))
50
- throw {
51
- code: untils_1.exceptionNames.invalidKey,
52
- message: `传入的 key [${key}] 不在当前对象中存在`
53
- };
56
+ throw new untils_1.RuntimeException(untils_1.exceptionNames.invalidKey, `传入的 key [${key}] 不在当前对象中存在`);
54
57
  if (key == 'insertOrder')
55
- throw {
56
- code: untils_1.exceptionNames.invalidKey,
57
- message: `传入的 key [${key}] 非法`
58
- };
58
+ throw new untils_1.RuntimeException(untils_1.exceptionNames.invalidKey, `传入的 key [${key}] 非法`);
59
59
  // @ts-ignore
60
60
  return this[key];
61
61
  }
62
+ initCompilation(compilation) {
63
+ for (let key of this.insertOrder) {
64
+ this.getDatabase(key).initRuntimeAndCompilation(this, compilation);
65
+ }
66
+ }
67
+ freezeAll() {
68
+ this.insertOrder.forEach(it => this.getDatabase(it).freeze());
69
+ }
62
70
  }
63
71
  exports.RuntimeData = RuntimeData;
72
+ /** 编译时数据 */
73
+ class CompilationData {
74
+ constructor() {
75
+ this.compilationEnv = new CompilationEnv_1.CompilationEnv();
76
+ this.crossDep = new CrossDepCode_1.CrossDepCode();
77
+ this.crossEnv = new CrossEnv_1.CrossEnv();
78
+ this.fileParser = new CompilationFileParser_1.CompilationFileParser();
79
+ }
80
+ initRuntime(runtime) {
81
+ for (let key in this) {
82
+ const value = this[key];
83
+ if (value instanceof KeyValueDatabase_1.KeyValueDatabase) {
84
+ value.initRuntimeAndCompilation(runtime, this);
85
+ }
86
+ }
87
+ }
88
+ freezeAll() {
89
+ for (let key in this) {
90
+ const value = this[key];
91
+ if (value instanceof KeyValueDatabase_1.KeyValueDatabase) {
92
+ value.freeze();
93
+ }
94
+ }
95
+ }
96
+ }
97
+ exports.CompilationData = CompilationData;
@@ -1,31 +1,15 @@
1
+ import * as crypto from 'node:crypto';
1
2
  import { COMMON_TYPE_COMP_ENV } from '../database/CompilationEnv';
3
+ import { COMMON_TYPE_COMP_FP, FileParser } from '../database/CompilationFileParser';
2
4
  import { COMMON_TYPE_CROSS_DEP } from '../database/CrossDepCode';
3
5
  import { COMMON_TYPE_CROSS_ENV } from '../database/CrossEnv';
4
6
  import { COMMON_TYPE_DOM_CODE } from '../database/DomCode';
7
+ import { DatabaseValue } from '../database/KeyValueDatabase';
5
8
  import { COMMON_TYPE_RUNTIME_CORE } from '../database/RuntimeCoreCode';
6
9
  import { COMMON_KEY_RUNTIME_DEP, FunctionInBrowser } from '../database/RuntimeDepCode';
7
10
  import { COMMON_TYPE_RUNTIME_EVENT } from '../database/RuntimeEventCode';
8
- import { CompilationData } from '../SwCompiler';
9
- import { IndivisibleName, SwppConfigModifier } from './ConfigLoader';
10
- /** 定义一个通过 `export default` 导出的配置 */
11
- export declare function defineConfig(config: SwppConfigTemplate): SwppConfigTemplate;
12
- /** 定义一个通过 `export const compilationEnv` 导出的配置 */
13
- export declare function defineCompilationEnv(config: SwppConfigCompilationEnv): SwppConfigCompilationEnv;
14
- /** 定义一个通过 `export const crossEnv` 导出的配置 */
15
- export declare function defineCrossEnv(config: SwppConfigCrossEnv): SwppConfigCrossDep;
16
- /** 定义一个通过 `export const runtimeDep` 导出的配置 */
17
- export declare function defineRuntimeDep(config: SwppConfigRuntimeDep): SwppConfigRuntimeDep;
18
- /** 定义一个通过 `export const crossDep` 导出的配置 */
19
- export declare function defineCrossDep(config: SwppConfigCrossDep): SwppConfigCrossDep;
20
- /** 定义一个通过 `export const runtimeCore` 导出的配置 */
21
- export declare function defineRuntimeCore(config: SwppConfigRuntimeCore): SwppConfigRuntimeCore;
22
- /** 定义一个通过 `export const domConfig` 导出的配置 */
23
- export declare function defineDomConfig(config: SwppConfigDomConfig): SwppConfigDomConfig;
24
- /** 定义一个通过 `export const runtimeEvent` 导出的配置 */
25
- export declare function defineRuntimeEvent(config: SwppConfigRuntimeEvent): SwppConfigRuntimeEvent;
26
- export type IndivisibleConfig<T> = {
27
- [K in typeof IndivisibleName]: true;
28
- } & T;
11
+ import { SwppConfigModifier } from './ConfigLoader';
12
+ import { IndivisibleConfig, LazyInitConfig, NoCacheConfig, RuntimeSpecialConfig, RuntimeSupplier } from './SpecialConfig';
29
13
  /**
30
14
  * 定义一个无法分割的对象配置,这对一些强依赖对象内部属性的设置很有用,可以避免对象被错误地拼接。
31
15
  *
@@ -59,8 +43,59 @@ export type IndivisibleConfig<T> = {
59
43
  * }
60
44
  * ```
61
45
  */
62
- export declare function defineIndivisibleConfig<T extends Record<string, any>>(value: T): IndivisibleConfig<T>;
63
- type ValueOrReturnValue<T> = T | ((this: CompilationData) => T);
46
+ export declare function defineIndivisibleConfig<T extends object>(value: T): IndivisibleConfig<T>;
47
+ /**
48
+ * 定义一个不会被缓存的配置项。
49
+ *
50
+ * 默认情况下,swpp 会缓存配置项的结果,下一次读取同一个配置项时便不需要经过类型检查等操作。
51
+ *
52
+ * 有些时候可能希望每一次读取值时都动态读取,那么可以使用此方法禁用缓存。
53
+ *
54
+ * 注意:
55
+ *
56
+ * 1. 该选项禁用缓存后对于性能有些许影响,计算结果和校验的成本越高影响越大,一般情况下无显著影响。
57
+ * 2. 使用无缓存配置时也会同时禁用配置合并
58
+ *
59
+ * ---
60
+ *
61
+ * 例:
62
+ *
63
+ * ```typescript
64
+ * // config 1
65
+ * export const xxx = defineXxx({
66
+ * example: Date.now()
67
+ * })
68
+ * // config 2
69
+ * export const nnn = defineNnn({
70
+ * example: defineNoCacheConfig(() => Date.now())
71
+ * })
72
+ * ```
73
+ *
74
+ * 对于上方这个例子,第一种写法每次读取该项配置时,结果都将相同,第一次为 `123456` 那么以后永远都将是 `123456`,而对于第二种写法,则每次调用时都能动态地获取当前系统时间。
75
+ */
76
+ export declare function defineNoCacheConfig<T>(getter: RuntimeSupplier<T>): NoCacheConfig<T>;
77
+ /**
78
+ * 定义一个延迟初始化的配置项。
79
+ *
80
+ * 默认情况下,swpp 会在加载配置文件时对各项配置的值进行计算,此时就出现了一个问题,您无法在设置配置时访问其它配置内容。
81
+ *
82
+ * 如果您希望能够延后计算配置项的值以访问其它配置项,则可以使用该函数定义配置。
83
+ *
84
+ * ---
85
+ *
86
+ * 例:
87
+ *
88
+ * ```typescript
89
+ * export const xxx = defineXxx({
90
+ * example: defineLazyInitConfig((runtime, compilation) => {
91
+ * // 这里的代码将在第一次读取配置时执行
92
+ * // do something
93
+ * return <value>
94
+ * })
95
+ * })
96
+ * ```
97
+ */
98
+ export declare function defineLazyInitConfig<T>(getter: RuntimeSupplier<T>): LazyInitConfig<T>;
64
99
  /**
65
100
  * SWPP 配置模板
66
101
  *
@@ -81,15 +116,26 @@ export interface SwppConfigTemplate {
81
116
  runtimeEvent?: SwppConfigRuntimeEvent;
82
117
  /** @see {SwppConfigDomConfig} */
83
118
  domConfig?: SwppConfigDomConfig;
119
+ /** @see {SwppConfigCompilationFileParser} */
120
+ compilationFileParser?: SwppConfigCompilationFileParser;
84
121
  /** 配置编辑器 */
85
122
  modifier?: SwppConfigModifier;
86
123
  }
124
+ type OptionalMap<T> = T extends object ? {
125
+ [K in keyof T]?: T[K];
126
+ } : T;
127
+ type SwppConfigValueExp<T> = T extends RuntimeSpecialConfig<any> ? (T | OptionalMap<ReturnType<T['get']>>) : (OptionalMap<T> | RuntimeSpecialConfig<T>);
128
+ type SwppConfigHelper<R, C extends Record<string, DatabaseValue<R>>> = {
129
+ [K in keyof C]?: SwppConfigValueExp<C[K]['default']>;
130
+ } & {
131
+ [K in string]: SwppConfigValueExp<R>;
132
+ };
87
133
  /**
88
134
  * 运行时函数依赖。
89
135
  *
90
136
  * 该配置项用于放置所有仅在浏览器 SW 环境下执行的工具函数。
91
137
  *
92
- * 对于每一项配置 `<KEY>: <function>`:<KEY> 是函数名(推荐使用小写驼峰式命名),<function> 是函数体。
138
+ * 对于每一项配置 `<KEY>: <function>`:`<KEY>` 是函数名(推荐使用小写驼峰式命名),`<function>` 是函数体。
93
139
  *
94
140
  * 如果函数体中需要使用其它运行时的环境变量、函数依赖等内容,直接调用即可,
95
141
  * 如果需要避免 IDE 报错/警告,可以在配置文件中声明一些不导出的变量,以此假装上下文中存在该函数。
@@ -109,14 +155,11 @@ export interface SwppConfigTemplate {
109
155
  * }
110
156
  * // 如果为了避免 IDE 报错,还可以在文件任意一个位置编写类似的代码:
111
157
  * // let example: () => void good
112
- * // type example = () => void good
113
158
  * // let example = any 不推荐,因为丢失了类型,会影响 IDE 的自动补全和静态类型推断
114
159
  * // 或者直接在函数调用的位置使用 @ts-ignore 也可以避免报错,同样不推荐,理由同上
115
160
  * ```
116
161
  */
117
- export type SwppConfigRuntimeDep = {
118
- [K in keyof COMMON_KEY_RUNTIME_DEP | string]?: K extends keyof COMMON_KEY_RUNTIME_DEP ? COMMON_KEY_RUNTIME_DEP[K]['default'] : FunctionInBrowser<any[], any>;
119
- };
162
+ export type SwppConfigRuntimeDep = SwppConfigHelper<FunctionInBrowser<any[], any> | null, COMMON_KEY_RUNTIME_DEP>;
120
163
  /**
121
164
  * 运行时核心功能.
122
165
  *
@@ -125,22 +168,20 @@ export type SwppConfigRuntimeDep = {
125
168
  * 该配置项与 RuntimeDep 不同的是两者的定位,RuntimeDep 中主要放置一些简单的工具函数,而 RuntimeCore 则放置一些核心代码。
126
169
  * 默认情况下,RuntimeCore 也将被插入到 RuntimeDep 的后面,在一些特殊情况下可以避免一些声明顺序导致的问题。
127
170
  */
128
- export type SwppConfigRuntimeCore = {
129
- [K in keyof COMMON_TYPE_RUNTIME_CORE | string]?: K extends keyof COMMON_TYPE_RUNTIME_CORE ? COMMON_TYPE_RUNTIME_CORE[K]['default'] : FunctionInBrowser<any[], any>;
130
- };
171
+ export type SwppConfigRuntimeCore = SwppConfigHelper<FunctionInBrowser<any[], any>, COMMON_TYPE_RUNTIME_CORE>;
131
172
  /**
132
173
  * 运行时 & 编译期的函数依赖。
133
174
  *
134
175
  * 该配置项用于放置所有同时在浏览器和 NodeJs 环境下执行的工具函数。
135
176
  *
136
- * 对于每一项配置 `<KEY>: { <runOnBrowser>, <runOnNode> }`:<KEY> 是函数名,
137
- * <runOnBrowser> 是在浏览器环境下执行的代码,<runOnNode> 是在 NodeJs 环境下执行的代码。
177
+ * 对于每一项配置 `<KEY>: { <runOnBrowser>, <runOnNode> }`:`<KEY>` 是函数名,
178
+ * `<runOnBrowser>` 是在浏览器环境下执行的代码,`<runOnNode>` 是在 NodeJs 环境下执行的代码。
138
179
  *
139
180
  * 对于在浏览器环境下执行的代码,可以像 {@link SwppConfigRuntimeDep} 一样引用其它运行时的环境变量、依赖函数等内容。
140
181
  *
141
- * 对于在 NodeJs 环境下执行的代码,可以使用 `this` 调用 <runOnBrowser>(前提是 <runOnBrowser> 中没有依赖浏览器环境的代码)。
182
+ * 对于在 NodeJs 环境下执行的代码,可以使用 `this` 调用 `<runOnBrowser>`(前提是 `<runOnBrowser>` 中没有依赖浏览器环境的代码)。
142
183
  *
143
- * <runOnBrowser><runOnNode> 中的代码的行为应当完全一致。注意:此处说的行为一致是两者应当产生相同的副作用,内部具体实现可以不一样。
184
+ * `<runOnBrowser>``<runOnNode>` 中的代码的行为应当完全一致。注意:此处说的行为一致是两者应当产生相同的副作用,内部具体实现可以不一样。
144
185
  *
145
186
  * ---
146
187
  *
@@ -161,15 +202,13 @@ export type SwppConfigRuntimeCore = {
161
202
  * }
162
203
  * ```
163
204
  */
164
- export type SwppConfigCrossDep = {
165
- [K in keyof COMMON_TYPE_CROSS_DEP | string]?: K extends keyof COMMON_TYPE_CROSS_DEP ? COMMON_TYPE_CROSS_DEP[K]['default'] : any;
166
- };
205
+ export type SwppConfigCrossDep = SwppConfigHelper<any, COMMON_TYPE_CROSS_DEP>;
167
206
  /**
168
207
  * 运行时事件注册。
169
208
  *
170
209
  * 该配置项用于在 sw 中注册指定的事件,可以和 {@link SwppConfigRuntimeDep} 一样引用运行时的内容。
171
210
  *
172
- * 对于每一项配置 `<KEY>: <function>`:<KEY> 是事件名,<function> 是事件执行体。
211
+ * 对于每一项配置 `<KEY>: <function>`:`<KEY>` 是事件名,`<function>` 是事件执行体。
173
212
  *
174
213
  * ---
175
214
  *
@@ -189,17 +228,13 @@ export type SwppConfigCrossDep = {
189
228
  * }
190
229
  * ```
191
230
  */
192
- export type SwppConfigRuntimeEvent = {
193
- [K in keyof COMMON_TYPE_RUNTIME_EVENT | string]?: K extends keyof COMMON_TYPE_RUNTIME_EVENT ? COMMON_TYPE_RUNTIME_EVENT[K]['default'] : FunctionInBrowser<[Event], any>;
194
- };
231
+ export type SwppConfigRuntimeEvent = SwppConfigHelper<FunctionInBrowser<[Event], any>, COMMON_TYPE_RUNTIME_EVENT>;
195
232
  /**
196
233
  * 运行时 & 编译期环境变量。
197
234
  *
198
235
  * 该配置项用于放置需要同时在浏览器环境和 NodeJs 环境中使用的环境变量。
199
236
  *
200
- * 对于每一项配置 `<KEY>: <value | function(): value>`:<KEY> 是函数名(推荐使用大写下划线式命名),`value` 是环境变量的值。
201
- *
202
- * 环境变量中应对仅包含非函数内容,当填写的配置项为函数时,swpp 会将函数返回的内容插入到环境变量中。
237
+ * 对于每一项配置 `<KEY>: <value>`:`<KEY>` 是变量名(推荐使用大写下划线式命名),`value` 是环境变量的值,环境变量中应对仅包含非函数内容。
203
238
  *
204
239
  * 配置项填写的函数的执行环境为 NodeJs,所以不要编写依赖浏览器环境的代码。
205
240
  *
@@ -208,34 +243,34 @@ export type SwppConfigRuntimeEvent = {
208
243
  * 例:
209
244
  *
210
245
  * ```typescript
211
- * // 该代码将在 sw.js 中插入一系列常量,同时在编译期也可以动态读取
246
+ * // 该代码将在 sw.js 中插入一个常量
212
247
  * // const EXAMPLE = 'hello swpp'
213
- * // const FUN_EXAMPLE = 'fun hello swpp'
214
248
  * crossEnv: {
215
- * EXAMPLE: 'hello swpp',
216
- * FUN_EXAMPLE: function() {
217
- * return 'fun ' + this.crossEnv.read('EXAMPLE')
218
- * }
249
+ * EXAMPLE: 'hello swpp'
219
250
  * }
220
251
  * ```
221
252
  */
222
- export type SwppConfigCrossEnv = {
223
- [K in keyof COMMON_TYPE_CROSS_ENV | string]: ValueOrReturnValue<K extends keyof COMMON_TYPE_CROSS_ENV ? COMMON_TYPE_CROSS_ENV[K]['default'] : any>;
224
- };
253
+ export type SwppConfigCrossEnv = SwppConfigHelper<any, COMMON_TYPE_CROSS_ENV>;
225
254
  /**
226
255
  * 构建期使用的环境变量。
227
256
  *
228
257
  * 该配置项用于放置仅需要在 NodeJs 环境中使用的环境变量。
229
258
  *
230
- * 对于每一项配置 `<KEY>: <value | function(): value>`:<KEY> 是函数名(推荐使用大写下划线式命名),`value` 是环境变量的值。
231
- *
232
- * 环境变量中应对仅包含非函数内容,当填写的配置项为函数时,swpp 会将函数返回的内容插入到环境变量中。
259
+ * 对于每一项配置 `<KEY>: <value | function(): value>`:`<KEY>` 是属性名(推荐函数使用小写驼峰,常量使用大写下划线式命名),`<value>` 是环境变量的值。
233
260
  *
234
261
  * 该环境变量中的代码在 NodeJs 环境下执行,执行结果不会被放入 sw.js 中。
235
262
  */
236
- export type SwppConfigCompilationEnv = {
237
- [K in keyof COMMON_TYPE_COMP_ENV | string]?: K extends keyof COMMON_TYPE_COMP_ENV ? COMMON_TYPE_COMP_ENV[K]['default'] : any;
238
- };
263
+ export type SwppConfigCompilationEnv = SwppConfigHelper<any, COMMON_TYPE_COMP_ENV>;
264
+ /**
265
+ * 构建期使用的文件处理器。
266
+ *
267
+ * 该配置项用于放置需要在 NodeJs 环境中使用的文件处理器。
268
+ *
269
+ * 对于每一项配置 `<KEY>: <FileParser>`: <KEY> 是文件拓展名(不包括 `.`),<FileParser> 是处理机。
270
+ *
271
+ * @see {FileParser}
272
+ */
273
+ export type SwppConfigCompilationFileParser = SwppConfigHelper<FileParser<crypto.BinaryLike>, COMMON_TYPE_COMP_FP>;
239
274
  /**
240
275
  * 运行时使用的常量、函数。
241
276
  *
@@ -244,8 +279,8 @@ export type SwppConfigCompilationEnv = {
244
279
  * 对于每一项配置 `<KEY>: <value>`:<KEY> 是常量名或函数名,常量推荐大写下划线命名,函数推荐小写驼峰命名,<value> 是值。
245
280
  *
246
281
  * 该配置项中的值只能使用本配置项中包含的内容,不能使用其它编译期、运行期的内容。
282
+ *
283
+ * 该配置项中所有以 `_inline` 开头的内容必须为 `() => void` 类型的函数,其将会以 `(function content)()` 的形式在插入的位置执行。
247
284
  */
248
- export type SwppConfigDomConfig = {
249
- [K in keyof COMMON_TYPE_DOM_CODE | string]?: K extends keyof COMMON_TYPE_DOM_CODE ? COMMON_TYPE_DOM_CODE[K]['default'] : any;
250
- };
285
+ export type SwppConfigDomConfig = SwppConfigHelper<any, COMMON_TYPE_DOM_CODE>;
251
286
  export {};
@@ -1,47 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defineConfig = defineConfig;
4
- exports.defineCompilationEnv = defineCompilationEnv;
5
- exports.defineCrossEnv = defineCrossEnv;
6
- exports.defineRuntimeDep = defineRuntimeDep;
7
- exports.defineCrossDep = defineCrossDep;
8
- exports.defineRuntimeCore = defineRuntimeCore;
9
- exports.defineDomConfig = defineDomConfig;
10
- exports.defineRuntimeEvent = defineRuntimeEvent;
11
3
  exports.defineIndivisibleConfig = defineIndivisibleConfig;
12
- const ConfigLoader_1 = require("./ConfigLoader");
13
- /** 定义一个通过 `export default` 导出的配置 */
14
- function defineConfig(config) {
15
- return config;
16
- }
17
- /** 定义一个通过 `export const compilationEnv` 导出的配置 */
18
- function defineCompilationEnv(config) {
19
- return config;
20
- }
21
- /** 定义一个通过 `export const crossEnv` 导出的配置 */
22
- function defineCrossEnv(config) {
23
- return config;
24
- }
25
- /** 定义一个通过 `export const runtimeDep` 导出的配置 */
26
- function defineRuntimeDep(config) {
27
- return config;
28
- }
29
- /** 定义一个通过 `export const crossDep` 导出的配置 */
30
- function defineCrossDep(config) {
31
- return config;
32
- }
33
- /** 定义一个通过 `export const runtimeCore` 导出的配置 */
34
- function defineRuntimeCore(config) {
35
- return config;
36
- }
37
- /** 定义一个通过 `export const domConfig` 导出的配置 */
38
- function defineDomConfig(config) {
39
- return config;
40
- }
41
- /** 定义一个通过 `export const runtimeEvent` 导出的配置 */
42
- function defineRuntimeEvent(config) {
43
- return config;
44
- }
4
+ exports.defineNoCacheConfig = defineNoCacheConfig;
5
+ exports.defineLazyInitConfig = defineLazyInitConfig;
6
+ const SpecialConfig_1 = require("./SpecialConfig");
45
7
  /**
46
8
  * 定义一个无法分割的对象配置,这对一些强依赖对象内部属性的设置很有用,可以避免对象被错误地拼接。
47
9
  *
@@ -76,11 +38,61 @@ function defineRuntimeEvent(config) {
76
38
  * ```
77
39
  */
78
40
  function defineIndivisibleConfig(value) {
79
- Object.defineProperty(value, ConfigLoader_1.IndivisibleName, {
80
- value: true,
81
- writable: false,
82
- configurable: false,
83
- enumerable: false
84
- });
85
- return value;
41
+ return new SpecialConfig_1.IndivisibleConfig(value);
42
+ }
43
+ /**
44
+ * 定义一个不会被缓存的配置项。
45
+ *
46
+ * 默认情况下,swpp 会缓存配置项的结果,下一次读取同一个配置项时便不需要经过类型检查等操作。
47
+ *
48
+ * 有些时候可能希望每一次读取值时都动态读取,那么可以使用此方法禁用缓存。
49
+ *
50
+ * 注意:
51
+ *
52
+ * 1. 该选项禁用缓存后对于性能有些许影响,计算结果和校验的成本越高影响越大,一般情况下无显著影响。
53
+ * 2. 使用无缓存配置时也会同时禁用配置合并
54
+ *
55
+ * ---
56
+ *
57
+ * 例:
58
+ *
59
+ * ```typescript
60
+ * // config 1
61
+ * export const xxx = defineXxx({
62
+ * example: Date.now()
63
+ * })
64
+ * // config 2
65
+ * export const nnn = defineNnn({
66
+ * example: defineNoCacheConfig(() => Date.now())
67
+ * })
68
+ * ```
69
+ *
70
+ * 对于上方这个例子,第一种写法每次读取该项配置时,结果都将相同,第一次为 `123456` 那么以后永远都将是 `123456`,而对于第二种写法,则每次调用时都能动态地获取当前系统时间。
71
+ */
72
+ function defineNoCacheConfig(getter) {
73
+ return new SpecialConfig_1.NoCacheConfig(getter);
74
+ }
75
+ /**
76
+ * 定义一个延迟初始化的配置项。
77
+ *
78
+ * 默认情况下,swpp 会在加载配置文件时对各项配置的值进行计算,此时就出现了一个问题,您无法在设置配置时访问其它配置内容。
79
+ *
80
+ * 如果您希望能够延后计算配置项的值以访问其它配置项,则可以使用该函数定义配置。
81
+ *
82
+ * ---
83
+ *
84
+ * 例:
85
+ *
86
+ * ```typescript
87
+ * export const xxx = defineXxx({
88
+ * example: defineLazyInitConfig((runtime, compilation) => {
89
+ * // 这里的代码将在第一次读取配置时执行
90
+ * // do something
91
+ * return <value>
92
+ * })
93
+ * })
94
+ * ```
95
+ */
96
+ function defineLazyInitConfig(getter) {
97
+ return new SpecialConfig_1.LazyInitConfig(getter);
86
98
  }
@@ -0,0 +1,78 @@
1
+ import { CompilationData, RuntimeData } from '../SwCompiler';
2
+ import { SwppConfigCompilationEnv, SwppConfigCompilationFileParser, SwppConfigCrossDep, SwppConfigCrossEnv, SwppConfigDomConfig, SwppConfigRuntimeCore, SwppConfigRuntimeDep, SwppConfigRuntimeEvent, SwppConfigTemplate } from './ConfigCluster';
3
+ export declare class ConfigLoader {
4
+ /** 支持的拓展名列表 */
5
+ private static readonly extensions;
6
+ private static jiti;
7
+ private static prevTask;
8
+ private config;
9
+ private modifierList;
10
+ constructor();
11
+ /**
12
+ * 加载一个配置文件,越早加载的优先级越高
13
+ * @param file 配置文件的绝对路径
14
+ */
15
+ load(file: string): Promise<void>;
16
+ /**
17
+ * 加载一个在代码层面编写的配置
18
+ */
19
+ loadFromCode(config: SwppConfigTemplate): Promise<void>;
20
+ private static waitLoad;
21
+ /** 将配置项的内容写入到环境中 */
22
+ generate(): Readonly<{
23
+ runtime: RuntimeData;
24
+ compilation: CompilationData;
25
+ }>;
26
+ /** 将新配置合并到已有配置中 */
27
+ private static mergeConfig;
28
+ }
29
+ /**
30
+ * 配置编辑器
31
+ */
32
+ export interface SwppConfigModifier {
33
+ /**
34
+ * 自定义运行时和编译期的属性表
35
+ *
36
+ * 优先级越高越优先生效
37
+ */
38
+ build?: () => {
39
+ runtime: RuntimeData;
40
+ compilation: CompilationData;
41
+ };
42
+ /**
43
+ * 本函数用于向系统注册新的属性。
44
+ *
45
+ * 该函数内应当只调用 xxx.append 函数及其它工具函数,非必要不应当包含其它有副作用的操作。
46
+ *
47
+ * 优先级越低该函数越早执行。
48
+ */
49
+ registry?: (runtime: RuntimeData, compilation: CompilationData) => void;
50
+ /**
51
+ * 本函数用于动态修改属性的值。
52
+ *
53
+ * 该函数内应当只调用 xxx.update 函数及其它工具函数,非必要不应当包含其它有副作用的操作。
54
+ *
55
+ * 优先级越低该函数越早执行
56
+ */
57
+ dynamicUpdate?: (runtime: RuntimeData, compilation: CompilationData) => void;
58
+ }
59
+ /** 定义一个通过 `export default` 导出的配置 */
60
+ export declare function defineConfig(config: SwppConfigTemplate): void;
61
+ /** 定义一个通过 `export const compilationEnv` 导出的配置 */
62
+ export declare function defineCompilationEnv(config: SwppConfigCompilationEnv): void;
63
+ /** 定义一个通过 `export const compilationFileParser` 导出的配置 */
64
+ export declare function defineCompilationFP(config: SwppConfigCompilationFileParser): void;
65
+ /** 定义一个通过 `export const crossEnv` 导出的配置 */
66
+ export declare function defineCrossEnv(config: SwppConfigCrossEnv): void;
67
+ /** 定义一个通过 `export const runtimeDep` 导出的配置 */
68
+ export declare function defineRuntimeDep(config: SwppConfigRuntimeDep): void;
69
+ /** 定义一个通过 `export const crossDep` 导出的配置 */
70
+ export declare function defineCrossDep(config: SwppConfigCrossDep): void;
71
+ /** 定义一个通过 `export const runtimeCore` 导出的配置 */
72
+ export declare function defineRuntimeCore(config: SwppConfigRuntimeCore): void;
73
+ /** 定义一个通过 `export const domConfig` 导出的配置 */
74
+ export declare function defineDomConfig(config: SwppConfigDomConfig): void;
75
+ /** 定义一个通过 `export const runtimeEvent` 导出的配置 */
76
+ export declare function defineRuntimeEvent(config: SwppConfigRuntimeEvent): void;
77
+ /** 定义一个通过 `export const modifier` 导出的配置 */
78
+ export declare function defineModifier(config: SwppConfigModifier): void;