马宇豪
2024-07-16 f591c27b57e2418c9495bc02ae8cfff84d35bc18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
    MIT License http://www.opensource.org/licenses/mit-license.php
    Author Tobias Koppers @sokra
*/
 
"use strict";
 
const { register } = require("../util/serialization");
 
/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
/** @typedef {import("../util/Hash")} Hash */
/** @typedef {import("./JsonModulesPlugin").RawJsonData} RawJsonData */
 
class JsonData {
    /**
     * @param {Buffer | RawJsonData} data JSON data
     */
    constructor(data) {
        /** @type {Buffer | undefined} */
        this._buffer = undefined;
        /** @type {RawJsonData | undefined} */
        this._data = undefined;
        if (Buffer.isBuffer(data)) {
            this._buffer = data;
        } else {
            this._data = data;
        }
    }
 
    /**
     * @returns {RawJsonData|undefined} Raw JSON data
     */
    get() {
        if (this._data === undefined && this._buffer !== undefined) {
            this._data = JSON.parse(this._buffer.toString());
        }
        return this._data;
    }
 
    /**
     * @param {Hash} hash hash to be updated
     * @returns {Hash} the updated hash
     */
    updateHash(hash) {
        if (this._buffer === undefined && this._data !== undefined) {
            this._buffer = Buffer.from(JSON.stringify(this._data));
        }
 
        if (this._buffer) return hash.update(this._buffer);
    }
}
 
register(JsonData, "webpack/lib/json/JsonData", null, {
    /**
     * @param {JsonData} obj JSONData object
     * @param {ObjectSerializerContext} context context
     */
    serialize(obj, { write }) {
        if (obj._buffer === undefined && obj._data !== undefined) {
            obj._buffer = Buffer.from(JSON.stringify(obj._data));
        }
        write(obj._buffer);
    },
    /**
     * @param {ObjectDeserializerContext} context context
     * @returns {JsonData} deserialized JSON data
     */
    deserialize({ read }) {
        return new JsonData(read());
    }
});
 
module.exports = JsonData;