Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
IndexMap
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
4 / 4
6
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 outputFile
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 addEncodedMap
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
1
 getMap
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2/**
3 * Copyright 2023 Wikimedia Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * @file
18 * @license Apache-2.0
19 * @license MIT
20 * @license GPL-2.0-or-later
21 * @license LGPL-2.1-or-later
22 */
23
24namespace Wikimedia\Minify;
25
26/**
27 * A class representing an index map, as defined by the source map
28 * specification. This allows several mapped sources to be combined into a
29 * single file.
30 */
31class IndexMap {
32    /** @var string|null */
33    private $file;
34    /** @var IndexMapOffset */
35    private $offset;
36    /** @var array */
37    private $sections;
38
39    /**
40     * Create an empty index map
41     */
42    public function __construct() {
43        $this->offset = new IndexMapOffset( 0, 0 );
44        $this->sections = [];
45    }
46
47    /**
48     * Set the name of the output file, to be given as the "file" key.
49     *
50     * @param string $file
51     * @return $this
52     */
53    public function outputFile( string $file ) {
54        $this->file = $file;
55        return $this;
56    }
57
58    /**
59     * Add a section with a source map which was encoded in the "raw" JSON format.
60     *
61     * @param string $mapJson The JSON-encoded source map.
62     * @param IndexMapOffset $generatedSize The size of the generated output
63     *   corresponding to $mapJson. This is used to advance the current offset
64     *   and will be used to calculate the offset of the next section, if there
65     *   is one.
66     * @return $this
67     */
68    public function addEncodedMap( string $mapJson, IndexMapOffset $generatedSize ) {
69        $this->sections[] =
70            '{"offset":' .
71             json_encode( [
72                'line' => $this->offset->line,
73                'column' => $this->offset->column,
74            ] ) .
75            ',"map":' .
76            $mapJson .
77            '}';
78        $this->offset->add( $generatedSize );
79        return $this;
80    }
81
82    /**
83     * Get the index map, encoded as JSON
84     *
85     * @return string
86     */
87    public function getMap(): string {
88        $map = "{\n" .
89            "\"version\": 3,\n";
90        if ( $this->file !== null ) {
91            $map .= '"file": ' . json_encode( $this->file ) . ",\n";
92        }
93        $map .= "\"sections\": [\n";
94        if ( $this->sections ) {
95            $map .= implode( ",\n", $this->sections ) . "\n";
96        }
97        $map .= "]\n}";
98        return $map;
99    }
100}