@eggjs/core 7.0.0-beta.20 → 7.0.0-beta.22

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.
@@ -0,0 +1,113 @@
1
+ import { debuglog } from 'node:util';
2
+ import path from 'node:path';
3
+ import fs from 'node:fs';
4
+ import { stat } from 'node:fs/promises';
5
+ import BuiltinModule from 'node:module';
6
+ import { importResolve, importModule } from '@eggjs/utils';
7
+ const debug = debuglog('egg/core/utils');
8
+ // Guard against poorly mocked module constructors.
9
+ const Module = typeof module !== 'undefined' && module.constructor.length > 1
10
+ ? module.constructor
11
+ : /* istanbul ignore next */
12
+ BuiltinModule;
13
+ const extensions = Module._extensions;
14
+ const extensionNames = Object.keys(extensions).concat(['.cjs', '.mjs']);
15
+ debug('Module extensions: %j', extensionNames);
16
+ function getCalleeFromStack(withLine, stackIndex) {
17
+ stackIndex = stackIndex === undefined ? 2 : stackIndex;
18
+ const limit = Error.stackTraceLimit;
19
+ const prep = Error.prepareStackTrace;
20
+ Error.prepareStackTrace = prepareObjectStackTrace;
21
+ Error.stackTraceLimit = 5;
22
+ // capture the stack
23
+ const obj = {};
24
+ Error.captureStackTrace(obj);
25
+ let callSite = obj.stack[stackIndex];
26
+ let fileName = '';
27
+ if (callSite) {
28
+ // egg-mock will create a proxy
29
+ // https://github.com/eggjs/egg-mock/blob/master/lib/app.js#L174
30
+ fileName = callSite.getFileName();
31
+ /* istanbul ignore if */
32
+ if (fileName && fileName.endsWith('egg-mock/lib/app.js')) {
33
+ // TODO: add test
34
+ callSite = obj.stack[stackIndex + 1];
35
+ fileName = callSite.getFileName();
36
+ }
37
+ }
38
+ Error.prepareStackTrace = prep;
39
+ Error.stackTraceLimit = limit;
40
+ if (!callSite || !fileName)
41
+ return '<anonymous>';
42
+ if (!withLine)
43
+ return fileName;
44
+ return `${fileName}:${callSite.getLineNumber()}:${callSite.getColumnNumber()}`;
45
+ }
46
+ export default {
47
+ deprecated(message) {
48
+ if (debug.enabled) {
49
+ console.trace('[@eggjs/core/deprecated] %s', message);
50
+ }
51
+ else {
52
+ console.log('[@eggjs/core/deprecated] %s', message);
53
+ console.log('[@eggjs/core/deprecated] set NODE_DEBUG=@eggjs/core/utils can show call stack');
54
+ }
55
+ },
56
+ extensions,
57
+ extensionNames,
58
+ async existsPath(filepath) {
59
+ try {
60
+ await stat(filepath);
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ },
67
+ async loadFile(filepath) {
68
+ debug('[loadFile:start] filepath: %s', filepath);
69
+ try {
70
+ // if not js module, just return content buffer
71
+ const extname = path.extname(filepath);
72
+ if (extname && !extensionNames.includes(extname) && extname !== '.ts') {
73
+ return fs.readFileSync(filepath);
74
+ }
75
+ const obj = await importModule(filepath, { importDefaultOnly: true });
76
+ return obj;
77
+ }
78
+ catch (e) {
79
+ if (!(e instanceof Error)) {
80
+ // ts error: test/fixtures/apps/app-ts/app/extend/context.ts(5,17): error TS2339: Property 'url' does not exist on type 'Context'
81
+ console.trace(e);
82
+ throw e;
83
+ }
84
+ const err = new Error(`[egg/core] load file: ${filepath}, error: ${e.message}`);
85
+ err.cause = e;
86
+ debug('[loadFile] handle %s error: %s', filepath, e);
87
+ throw err;
88
+ }
89
+ },
90
+ resolvePath(filepath, options) {
91
+ return importResolve(filepath, options);
92
+ },
93
+ methods: ['head', 'options', 'get', 'put', 'patch', 'post', 'delete'],
94
+ async callFn(fn, args, ctx) {
95
+ args = args || [];
96
+ if (typeof fn !== 'function')
97
+ return;
98
+ return ctx ? fn.call(ctx, ...args) : fn(...args);
99
+ },
100
+ getCalleeFromStack,
101
+ getResolvedFilename(filepath, baseDir) {
102
+ const reg = /[/\\]/g;
103
+ return filepath.replace(baseDir + path.sep, '').replace(reg, '/');
104
+ },
105
+ };
106
+ /**
107
+ * Capture call site stack from v8.
108
+ * https://github.com/v8/v8/wiki/Stack-Trace-API
109
+ */
110
+ function prepareObjectStackTrace(_obj, stack) {
111
+ return stack;
112
+ }
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLGFBQWEsTUFBTSxhQUFhLENBQUM7QUFFeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFJekMsbURBQW1EO0FBQ25ELE1BQU0sTUFBTSxHQUNWLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDO0lBQzVELENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVztJQUNwQixDQUFDLENBQUMsMEJBQTBCO1FBQzFCLGFBQWEsQ0FBQztBQUVwQixNQUFNLFVBQVUsR0FBSSxNQUFjLENBQUMsV0FBVyxDQUFDO0FBQy9DLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDeEUsS0FBSyxDQUFDLHVCQUF1QixFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBRS9DLFNBQVMsa0JBQWtCLENBQUMsUUFBa0IsRUFBRSxVQUFtQjtJQUNqRSxVQUFVLEdBQUcsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztJQUNwQyxNQUFN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
@@ -0,0 +1,13 @@
1
+ export interface SequencifyResult {
2
+ sequence: string[];
3
+ requires: Record<string, true>;
4
+ }
5
+ export interface SequencifyTask {
6
+ dependencies: string[];
7
+ optionalDependencies: string[];
8
+ }
9
+ export declare function sequencify(tasks: Record<string, SequencifyTask>, names: string[]): {
10
+ sequence: string[];
11
+ missingTasks: string[];
12
+ recursiveDependencies: string[];
13
+ };
@@ -0,0 +1,60 @@
1
+ import { debuglog } from 'node:util';
2
+ const debug = debuglog('egg/core/utils/sequencify');
3
+ function sequence(
4
+ // oxlint-disable-next-line max-params
5
+ tasks, names, result, missing, recursive, nest, optional, parent) {
6
+ for (const name of names) {
7
+ if (result.requires[name]) {
8
+ continue;
9
+ }
10
+ const node = tasks[name];
11
+ if (!node) {
12
+ if (optional === true) {
13
+ continue;
14
+ }
15
+ missing.push(name);
16
+ }
17
+ else if (nest.includes(name)) {
18
+ nest.push(name);
19
+ recursive.push(...nest.slice(0));
20
+ nest.pop();
21
+ }
22
+ else if (node.dependencies.length > 0 || node.optionalDependencies.length > 0) {
23
+ nest.push(name);
24
+ if (node.dependencies.length > 0) {
25
+ sequence(tasks, node.dependencies, result, missing, recursive, nest, optional, name);
26
+ }
27
+ if (node.optionalDependencies.length > 0) {
28
+ sequence(tasks, node.optionalDependencies, result, missing, recursive, nest, true, name);
29
+ }
30
+ nest.pop();
31
+ }
32
+ if (!optional) {
33
+ result.requires[name] = true;
34
+ debug('task: %s is enabled by %s', name, parent);
35
+ }
36
+ if (!result.sequence.includes(name)) {
37
+ result.sequence.push(name);
38
+ }
39
+ }
40
+ }
41
+ // tasks: object with keys as task names
42
+ // names: array of task names
43
+ export function sequencify(tasks, names) {
44
+ const result = {
45
+ sequence: [],
46
+ requires: {},
47
+ }; // the final sequence
48
+ const missing = []; // missing tasks
49
+ const recursive = []; // recursive task dependencies
50
+ sequence(tasks, names, result, missing, recursive, [], false, 'app');
51
+ if (missing.length > 0 || recursive.length > 0) {
52
+ result.sequence = []; // results are incomplete at best, completely wrong at worst, remove them to avoid confusion
53
+ }
54
+ return {
55
+ sequence: result.sequence.filter(item => result.requires[item]),
56
+ missingTasks: missing,
57
+ recursiveDependencies: recursive,
58
+ };
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2lmeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zZXF1ZW5jaWZ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFZcEQsU0FBUyxRQUFRO0FBQ2Ysc0NBQXNDO0FBQ3RDLEtBQXFDLEVBQ3JDLEtBQWUsRUFDZixNQUF3QixFQUN4QixPQUFpQixFQUNqQixTQUFtQixFQUNuQixJQUFjLEVBQ2QsUUFBaUIsRUFDakIsTUFBYztJQUVkLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDMUIsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3RCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNiLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkYsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRixDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2IsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzdCLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELHdDQUF3QztBQUN4Qyw2QkFBNkI7QUFDN0IsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFxQyxFQUFFLEtBQWU7SUFDL0UsTUFBTSxNQUFNLEdBQXFCO1FBQy9CLFFBQVEsRUFBRSxFQUFFO1FBQ1osUUFBUSxFQUFFLEVBQUU7S0FDYixDQUFDLENBQUMscUJBQXFCO0lBQ3hCLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtJQUM5QyxNQUFNLFNBQVMsR0FBYSxFQUFFLENBQUMsQ0FBQyw4QkFBOEI7SUFFOUQsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVyRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDL0MsTUFBTSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyw0RkFBNEY7SUFDcEgsQ0FBQztJQUVELE9BQU87UUFDTCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9ELFlBQVksRUFBRSxPQUFPO1FBQ3JCLHFCQUFxQixFQUFFLFNBQVM7S0FDakMsQ0FBQztBQUNKLENBQUMifQ==
@@ -0,0 +1,21 @@
1
+ export interface TimingItem {
2
+ name: string;
3
+ start: number;
4
+ end?: number;
5
+ duration?: number;
6
+ pid: number;
7
+ index: number;
8
+ }
9
+ export declare class Timing {
10
+ #private;
11
+ constructor();
12
+ init(): void;
13
+ start(name?: string, start?: number): TimingItem | undefined;
14
+ end(name?: string): TimingItem | undefined;
15
+ enable(): void;
16
+ disable(): void;
17
+ clear(): void;
18
+ toJSON(): TimingItem[];
19
+ itemToString(timelineEnd: number, item: TimingItem, times: number): string;
20
+ toString(prefix?: string, width?: number): string;
21
+ }
@@ -0,0 +1,92 @@
1
+ import { EOL } from 'node:os';
2
+ import { debuglog } from 'node:util';
3
+ import assert from 'node:assert';
4
+ const debug = debuglog('egg/core/utils/timing');
5
+ export class Timing {
6
+ #enable;
7
+ #startTime;
8
+ #map;
9
+ #list;
10
+ constructor() {
11
+ this.#enable = true;
12
+ this.#map = new Map();
13
+ this.#list = [];
14
+ this.init();
15
+ }
16
+ init() {
17
+ // process start time
18
+ this.start('Process Start', Date.now() - Math.floor(process.uptime() * 1000));
19
+ this.end('Process Start');
20
+ if ('scriptStartTime' in process && typeof process.scriptStartTime === 'number') {
21
+ // js script start execute time
22
+ this.start('Script Start', process.scriptStartTime);
23
+ this.end('Script Start');
24
+ }
25
+ }
26
+ start(name, start) {
27
+ if (!name || !this.#enable)
28
+ return;
29
+ if (this.#map.has(name)) {
30
+ this.end(name);
31
+ }
32
+ start = start || Date.now();
33
+ if (!this.#startTime) {
34
+ this.#startTime = start;
35
+ }
36
+ const item = {
37
+ name,
38
+ start,
39
+ pid: process.pid,
40
+ index: this.#list.length,
41
+ };
42
+ this.#map.set(name, item);
43
+ this.#list.push(item);
44
+ debug('start %j', item);
45
+ return item;
46
+ }
47
+ end(name) {
48
+ if (!name || !this.#enable)
49
+ return;
50
+ const item = this.#map.get(name);
51
+ assert(item, `should run timing.start('${name}') first`);
52
+ item.end = Date.now();
53
+ item.duration = item.end - item.start;
54
+ debug('end %j', item);
55
+ return item;
56
+ }
57
+ enable() {
58
+ this.#enable = true;
59
+ }
60
+ disable() {
61
+ this.#enable = false;
62
+ }
63
+ clear() {
64
+ this.#map.clear();
65
+ this.#list = [];
66
+ }
67
+ toJSON() {
68
+ return this.#list;
69
+ }
70
+ itemToString(timelineEnd, item, times) {
71
+ const isEnd = typeof item.duration === 'number';
72
+ const duration = isEnd ? item.duration : timelineEnd - item.start;
73
+ const offset = item.start - this.#startTime;
74
+ const status = `${duration}ms${isEnd ? '' : ' NOT_END'}`;
75
+ const timespan = Math.floor(Number((offset * times).toFixed(6)));
76
+ let timeline = Math.floor(Number((duration * times).toFixed(6)));
77
+ timeline = timeline > 0 ? timeline : 1; // make sure there is at least one unit
78
+ const message = `#${item.index} ${item.name}`;
79
+ return ' '.repeat(timespan) + '▇'.repeat(timeline) + ` [${status}] - ${message}`;
80
+ }
81
+ toString(prefix = 'egg start timeline:', width = 50) {
82
+ const timelineEnd = Date.now();
83
+ const timelineDuration = timelineEnd - this.#startTime;
84
+ let times = 1;
85
+ if (timelineDuration > width) {
86
+ times = width / timelineDuration;
87
+ }
88
+ // follow https://github.com/node-modules/time-profile/blob/master/lib/profiler.js#L88
89
+ return prefix + EOL + this.#list.map(item => this.itemToString(timelineEnd, item, times)).join(EOL);
90
+ }
91
+ }
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3RpbWluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBRWpDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBV2hELE1BQU0sT0FBTyxNQUFNO0lBQ2pCLE9BQU8sQ0FBVTtJQUNqQixVQUFVLENBQVM7SUFDbkIsSUFBSSxDQUEwQjtJQUM5QixLQUFLLENBQWU7SUFDcEI7UUFDRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUk7UUFDRixxQkFBcUI7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUxQixJQUFJLGlCQUFpQixJQUFJLE9BQU8sSUFBSSxPQUFPLE9BQU8sQ0FBQyxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEYsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eggjs/core",
3
- "version": "7.0.0-beta.20",
3
+ "version": "7.0.0-beta.22",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -45,10 +45,10 @@
45
45
  "ready-callback": "^4.0.0",
46
46
  "tsconfig-paths": "^4.2.0",
47
47
  "utility": "^2.5.0",
48
- "@eggjs/koa": "3.1.0-beta.20",
49
- "@eggjs/utils": "5.0.0-beta.20",
50
- "@eggjs/router": "4.0.0-beta.20",
51
- "@eggjs/extend2": "5.0.0-beta.20"
48
+ "@eggjs/koa": "3.1.0-beta.22",
49
+ "@eggjs/router": "4.0.0-beta.22",
50
+ "@eggjs/extend2": "5.0.0-beta.22",
51
+ "@eggjs/utils": "5.0.0-beta.22"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/js-yaml": "4",
@@ -62,12 +62,12 @@
62
62
  "tsdown": "^0.15.4",
63
63
  "typescript": "^5.9.3",
64
64
  "urllib": "^4.8.2",
65
- "@eggjs/supertest": "9.0.0-beta.20",
66
- "@eggjs/tsconfig": "3.1.0-beta.20",
67
- "@eggjs/mock": "7.0.0-beta.20"
65
+ "@eggjs/mock": "7.0.0-beta.22",
66
+ "@eggjs/supertest": "9.0.0-beta.22",
67
+ "@eggjs/tsconfig": "3.1.0-beta.22"
68
68
  },
69
69
  "scripts": {
70
- "build": "tsdown",
70
+ "build": "tsdown && rimraf dist && tsc -b --clean && tsc",
71
71
  "lint": "oxlint",
72
72
  "typecheck": "tsc --noEmit",
73
73
  "test": "vitest run"