Compare commits
No commits in common. "master" and "dev" have entirely different histories.
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
/node_modules
|
|
||||||
/.gitignore
|
|
@ -3,6 +3,5 @@
|
|||||||
<component name="VcsDirectoryMappings">
|
<component name="VcsDirectoryMappings">
|
||||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/unpackage/dist/dev/mp-weixin" vcs="Git" />
|
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
56
App.vue
56
App.vue
@ -1,47 +1,17 @@
|
|||||||
<script>
|
<script>
|
||||||
import tabBar from "./util/tabbar";
|
export default {
|
||||||
|
onLaunch: function() {
|
||||||
export default {
|
console.log('App Launch')
|
||||||
onLaunch: function(options) {
|
},
|
||||||
/* if (['pages/confirm-order/index'].includes(options.path)){
|
onShow: function() {
|
||||||
uni.redirectTo({
|
console.log('App Show')
|
||||||
url: `pages/consignment-painting/index?type=confirm`
|
},
|
||||||
})
|
onHide: function() {
|
||||||
}
|
console.log('App Hide')
|
||||||
console.log(options,'options')*/
|
}
|
||||||
// uni.setStorageSync("token",'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJRCI6MCwiT3BlbklkIjoib01qYXY2NjlHMEtKcFlKNE1qWGhyNEh5cHhBUSIsIk5pY2tOYW1lIjoi5YiY5bCP5benIiwiVGVsTnVtIjoiMTUyNjI0ODE0OTgiLCJBdmF0YXIiOiJodHRwczovL2NkbnMuZm9udHJlZS5jbi9pbnZlbnRvcnkvZmlsZXMvaW1nL2MzNWQ1ODVhLTVjNTMtMTFlZS04OGRmLTAyNDJhYzEzMDAyNS5qcGciLCJJRE51bSI6IjMyMDMyNDE5OTAwNTA5NjY0WCIsImV4cCI6MTY5NTgxMTk4NCwiaXNzIjoibWFsbCJ9.QDDAiN5xFtL7BelKfgbnej_nO52T_UxQ7GFicHnQA2U')
|
}
|
||||||
uni.hideTabBar();
|
|
||||||
uni.setStorageSync("tabBar", tabBar);
|
|
||||||
},
|
|
||||||
onShow: function() {
|
|
||||||
console.log("App Show");
|
|
||||||
},
|
|
||||||
onHide: function() {
|
|
||||||
console.log("App Hide");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style>
|
||||||
/*每个页面公共css */
|
/*每个页面公共css */
|
||||||
@import "./tm-vuetify/mian.min.css";
|
|
||||||
@import "./tm-vuetify/scss/theme.css";
|
|
||||||
@import "uview-ui/index.scss";
|
|
||||||
.u-upload__wrap{
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
.u-tabbar__content{
|
|
||||||
height: 166rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.u-upload__button{
|
|
||||||
width: 404rpx!important;
|
|
||||||
height: 306rpx!important;
|
|
||||||
}
|
|
||||||
.u-transition{
|
|
||||||
z-index: 999!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
21
LICENSE
21
LICENSE
@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2020 www.uviewui.com
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
106
README.md
106
README.md
@ -1,106 +0,0 @@
|
|||||||
<p align="center">
|
|
||||||
<img alt="logo" src="https://uviewui.com/common/logo.png" width="120" height="120" style="margin-bottom: 10px;">
|
|
||||||
</p>
|
|
||||||
<h3 align="center" style="margin: 30px 0 30px;font-weight: bold;font-size:40px;">uView</h3>
|
|
||||||
<h3 align="center">多平台快速开发的UI框架</h3>
|
|
||||||
|
|
||||||
|
|
||||||
## 说明
|
|
||||||
|
|
||||||
uView UI,是[uni-app](https://uniapp.dcloud.io/)生态优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水
|
|
||||||
|
|
||||||
## 特性
|
|
||||||
|
|
||||||
- 兼容安卓,iOS,微信小程序,H5,QQ小程序,百度小程序,支付宝小程序,头条小程序
|
|
||||||
- 60+精选组件,功能丰富,多端兼容,让您快速集成,开箱即用
|
|
||||||
- 众多贴心的JS利器,让您飞镖在手,召之即来,百步穿杨
|
|
||||||
- 众多的常用页面和布局,让您专注逻辑,事半功倍
|
|
||||||
- 详尽的文档支持,现代化的演示效果
|
|
||||||
- 按需引入,精简打包体积
|
|
||||||
|
|
||||||
|
|
||||||
## 安装
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# npm方式安装
|
|
||||||
npm i uview-ui
|
|
||||||
```
|
|
||||||
|
|
||||||
## 快速上手
|
|
||||||
|
|
||||||
1. `main.js`引入uView库
|
|
||||||
```js
|
|
||||||
// main.js
|
|
||||||
import uView from 'uview-ui';
|
|
||||||
Vue.use(uView);
|
|
||||||
```
|
|
||||||
|
|
||||||
2. `App.vue`引入基础样式(注意style标签需声明scss属性支持)
|
|
||||||
```css
|
|
||||||
/* App.vue */
|
|
||||||
<style lang="scss">
|
|
||||||
@import "uview-ui/index.scss";
|
|
||||||
</style>
|
|
||||||
```
|
|
||||||
|
|
||||||
3. `uni.scss`引入全局scss变量文件
|
|
||||||
```css
|
|
||||||
/* uni.scss */
|
|
||||||
@import "uview-ui/theme.scss";
|
|
||||||
```
|
|
||||||
|
|
||||||
4. `pages.json`配置easycom规则(按需引入)
|
|
||||||
|
|
||||||
```js
|
|
||||||
// pages.json
|
|
||||||
{
|
|
||||||
"easycom": {
|
|
||||||
// npm安装的方式不需要前面的"@/",下载安装的方式需要"@/"
|
|
||||||
// npm安装方式
|
|
||||||
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
|
|
||||||
// 下载安装方式
|
|
||||||
// "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
|
|
||||||
},
|
|
||||||
// 此为本身已有的内容
|
|
||||||
"pages": [
|
|
||||||
// ......
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容
|
|
||||||
|
|
||||||
## 使用方法
|
|
||||||
配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。
|
|
||||||
|
|
||||||
```html
|
|
||||||
<template>
|
|
||||||
<u-button>按钮</u-button>
|
|
||||||
</template>
|
|
||||||
```
|
|
||||||
|
|
||||||
请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容
|
|
||||||
|
|
||||||
## 链接
|
|
||||||
|
|
||||||
- [官方文档](https://uviewui.com/)
|
|
||||||
- [更新日志](https://uviewui.com/components/changelog.html)
|
|
||||||
- [升级指南](https://uviewui.com/components/changelog.html)
|
|
||||||
- [关于我们](https://uviewui.com/cooperation/about.html)
|
|
||||||
|
|
||||||
## 预览
|
|
||||||
|
|
||||||
您可以通过**微信**扫码,查看最佳的演示效果。
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<img src="https://uviewui.com/common/weixin_mini_qrcode.png" width="220" height="220" >
|
|
||||||
|
|
||||||
<!-- ## 捐赠uView的研发
|
|
||||||
|
|
||||||
uView文档和源码全部开源免费,如果您认为uView帮到了您的开发工作,您可以捐赠uView的研发工作,捐赠无门槛,哪怕是一杯可乐也好(相信这比打赏主播更有意义)。
|
|
||||||
|
|
||||||
<img src="https://uviewui.com/common/wechat.png" width="220" >
|
|
||||||
<img style="margin-left: 100px;" src="https://uviewui.com/common/alipay.png" width="220" >
|
|
||||||
-->
|
|
||||||
## 版权信息
|
|
||||||
uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。
|
|
100
common/index.js
100
common/index.js
@ -1,100 +0,0 @@
|
|||||||
/**
|
|
||||||
* 通用消息框
|
|
||||||
* @param content string 消息内容
|
|
||||||
* @param fn function 回调
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
const msgToast = (content, fn, type = "none") => {
|
|
||||||
uni.showToast({
|
|
||||||
title: content,
|
|
||||||
duration: 2000,
|
|
||||||
icon: type,
|
|
||||||
success: fn
|
|
||||||
? () => {
|
|
||||||
setTimeout(() => {
|
|
||||||
fn();
|
|
||||||
}, 1500);
|
|
||||||
}
|
|
||||||
: function () {},
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 手机号验证 */
|
|
||||||
const vefTel = (key) => {
|
|
||||||
let reg_tel =
|
|
||||||
/^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/;
|
|
||||||
///^(((13[0-9]{1})|(15[0-9]{1})|(16[0-9]{1})|(17[3-8]{1})|(18[0-9]{1})|(19[0-9]{1})|(14[5-7]{1}))+\d{8})$/; // 11位手机号
|
|
||||||
if (key === "" || key === undefined || key === null) {
|
|
||||||
uni.showToast({
|
|
||||||
title: "请输入手机号",
|
|
||||||
duration: 2000,
|
|
||||||
icon: "none",
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
} else if (!reg_tel.test(key)) {
|
|
||||||
uni.showToast({
|
|
||||||
title: "手机号码格式不正确",
|
|
||||||
duration: 2000,
|
|
||||||
icon: "none",
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 非空验证 */
|
|
||||||
const vefEmpty = (key, msg) => {
|
|
||||||
if (key === "" || key === undefined || key === null) {
|
|
||||||
uni.showToast({
|
|
||||||
title: msg,
|
|
||||||
duration: 2000,
|
|
||||||
icon: "none",
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const logout = () => {
|
|
||||||
msgToast("登录已过期,请重新登录", () => {
|
|
||||||
uni.removeStorageSync("userInfo");
|
|
||||||
uni.reLaunch({
|
|
||||||
url: "../login/login",
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @description: H5 App通用方案 解决H5刷新返回失败问题
|
|
||||||
* @param {*} params
|
|
||||||
*/
|
|
||||||
const navigateBack = (params) => {
|
|
||||||
const pages = getCurrentPages();
|
|
||||||
if (pages.length === 1) {
|
|
||||||
if (typeof params === "number") {
|
|
||||||
history.go(-params);
|
|
||||||
} else {
|
|
||||||
history.back();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
uni.navigateBack();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @description: 获取url参数
|
|
||||||
* @param {*} params
|
|
||||||
*/
|
|
||||||
const getLocationParams = (name) => {
|
|
||||||
const pages = getCurrentPages();
|
|
||||||
const curPage = pages[pages.length - 1];
|
|
||||||
return name ? curPage.options[name] : curPage.options;
|
|
||||||
};
|
|
||||||
export default {
|
|
||||||
msgToast,
|
|
||||||
vefTel,
|
|
||||||
vefEmpty,
|
|
||||||
logout,
|
|
||||||
navigateBack,
|
|
||||||
getLocationParams,
|
|
||||||
};
|
|
@ -1,46 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="content1" :style="{marginTop:`${statusBarHeight}px`}">
|
|
||||||
<div class="wrap1"> <slot name="left"></slot></div>
|
|
||||||
<div class="wrap2">{{title}}</div>
|
|
||||||
<div class="wrap3"></div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "title-block",
|
|
||||||
data(){
|
|
||||||
return{
|
|
||||||
statusBarHeight:uni.getSystemInfoSync().statusBarHeight+5
|
|
||||||
}
|
|
||||||
},
|
|
||||||
props:{
|
|
||||||
title:String
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.content1{
|
|
||||||
height: 60rpx;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
.wrap1{
|
|
||||||
flex-grow: 1;
|
|
||||||
flex-basis: 0;
|
|
||||||
}
|
|
||||||
.wrap3{
|
|
||||||
flex-grow: 1;
|
|
||||||
flex-basis: 0;
|
|
||||||
}
|
|
||||||
.wrap2{
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
flex-grow: 1;
|
|
||||||
flex-basis: 0;
|
|
||||||
color:#4E964D ;
|
|
||||||
font-size: 32rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,48 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="tabbar">
|
|
||||||
<u-tabbar class="tabbar-ios-fix" :border="false" activeColor='#22bf8e' :value="current?current:0" :fixed="true"
|
|
||||||
:placeholder="true" :safeAreaInsetBottom="true" @change="handleTabClick">
|
|
||||||
<u-tabbar-item v-for='(item,index) in tabList' :key="index" :text="item.text">
|
|
||||||
<image style="width: 52rpx;height: 52rpx;margin-top: 65rpx" slot="inactive-icon" class="u-page__item__slot-icon" :src="item.iconPath">
|
|
||||||
</image>
|
|
||||||
<image style="width: 52rpx;height: 52rpx;margin-top: 65rpx" slot="active-icon" class="u-page__item__slot-icon" :src="item.selectedIconPath">
|
|
||||||
</image>
|
|
||||||
</u-tabbar-item>
|
|
||||||
</u-tabbar>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
<script>
|
|
||||||
import tabBar from "../../util/tabbar";
|
|
||||||
export default {
|
|
||||||
props: {
|
|
||||||
current: Number
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
tabList: uni.getStorageSync('tabBar')
|
|
||||||
};
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
handleTabClick(index) {
|
|
||||||
uni.switchTab({
|
|
||||||
url: '/' + this.tabList[index].pagePath,
|
|
||||||
});
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style lang="scss">
|
|
||||||
.u-page__item__slot-icon {
|
|
||||||
width: 52rpx;
|
|
||||||
height: 52rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*.tabbar-ios-fix {
|
|
||||||
bottom: calc(120rpx + env(safe-area-inset-bottom));
|
|
||||||
}*/
|
|
||||||
</style>
|
|
@ -1,3 +0,0 @@
|
|||||||
export default {
|
|
||||||
baseUrl: "https://stock.szjixun.cn", //"https://warehouse.szjixun.cn", // https://stock.szjixun.cn
|
|
||||||
};
|
|
@ -1,19 +0,0 @@
|
|||||||
import http from "./interface";
|
|
||||||
|
|
||||||
// 地点
|
|
||||||
export const address = () => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/warehouse/address",
|
|
||||||
method: "POST",
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const fddIsPass = () => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/wxuser/fdd/status/pass",
|
|
||||||
method: "POST",
|
|
||||||
});
|
|
||||||
};
|
|
||||||
export default {
|
|
||||||
address,
|
|
||||||
fddIsPass,
|
|
||||||
};
|
|
@ -1,8 +0,0 @@
|
|||||||
import login from "./login";
|
|
||||||
import deposit from "./deposit";
|
|
||||||
import mine from "./mine";
|
|
||||||
export default {
|
|
||||||
login,
|
|
||||||
deposit,
|
|
||||||
mine,
|
|
||||||
};
|
|
@ -1,177 +0,0 @@
|
|||||||
/**
|
|
||||||
* 通用uni-app网络请求
|
|
||||||
* 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截
|
|
||||||
*/
|
|
||||||
export default {
|
|
||||||
config: {
|
|
||||||
baseUrl: "https://stock.szjixun.cn", //"http://172.16.100.93:8017", //"http://192.168.88.175:9021",//测试 'https://warehouse.szjixun.cn' 正式 https://stock.szjixun.cn
|
|
||||||
header: {
|
|
||||||
"Content-Type": "application/json;charset=UTF-8",
|
|
||||||
// 'Content-Type':'application/x-www-form-urlencoded'
|
|
||||||
},
|
|
||||||
data: {},
|
|
||||||
method: "GET",
|
|
||||||
dataType: "json" /* 如设为json,会对返回的数据做一次 JSON.parse */,
|
|
||||||
responseType: "text",
|
|
||||||
success() {},
|
|
||||||
fail() {},
|
|
||||||
complete() {},
|
|
||||||
},
|
|
||||||
interceptor: {
|
|
||||||
request: null,
|
|
||||||
response: null,
|
|
||||||
},
|
|
||||||
request(options) {
|
|
||||||
if (!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
options.baseUrl = options.baseUrl || this.config.baseUrl;
|
|
||||||
options.dataType = options.dataType || this.config.dataType;
|
|
||||||
options.url = options.baseUrl + options.url;
|
|
||||||
options.data = options.data || {};
|
|
||||||
options.method = options.method || this.config.method;
|
|
||||||
//TODO 加密数据
|
|
||||||
options.header = options.header || this.config.header;
|
|
||||||
//TODO 数据签名
|
|
||||||
let _token = {
|
|
||||||
Authorization: uni.getStorageSync("token") || "undefined",
|
|
||||||
};
|
|
||||||
options.header = Object.assign({}, options.header, _token);
|
|
||||||
/*
|
|
||||||
|
|
||||||
_sign = {'sign': sign(JSON.stringify(options.data))}
|
|
||||||
options.header = Object.assign({}, options.header, _token,_sign)
|
|
||||||
*/
|
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
let _config = null;
|
|
||||||
|
|
||||||
options.complete = (response) => {
|
|
||||||
let statusCode = response.statusCode;
|
|
||||||
response.config = _config;
|
|
||||||
if (process.env.NODE_ENV === "development") {
|
|
||||||
if (statusCode === 200) {
|
|
||||||
// console.log("【" + _config.requestId + "】 结果:" + JSON.stringify(response.data))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.interceptor.response) {
|
|
||||||
let newResponse = this.interceptor.response(response);
|
|
||||||
if (newResponse) {
|
|
||||||
response = newResponse;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (response.data?.status === 401) {
|
|
||||||
uni.showModal({
|
|
||||||
title: "登录后使用完整功能",
|
|
||||||
success: (res) => {
|
|
||||||
if (res.confirm) {
|
|
||||||
let curPage = getCurrentPages();
|
|
||||||
let route = curPage[curPage.length - 1].route; //获取当前页面的路由
|
|
||||||
if (route !== "pages/login/login") {
|
|
||||||
uni.navigateTo({
|
|
||||||
url: "/pages/login/login",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// 统一的响应日志记录
|
|
||||||
_reslog(response);
|
|
||||||
if (statusCode === 200) {
|
|
||||||
//成功
|
|
||||||
resolve(response.data);
|
|
||||||
} else {
|
|
||||||
reject(response);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
_config = Object.assign({}, this.config, options);
|
|
||||||
_config.requestId = new Date().getTime();
|
|
||||||
|
|
||||||
if (this.interceptor.request) {
|
|
||||||
this.interceptor.request(_config);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 统一的请求日志记录
|
|
||||||
_reqlog(_config);
|
|
||||||
|
|
||||||
uni.request(_config);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
get(url, data, options) {
|
|
||||||
if (!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
options.url = url;
|
|
||||||
options.data = data;
|
|
||||||
options.method = "GET";
|
|
||||||
return this.request(options);
|
|
||||||
},
|
|
||||||
post(url, data, options, header) {
|
|
||||||
if (!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
options.url = url;
|
|
||||||
options.data = data;
|
|
||||||
options.header = header;
|
|
||||||
options.method = "POST";
|
|
||||||
return this.request(options);
|
|
||||||
},
|
|
||||||
put(url, data, options) {
|
|
||||||
if (!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
options.url = url;
|
|
||||||
options.data = data;
|
|
||||||
options.method = "PUT";
|
|
||||||
return this.request(options);
|
|
||||||
},
|
|
||||||
delete(url, data, options) {
|
|
||||||
if (!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
options.url = url;
|
|
||||||
options.data = data;
|
|
||||||
options.method = "DELETE";
|
|
||||||
return this.request(options);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 请求接口日志记录
|
|
||||||
*/
|
|
||||||
function _reqlog(req) {
|
|
||||||
if (process.env.NODE_ENV === "development") {
|
|
||||||
// console.log("【" + req.requestId + "】 地址:" + req.url)
|
|
||||||
if (req.data) {
|
|
||||||
// console.log("【" + req.requestId + "】 请求参数:" + JSON.stringify(req.data))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//TODO 调接口异步写入日志数据库
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 响应接口日志记录
|
|
||||||
*/
|
|
||||||
function _reslog(res) {
|
|
||||||
let _statusCode = res.statusCode;
|
|
||||||
if (process.env.NODE_ENV === "development") {
|
|
||||||
// console.log("【" + res.config.requestId + "】 地址:" + res.config.url)
|
|
||||||
if (res.config.data) {
|
|
||||||
// console.log("【" + res.config.requestId + "】 请求参数:" + JSON.stringify(res.config.data))
|
|
||||||
}
|
|
||||||
// console.log("【" + res.config.requestId + "】 响应结果:" + JSON.stringify(res))
|
|
||||||
}
|
|
||||||
//TODO 除了接口服务错误外,其他日志调接口异步写入日志数据库
|
|
||||||
switch (_statusCode) {
|
|
||||||
case 200:
|
|
||||||
break;
|
|
||||||
case 401:
|
|
||||||
break;
|
|
||||||
case 404:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,64 +0,0 @@
|
|||||||
import http from "./interface";
|
|
||||||
|
|
||||||
// openId
|
|
||||||
export const login = (data) => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/wxuser/openid",
|
|
||||||
method: "POST",
|
|
||||||
data,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
export const configFun = (data) => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/config",
|
|
||||||
method: "POST",
|
|
||||||
data,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
// 获取手机号
|
|
||||||
export const getTel = (data) => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/wxuser/get/telnum",
|
|
||||||
method: "POST",
|
|
||||||
data,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
// 注册
|
|
||||||
export const register = (data) => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/wxuser/register",
|
|
||||||
method: "POST",
|
|
||||||
data,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
// 身份验证
|
|
||||||
export const chenckId = (data) => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/wxuser/ocr",
|
|
||||||
method: "POST",
|
|
||||||
data,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
// 法大大
|
|
||||||
export const fddRealName = (data) => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/wxuser/bind/fdd",
|
|
||||||
method: "POST",
|
|
||||||
data,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
//法大大是否验证
|
|
||||||
export const checkFdd = () => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/wxuser/fdd/check",
|
|
||||||
method: "POST",
|
|
||||||
});
|
|
||||||
};
|
|
||||||
export default {
|
|
||||||
login,
|
|
||||||
getTel,
|
|
||||||
register,
|
|
||||||
chenckId,
|
|
||||||
fddRealName,
|
|
||||||
checkFdd,
|
|
||||||
};
|
|
34
http/mine.js
34
http/mine.js
@ -1,34 +0,0 @@
|
|||||||
import http from "./interface";
|
|
||||||
|
|
||||||
const infoOrders = () => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/warehouse/static/info",
|
|
||||||
method: "POST",
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const info = () => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/wxuser/info",
|
|
||||||
method: "POST",
|
|
||||||
});
|
|
||||||
};
|
|
||||||
// 更新信息
|
|
||||||
const update = (data) => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/wxuser/update",
|
|
||||||
method: "POST",
|
|
||||||
data,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const logout = () => {
|
|
||||||
return http.request({
|
|
||||||
url: "/api/wxuser/remove",
|
|
||||||
method: "POST",
|
|
||||||
});
|
|
||||||
};
|
|
||||||
export default {
|
|
||||||
infoOrders,
|
|
||||||
info,
|
|
||||||
update,
|
|
||||||
logout,
|
|
||||||
};
|
|
@ -1,17 +0,0 @@
|
|||||||
import http from './interface'
|
|
||||||
|
|
||||||
export const postDataByParams = (url, data) => {
|
|
||||||
return http.request({
|
|
||||||
url: url,
|
|
||||||
method: 'POST',
|
|
||||||
data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getDataByParams = (url, data) => {
|
|
||||||
return http.request({
|
|
||||||
url: url,
|
|
||||||
method: 'GET',
|
|
||||||
data
|
|
||||||
})
|
|
||||||
}
|
|
910
iconfont.css
910
iconfont.css
File diff suppressed because one or more lines are too long
141
index.js
141
index.js
@ -1,141 +0,0 @@
|
|||||||
// 引入全局mixin
|
|
||||||
import mixin from './libs/mixin/mixin.js'
|
|
||||||
// 引入关于是否mixin集成小程序分享的配置
|
|
||||||
// import wxshare from './libs/mixin/mpShare.js'
|
|
||||||
// 全局挂载引入http相关请求拦截插件
|
|
||||||
import http from './libs/request'
|
|
||||||
|
|
||||||
function wranning(str) {
|
|
||||||
// 开发环境进行信息输出,主要是一些报错信息
|
|
||||||
// 这个环境的来由是在程序编写时候,点击hx编辑器运行调试代码的时候,详见:
|
|
||||||
// https://uniapp.dcloud.io/frame?id=%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e5%92%8c%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83
|
|
||||||
if (process.env.NODE_ENV === 'development') {
|
|
||||||
console.warn(str)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 尝试判断在根目录的/store中是否有$u.mixin.js,此文件uView默认为需要挂在到全局的vuex的state变量
|
|
||||||
// HX2.6.11版本,放到try中,控制台依然会警告,暂时不用此方式,
|
|
||||||
// let vuexStore = {};
|
|
||||||
// try {
|
|
||||||
// vuexStore = require("@/store/$u.mixin.js");
|
|
||||||
// } catch (e) {
|
|
||||||
// //TODO handle the exception
|
|
||||||
// }
|
|
||||||
|
|
||||||
// post类型对象参数转为get类型url参数
|
|
||||||
import queryParams from './libs/function/queryParams.js'
|
|
||||||
// 路由封装
|
|
||||||
import route from './libs/function/route.js'
|
|
||||||
// 时间格式化
|
|
||||||
import timeFormat from './libs/function/timeFormat.js'
|
|
||||||
// 时间戳格式化,返回多久之前
|
|
||||||
import timeFrom from './libs/function/timeFrom.js'
|
|
||||||
// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制
|
|
||||||
import colorGradient from './libs/function/colorGradient.js'
|
|
||||||
// 生成全局唯一guid字符串
|
|
||||||
import guid from './libs/function/guid.js'
|
|
||||||
// 主题相关颜色,info|success|warning|primary|default|error,此颜色已在uview.scss中定义,但是为js中也能使用,故也定义一份
|
|
||||||
import color from './libs/function/color.js'
|
|
||||||
// 根据type获取图标名称
|
|
||||||
import type2icon from './libs/function/type2icon.js'
|
|
||||||
// 打乱数组的顺序
|
|
||||||
import randomArray from './libs/function/randomArray.js'
|
|
||||||
// 对象和数组的深度克隆
|
|
||||||
import deepClone from './libs/function/deepClone.js'
|
|
||||||
// 对象深度拷贝
|
|
||||||
import deepMerge from './libs/function/deepMerge.js'
|
|
||||||
// 添加单位
|
|
||||||
import addUnit from './libs/function/addUnit.js'
|
|
||||||
|
|
||||||
// 规则检验
|
|
||||||
import test from './libs/function/test.js'
|
|
||||||
// 随机数
|
|
||||||
import random from './libs/function/random.js'
|
|
||||||
// 去除空格
|
|
||||||
import trim from './libs/function/trim.js'
|
|
||||||
// toast提示,对uni.showToast的封装
|
|
||||||
import toast from './libs/function/toast.js'
|
|
||||||
// 获取父组件参数
|
|
||||||
import getParent from './libs/function/getParent.js'
|
|
||||||
// 获取整个父组件
|
|
||||||
import $parent from './libs/function/$parent.js'
|
|
||||||
// 获取sys()和os()工具方法
|
|
||||||
// 获取设备信息,挂载到$u的sys()(system的缩写)属性中,
|
|
||||||
// 同时把安卓和ios平台的名称"ios"和"android"挂到$u.os()中,方便取用
|
|
||||||
import {sys, os} from './libs/function/sys.js'
|
|
||||||
// 防抖方法
|
|
||||||
import debounce from './libs/function/debounce.js'
|
|
||||||
// 节流方法
|
|
||||||
import throttle from './libs/function/throttle.js'
|
|
||||||
|
|
||||||
|
|
||||||
// 配置信息
|
|
||||||
import config from './libs/config/config.js'
|
|
||||||
// 各个需要fixed的地方的z-index配置文件
|
|
||||||
import zIndex from './libs/config/zIndex.js'
|
|
||||||
|
|
||||||
const $u = {
|
|
||||||
queryParams: queryParams,
|
|
||||||
route: route,
|
|
||||||
timeFormat: timeFormat,
|
|
||||||
date: timeFormat, // 另名date
|
|
||||||
timeFrom,
|
|
||||||
colorGradient: colorGradient.colorGradient,
|
|
||||||
colorToRgba: colorGradient.colorToRgba,
|
|
||||||
guid,
|
|
||||||
color,
|
|
||||||
sys,
|
|
||||||
os,
|
|
||||||
type2icon,
|
|
||||||
randomArray,
|
|
||||||
wranning,
|
|
||||||
get: http.get,
|
|
||||||
post: http.post,
|
|
||||||
put: http.put,
|
|
||||||
'delete': http.delete,
|
|
||||||
hexToRgb: colorGradient.hexToRgb,
|
|
||||||
rgbToHex: colorGradient.rgbToHex,
|
|
||||||
test,
|
|
||||||
random,
|
|
||||||
deepClone,
|
|
||||||
deepMerge,
|
|
||||||
getParent,
|
|
||||||
$parent,
|
|
||||||
addUnit,
|
|
||||||
trim,
|
|
||||||
type: ['primary', 'success', 'error', 'warning', 'info'],
|
|
||||||
http,
|
|
||||||
toast,
|
|
||||||
config, // uView配置信息相关,比如版本号
|
|
||||||
zIndex,
|
|
||||||
debounce,
|
|
||||||
throttle,
|
|
||||||
}
|
|
||||||
|
|
||||||
// $u挂载到uni对象上
|
|
||||||
uni.$u = $u
|
|
||||||
|
|
||||||
const install = Vue => {
|
|
||||||
Vue.mixin(mixin)
|
|
||||||
if (Vue.prototype.openShare) {
|
|
||||||
Vue.mixin(mpShare);
|
|
||||||
}
|
|
||||||
// Vue.mixin(vuexStore);
|
|
||||||
// 时间格式化,同时两个名称,date和timeFormat
|
|
||||||
Vue.filter('timeFormat', (timestamp, format) => {
|
|
||||||
return timeFormat(timestamp, format)
|
|
||||||
})
|
|
||||||
Vue.filter('date', (timestamp, format) => {
|
|
||||||
return timeFormat(timestamp, format)
|
|
||||||
})
|
|
||||||
// 将多久以前的方法,注入到全局过滤器
|
|
||||||
Vue.filter('timeFrom', (timestamp, format) => {
|
|
||||||
return timeFrom(timestamp, format)
|
|
||||||
})
|
|
||||||
Vue.prototype.$u = $u
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
|
||||||
install
|
|
||||||
}
|
|
23
index.scss
23
index.scss
@ -1,23 +0,0 @@
|
|||||||
// 引入公共基础类
|
|
||||||
@import "./libs/css/common.scss";
|
|
||||||
@import "./libs/css/color.scss";
|
|
||||||
|
|
||||||
// 非nvue的样式
|
|
||||||
/* #ifndef APP-NVUE */
|
|
||||||
@import "./libs/css/style.vue.scss";
|
|
||||||
/* #endif */
|
|
||||||
|
|
||||||
// nvue的特有样式
|
|
||||||
/* #ifdef APP-NVUE */
|
|
||||||
@import "./libs/css/style.nvue.scss";
|
|
||||||
/* #endif */
|
|
||||||
|
|
||||||
// 小程序特有的样式
|
|
||||||
/* #ifdef MP */
|
|
||||||
@import "./libs/css/style.mp.scss";
|
|
||||||
/* #endif */
|
|
||||||
|
|
||||||
// H5特有的样式
|
|
||||||
/* #ifdef H5 */
|
|
||||||
@import "./libs/css/style.h5.scss";
|
|
||||||
/* #endif */
|
|
34
main.js
34
main.js
@ -1,30 +1,22 @@
|
|||||||
import App from "./App";
|
import App from './App'
|
||||||
|
|
||||||
// #ifndef VUE3
|
// #ifndef VUE3
|
||||||
import Vue from "vue";
|
import Vue from 'vue'
|
||||||
import api from "@/http/";
|
import './uni.promisify.adaptor'
|
||||||
import common from "./common/index.js";
|
Vue.config.productionTip = false
|
||||||
import "./uni.promisify.adaptor";
|
App.mpType = 'app'
|
||||||
Vue.config.productionTip = false;
|
|
||||||
App.mpType = "app";
|
|
||||||
import uView from "./uview-ui";
|
|
||||||
Vue.use(uView);
|
|
||||||
import tmVuetify from "./tm-vuetify";
|
|
||||||
Vue.use(tmVuetify)
|
|
||||||
Vue.prototype.$api = api;
|
|
||||||
Vue.prototype.$common = common;
|
|
||||||
const app = new Vue({
|
const app = new Vue({
|
||||||
...App,
|
...App
|
||||||
});
|
})
|
||||||
app.$mount();
|
app.$mount()
|
||||||
// #endif
|
// #endif
|
||||||
// #ifdef VUE3
|
|
||||||
import { createSSRApp } from "vue";
|
|
||||||
|
|
||||||
|
// #ifdef VUE3
|
||||||
|
import { createSSRApp } from 'vue'
|
||||||
export function createApp() {
|
export function createApp() {
|
||||||
const app = createSSRApp(App);
|
const app = createSSRApp(App)
|
||||||
return {
|
return {
|
||||||
app,
|
app
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
// #endif
|
// #endif
|
@ -50,27 +50,11 @@
|
|||||||
"quickapp" : {},
|
"quickapp" : {},
|
||||||
/* 小程序特有相关 */
|
/* 小程序特有相关 */
|
||||||
"mp-weixin" : {
|
"mp-weixin" : {
|
||||||
"appid" : "wx2ab0adfa3346d44f",
|
"appid" : "",
|
||||||
"setting" : {
|
"setting" : {
|
||||||
"urlCheck" : false
|
"urlCheck" : false
|
||||||
},
|
},
|
||||||
"usingComponents" : true,
|
"usingComponents" : true
|
||||||
"permission" : {
|
|
||||||
"scope.camera" : {
|
|
||||||
"desc" : "你的摄像头将用于拍照或录像"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"subpackages": [
|
|
||||||
{
|
|
||||||
"root": "pagesFace",
|
|
||||||
"name": "pagesFace",
|
|
||||||
"pages": [
|
|
||||||
"pages/index/index",
|
|
||||||
"pages/webview/webview",
|
|
||||||
"pages/middle/middle"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"mp-alipay" : {
|
"mp-alipay" : {
|
||||||
"usingComponents" : true
|
"usingComponents" : true
|
||||||
|
12
node_modules/.bin/acorn
generated
vendored
12
node_modules/.bin/acorn
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
||||||
|
|
||||||
case `uname` in
|
|
||||||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -x "$basedir/node" ]; then
|
|
||||||
exec "$basedir/node" "$basedir/../acorn/bin/acorn" "$@"
|
|
||||||
else
|
|
||||||
exec node "$basedir/../acorn/bin/acorn" "$@"
|
|
||||||
fi
|
|
17
node_modules/.bin/acorn.cmd
generated
vendored
17
node_modules/.bin/acorn.cmd
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
@ECHO off
|
|
||||||
GOTO start
|
|
||||||
:find_dp0
|
|
||||||
SET dp0=%~dp0
|
|
||||||
EXIT /b
|
|
||||||
:start
|
|
||||||
SETLOCAL
|
|
||||||
CALL :find_dp0
|
|
||||||
|
|
||||||
IF EXIST "%dp0%\node.exe" (
|
|
||||||
SET "_prog=%dp0%\node.exe"
|
|
||||||
) ELSE (
|
|
||||||
SET "_prog=node"
|
|
||||||
SET PATHEXT=%PATHEXT:;.JS;=;%
|
|
||||||
)
|
|
||||||
|
|
||||||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\acorn\bin\acorn" %*
|
|
28
node_modules/.bin/acorn.ps1
generated
vendored
28
node_modules/.bin/acorn.ps1
generated
vendored
@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env pwsh
|
|
||||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
|
||||||
|
|
||||||
$exe=""
|
|
||||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
|
||||||
# Fix case when both the Windows and Linux builds of Node
|
|
||||||
# are installed in the same directory
|
|
||||||
$exe=".exe"
|
|
||||||
}
|
|
||||||
$ret=0
|
|
||||||
if (Test-Path "$basedir/node$exe") {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "$basedir/node$exe" "$basedir/../acorn/bin/acorn" $args
|
|
||||||
} else {
|
|
||||||
& "$basedir/node$exe" "$basedir/../acorn/bin/acorn" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
} else {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "node$exe" "$basedir/../acorn/bin/acorn" $args
|
|
||||||
} else {
|
|
||||||
& "node$exe" "$basedir/../acorn/bin/acorn" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
}
|
|
||||||
exit $ret
|
|
12
node_modules/.bin/browserslist
generated
vendored
12
node_modules/.bin/browserslist
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
||||||
|
|
||||||
case `uname` in
|
|
||||||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -x "$basedir/node" ]; then
|
|
||||||
exec "$basedir/node" "$basedir/../browserslist/cli.js" "$@"
|
|
||||||
else
|
|
||||||
exec node "$basedir/../browserslist/cli.js" "$@"
|
|
||||||
fi
|
|
17
node_modules/.bin/browserslist.cmd
generated
vendored
17
node_modules/.bin/browserslist.cmd
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
@ECHO off
|
|
||||||
GOTO start
|
|
||||||
:find_dp0
|
|
||||||
SET dp0=%~dp0
|
|
||||||
EXIT /b
|
|
||||||
:start
|
|
||||||
SETLOCAL
|
|
||||||
CALL :find_dp0
|
|
||||||
|
|
||||||
IF EXIST "%dp0%\node.exe" (
|
|
||||||
SET "_prog=%dp0%\node.exe"
|
|
||||||
) ELSE (
|
|
||||||
SET "_prog=node"
|
|
||||||
SET PATHEXT=%PATHEXT:;.JS;=;%
|
|
||||||
)
|
|
||||||
|
|
||||||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\browserslist\cli.js" %*
|
|
28
node_modules/.bin/browserslist.ps1
generated
vendored
28
node_modules/.bin/browserslist.ps1
generated
vendored
@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env pwsh
|
|
||||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
|
||||||
|
|
||||||
$exe=""
|
|
||||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
|
||||||
# Fix case when both the Windows and Linux builds of Node
|
|
||||||
# are installed in the same directory
|
|
||||||
$exe=".exe"
|
|
||||||
}
|
|
||||||
$ret=0
|
|
||||||
if (Test-Path "$basedir/node$exe") {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "$basedir/node$exe" "$basedir/../browserslist/cli.js" $args
|
|
||||||
} else {
|
|
||||||
& "$basedir/node$exe" "$basedir/../browserslist/cli.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
} else {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "node$exe" "$basedir/../browserslist/cli.js" $args
|
|
||||||
} else {
|
|
||||||
& "node$exe" "$basedir/../browserslist/cli.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
}
|
|
||||||
exit $ret
|
|
12
node_modules/.bin/json5
generated
vendored
12
node_modules/.bin/json5
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
||||||
|
|
||||||
case `uname` in
|
|
||||||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -x "$basedir/node" ]; then
|
|
||||||
exec "$basedir/node" "$basedir/../json5/lib/cli.js" "$@"
|
|
||||||
else
|
|
||||||
exec node "$basedir/../json5/lib/cli.js" "$@"
|
|
||||||
fi
|
|
17
node_modules/.bin/json5.cmd
generated
vendored
17
node_modules/.bin/json5.cmd
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
@ECHO off
|
|
||||||
GOTO start
|
|
||||||
:find_dp0
|
|
||||||
SET dp0=%~dp0
|
|
||||||
EXIT /b
|
|
||||||
:start
|
|
||||||
SETLOCAL
|
|
||||||
CALL :find_dp0
|
|
||||||
|
|
||||||
IF EXIST "%dp0%\node.exe" (
|
|
||||||
SET "_prog=%dp0%\node.exe"
|
|
||||||
) ELSE (
|
|
||||||
SET "_prog=node"
|
|
||||||
SET PATHEXT=%PATHEXT:;.JS;=;%
|
|
||||||
)
|
|
||||||
|
|
||||||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\json5\lib\cli.js" %*
|
|
28
node_modules/.bin/json5.ps1
generated
vendored
28
node_modules/.bin/json5.ps1
generated
vendored
@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env pwsh
|
|
||||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
|
||||||
|
|
||||||
$exe=""
|
|
||||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
|
||||||
# Fix case when both the Windows and Linux builds of Node
|
|
||||||
# are installed in the same directory
|
|
||||||
$exe=".exe"
|
|
||||||
}
|
|
||||||
$ret=0
|
|
||||||
if (Test-Path "$basedir/node$exe") {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "$basedir/node$exe" "$basedir/../json5/lib/cli.js" $args
|
|
||||||
} else {
|
|
||||||
& "$basedir/node$exe" "$basedir/../json5/lib/cli.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
} else {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "node$exe" "$basedir/../json5/lib/cli.js" $args
|
|
||||||
} else {
|
|
||||||
& "node$exe" "$basedir/../json5/lib/cli.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
}
|
|
||||||
exit $ret
|
|
12
node_modules/.bin/sass
generated
vendored
12
node_modules/.bin/sass
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
||||||
|
|
||||||
case `uname` in
|
|
||||||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -x "$basedir/node" ]; then
|
|
||||||
exec "$basedir/node" "$basedir/../sass/sass.js" "$@"
|
|
||||||
else
|
|
||||||
exec node "$basedir/../sass/sass.js" "$@"
|
|
||||||
fi
|
|
17
node_modules/.bin/sass.cmd
generated
vendored
17
node_modules/.bin/sass.cmd
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
@ECHO off
|
|
||||||
GOTO start
|
|
||||||
:find_dp0
|
|
||||||
SET dp0=%~dp0
|
|
||||||
EXIT /b
|
|
||||||
:start
|
|
||||||
SETLOCAL
|
|
||||||
CALL :find_dp0
|
|
||||||
|
|
||||||
IF EXIST "%dp0%\node.exe" (
|
|
||||||
SET "_prog=%dp0%\node.exe"
|
|
||||||
) ELSE (
|
|
||||||
SET "_prog=node"
|
|
||||||
SET PATHEXT=%PATHEXT:;.JS;=;%
|
|
||||||
)
|
|
||||||
|
|
||||||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\sass\sass.js" %*
|
|
28
node_modules/.bin/sass.ps1
generated
vendored
28
node_modules/.bin/sass.ps1
generated
vendored
@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env pwsh
|
|
||||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
|
||||||
|
|
||||||
$exe=""
|
|
||||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
|
||||||
# Fix case when both the Windows and Linux builds of Node
|
|
||||||
# are installed in the same directory
|
|
||||||
$exe=".exe"
|
|
||||||
}
|
|
||||||
$ret=0
|
|
||||||
if (Test-Path "$basedir/node$exe") {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "$basedir/node$exe" "$basedir/../sass/sass.js" $args
|
|
||||||
} else {
|
|
||||||
& "$basedir/node$exe" "$basedir/../sass/sass.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
} else {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "node$exe" "$basedir/../sass/sass.js" $args
|
|
||||||
} else {
|
|
||||||
& "node$exe" "$basedir/../sass/sass.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
}
|
|
||||||
exit $ret
|
|
12
node_modules/.bin/semver
generated
vendored
12
node_modules/.bin/semver
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
||||||
|
|
||||||
case `uname` in
|
|
||||||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -x "$basedir/node" ]; then
|
|
||||||
exec "$basedir/node" "$basedir/../semver/bin/semver.js" "$@"
|
|
||||||
else
|
|
||||||
exec node "$basedir/../semver/bin/semver.js" "$@"
|
|
||||||
fi
|
|
17
node_modules/.bin/semver.cmd
generated
vendored
17
node_modules/.bin/semver.cmd
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
@ECHO off
|
|
||||||
GOTO start
|
|
||||||
:find_dp0
|
|
||||||
SET dp0=%~dp0
|
|
||||||
EXIT /b
|
|
||||||
:start
|
|
||||||
SETLOCAL
|
|
||||||
CALL :find_dp0
|
|
||||||
|
|
||||||
IF EXIST "%dp0%\node.exe" (
|
|
||||||
SET "_prog=%dp0%\node.exe"
|
|
||||||
) ELSE (
|
|
||||||
SET "_prog=node"
|
|
||||||
SET PATHEXT=%PATHEXT:;.JS;=;%
|
|
||||||
)
|
|
||||||
|
|
||||||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\semver\bin\semver.js" %*
|
|
28
node_modules/.bin/semver.ps1
generated
vendored
28
node_modules/.bin/semver.ps1
generated
vendored
@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env pwsh
|
|
||||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
|
||||||
|
|
||||||
$exe=""
|
|
||||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
|
||||||
# Fix case when both the Windows and Linux builds of Node
|
|
||||||
# are installed in the same directory
|
|
||||||
$exe=".exe"
|
|
||||||
}
|
|
||||||
$ret=0
|
|
||||||
if (Test-Path "$basedir/node$exe") {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "$basedir/node$exe" "$basedir/../semver/bin/semver.js" $args
|
|
||||||
} else {
|
|
||||||
& "$basedir/node$exe" "$basedir/../semver/bin/semver.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
} else {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "node$exe" "$basedir/../semver/bin/semver.js" $args
|
|
||||||
} else {
|
|
||||||
& "node$exe" "$basedir/../semver/bin/semver.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
}
|
|
||||||
exit $ret
|
|
12
node_modules/.bin/terser
generated
vendored
12
node_modules/.bin/terser
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
||||||
|
|
||||||
case `uname` in
|
|
||||||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -x "$basedir/node" ]; then
|
|
||||||
exec "$basedir/node" "$basedir/../terser/bin/terser" "$@"
|
|
||||||
else
|
|
||||||
exec node "$basedir/../terser/bin/terser" "$@"
|
|
||||||
fi
|
|
17
node_modules/.bin/terser.cmd
generated
vendored
17
node_modules/.bin/terser.cmd
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
@ECHO off
|
|
||||||
GOTO start
|
|
||||||
:find_dp0
|
|
||||||
SET dp0=%~dp0
|
|
||||||
EXIT /b
|
|
||||||
:start
|
|
||||||
SETLOCAL
|
|
||||||
CALL :find_dp0
|
|
||||||
|
|
||||||
IF EXIST "%dp0%\node.exe" (
|
|
||||||
SET "_prog=%dp0%\node.exe"
|
|
||||||
) ELSE (
|
|
||||||
SET "_prog=node"
|
|
||||||
SET PATHEXT=%PATHEXT:;.JS;=;%
|
|
||||||
)
|
|
||||||
|
|
||||||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\terser\bin\terser" %*
|
|
28
node_modules/.bin/terser.ps1
generated
vendored
28
node_modules/.bin/terser.ps1
generated
vendored
@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env pwsh
|
|
||||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
|
||||||
|
|
||||||
$exe=""
|
|
||||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
|
||||||
# Fix case when both the Windows and Linux builds of Node
|
|
||||||
# are installed in the same directory
|
|
||||||
$exe=".exe"
|
|
||||||
}
|
|
||||||
$ret=0
|
|
||||||
if (Test-Path "$basedir/node$exe") {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "$basedir/node$exe" "$basedir/../terser/bin/terser" $args
|
|
||||||
} else {
|
|
||||||
& "$basedir/node$exe" "$basedir/../terser/bin/terser" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
} else {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "node$exe" "$basedir/../terser/bin/terser" $args
|
|
||||||
} else {
|
|
||||||
& "node$exe" "$basedir/../terser/bin/terser" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
}
|
|
||||||
exit $ret
|
|
12
node_modules/.bin/update-browserslist-db
generated
vendored
12
node_modules/.bin/update-browserslist-db
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
||||||
|
|
||||||
case `uname` in
|
|
||||||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -x "$basedir/node" ]; then
|
|
||||||
exec "$basedir/node" "$basedir/../update-browserslist-db/cli.js" "$@"
|
|
||||||
else
|
|
||||||
exec node "$basedir/../update-browserslist-db/cli.js" "$@"
|
|
||||||
fi
|
|
17
node_modules/.bin/update-browserslist-db.cmd
generated
vendored
17
node_modules/.bin/update-browserslist-db.cmd
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
@ECHO off
|
|
||||||
GOTO start
|
|
||||||
:find_dp0
|
|
||||||
SET dp0=%~dp0
|
|
||||||
EXIT /b
|
|
||||||
:start
|
|
||||||
SETLOCAL
|
|
||||||
CALL :find_dp0
|
|
||||||
|
|
||||||
IF EXIST "%dp0%\node.exe" (
|
|
||||||
SET "_prog=%dp0%\node.exe"
|
|
||||||
) ELSE (
|
|
||||||
SET "_prog=node"
|
|
||||||
SET PATHEXT=%PATHEXT:;.JS;=;%
|
|
||||||
)
|
|
||||||
|
|
||||||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\update-browserslist-db\cli.js" %*
|
|
28
node_modules/.bin/update-browserslist-db.ps1
generated
vendored
28
node_modules/.bin/update-browserslist-db.ps1
generated
vendored
@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env pwsh
|
|
||||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
|
||||||
|
|
||||||
$exe=""
|
|
||||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
|
||||||
# Fix case when both the Windows and Linux builds of Node
|
|
||||||
# are installed in the same directory
|
|
||||||
$exe=".exe"
|
|
||||||
}
|
|
||||||
$ret=0
|
|
||||||
if (Test-Path "$basedir/node$exe") {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "$basedir/node$exe" "$basedir/../update-browserslist-db/cli.js" $args
|
|
||||||
} else {
|
|
||||||
& "$basedir/node$exe" "$basedir/../update-browserslist-db/cli.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
} else {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "node$exe" "$basedir/../update-browserslist-db/cli.js" $args
|
|
||||||
} else {
|
|
||||||
& "node$exe" "$basedir/../update-browserslist-db/cli.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
}
|
|
||||||
exit $ret
|
|
12
node_modules/.bin/webpack
generated
vendored
12
node_modules/.bin/webpack
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
||||||
|
|
||||||
case `uname` in
|
|
||||||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -x "$basedir/node" ]; then
|
|
||||||
exec "$basedir/node" "$basedir/../webpack/bin/webpack.js" "$@"
|
|
||||||
else
|
|
||||||
exec node "$basedir/../webpack/bin/webpack.js" "$@"
|
|
||||||
fi
|
|
17
node_modules/.bin/webpack.cmd
generated
vendored
17
node_modules/.bin/webpack.cmd
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
@ECHO off
|
|
||||||
GOTO start
|
|
||||||
:find_dp0
|
|
||||||
SET dp0=%~dp0
|
|
||||||
EXIT /b
|
|
||||||
:start
|
|
||||||
SETLOCAL
|
|
||||||
CALL :find_dp0
|
|
||||||
|
|
||||||
IF EXIST "%dp0%\node.exe" (
|
|
||||||
SET "_prog=%dp0%\node.exe"
|
|
||||||
) ELSE (
|
|
||||||
SET "_prog=node"
|
|
||||||
SET PATHEXT=%PATHEXT:;.JS;=;%
|
|
||||||
)
|
|
||||||
|
|
||||||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\webpack\bin\webpack.js" %*
|
|
28
node_modules/.bin/webpack.ps1
generated
vendored
28
node_modules/.bin/webpack.ps1
generated
vendored
@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env pwsh
|
|
||||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
|
||||||
|
|
||||||
$exe=""
|
|
||||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
|
||||||
# Fix case when both the Windows and Linux builds of Node
|
|
||||||
# are installed in the same directory
|
|
||||||
$exe=".exe"
|
|
||||||
}
|
|
||||||
$ret=0
|
|
||||||
if (Test-Path "$basedir/node$exe") {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "$basedir/node$exe" "$basedir/../webpack/bin/webpack.js" $args
|
|
||||||
} else {
|
|
||||||
& "$basedir/node$exe" "$basedir/../webpack/bin/webpack.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
} else {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "node$exe" "$basedir/../webpack/bin/webpack.js" $args
|
|
||||||
} else {
|
|
||||||
& "node$exe" "$basedir/../webpack/bin/webpack.js" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
}
|
|
||||||
exit $ret
|
|
1266
node_modules/.package-lock.json
generated
vendored
1266
node_modules/.package-lock.json
generated
vendored
File diff suppressed because it is too large
Load Diff
19
node_modules/@jridgewell/gen-mapping/LICENSE
generated
vendored
19
node_modules/@jridgewell/gen-mapping/LICENSE
generated
vendored
@ -1,19 +0,0 @@
|
|||||||
Copyright 2022 Justin Ridgewell <jridgewell@google.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
227
node_modules/@jridgewell/gen-mapping/README.md
generated
vendored
227
node_modules/@jridgewell/gen-mapping/README.md
generated
vendored
@ -1,227 +0,0 @@
|
|||||||
# @jridgewell/gen-mapping
|
|
||||||
|
|
||||||
> Generate source maps
|
|
||||||
|
|
||||||
`gen-mapping` allows you to generate a source map during transpilation or minification.
|
|
||||||
With a source map, you're able to trace the original location in the source file, either in Chrome's
|
|
||||||
DevTools or using a library like [`@jridgewell/trace-mapping`][trace-mapping].
|
|
||||||
|
|
||||||
You may already be familiar with the [`source-map`][source-map] package's `SourceMapGenerator`. This
|
|
||||||
provides the same `addMapping` and `setSourceContent` API.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install @jridgewell/gen-mapping
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { GenMapping, addMapping, setSourceContent, toEncodedMap, toDecodedMap } from '@jridgewell/gen-mapping';
|
|
||||||
|
|
||||||
const map = new GenMapping({
|
|
||||||
file: 'output.js',
|
|
||||||
sourceRoot: 'https://example.com/',
|
|
||||||
});
|
|
||||||
|
|
||||||
setSourceContent(map, 'input.js', `function foo() {}`);
|
|
||||||
|
|
||||||
addMapping(map, {
|
|
||||||
// Lines start at line 1, columns at column 0.
|
|
||||||
generated: { line: 1, column: 0 },
|
|
||||||
source: 'input.js',
|
|
||||||
original: { line: 1, column: 0 },
|
|
||||||
});
|
|
||||||
|
|
||||||
addMapping(map, {
|
|
||||||
generated: { line: 1, column: 9 },
|
|
||||||
source: 'input.js',
|
|
||||||
original: { line: 1, column: 9 },
|
|
||||||
name: 'foo',
|
|
||||||
});
|
|
||||||
|
|
||||||
assert.deepEqual(toDecodedMap(map), {
|
|
||||||
version: 3,
|
|
||||||
file: 'output.js',
|
|
||||||
names: ['foo'],
|
|
||||||
sourceRoot: 'https://example.com/',
|
|
||||||
sources: ['input.js'],
|
|
||||||
sourcesContent: ['function foo() {}'],
|
|
||||||
mappings: [
|
|
||||||
[ [0, 0, 0, 0], [9, 0, 0, 9, 0] ]
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
assert.deepEqual(toEncodedMap(map), {
|
|
||||||
version: 3,
|
|
||||||
file: 'output.js',
|
|
||||||
names: ['foo'],
|
|
||||||
sourceRoot: 'https://example.com/',
|
|
||||||
sources: ['input.js'],
|
|
||||||
sourcesContent: ['function foo() {}'],
|
|
||||||
mappings: 'AAAA,SAASA',
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### Smaller Sourcemaps
|
|
||||||
|
|
||||||
Not everything needs to be added to a sourcemap, and needless markings can cause signficantly
|
|
||||||
larger file sizes. `gen-mapping` exposes `maybeAddSegment`/`maybeAddMapping` APIs that will
|
|
||||||
intelligently determine if this marking adds useful information. If not, the marking will be
|
|
||||||
skipped.
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { maybeAddMapping } from '@jridgewell/gen-mapping';
|
|
||||||
|
|
||||||
const map = new GenMapping();
|
|
||||||
|
|
||||||
// Adding a sourceless marking at the beginning of a line isn't useful.
|
|
||||||
maybeAddMapping(map, {
|
|
||||||
generated: { line: 1, column: 0 },
|
|
||||||
});
|
|
||||||
|
|
||||||
// Adding a new source marking is useful.
|
|
||||||
maybeAddMapping(map, {
|
|
||||||
generated: { line: 1, column: 0 },
|
|
||||||
source: 'input.js',
|
|
||||||
original: { line: 1, column: 0 },
|
|
||||||
});
|
|
||||||
|
|
||||||
// But adding another marking pointing to the exact same original location isn't, even if the
|
|
||||||
// generated column changed.
|
|
||||||
maybeAddMapping(map, {
|
|
||||||
generated: { line: 1, column: 9 },
|
|
||||||
source: 'input.js',
|
|
||||||
original: { line: 1, column: 0 },
|
|
||||||
});
|
|
||||||
|
|
||||||
assert.deepEqual(toEncodedMap(map), {
|
|
||||||
version: 3,
|
|
||||||
names: [],
|
|
||||||
sources: ['input.js'],
|
|
||||||
sourcesContent: [null],
|
|
||||||
mappings: 'AAAA',
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## Benchmarks
|
|
||||||
|
|
||||||
```
|
|
||||||
node v18.0.0
|
|
||||||
|
|
||||||
amp.js.map
|
|
||||||
Memory Usage:
|
|
||||||
gen-mapping: addSegment 5852872 bytes
|
|
||||||
gen-mapping: addMapping 7716042 bytes
|
|
||||||
source-map-js 6143250 bytes
|
|
||||||
source-map-0.6.1 6124102 bytes
|
|
||||||
source-map-0.8.0 6121173 bytes
|
|
||||||
Smallest memory usage is gen-mapping: addSegment
|
|
||||||
|
|
||||||
Adding speed:
|
|
||||||
gen-mapping: addSegment x 441 ops/sec ±2.07% (90 runs sampled)
|
|
||||||
gen-mapping: addMapping x 350 ops/sec ±2.40% (86 runs sampled)
|
|
||||||
source-map-js: addMapping x 169 ops/sec ±2.42% (80 runs sampled)
|
|
||||||
source-map-0.6.1: addMapping x 167 ops/sec ±2.56% (80 runs sampled)
|
|
||||||
source-map-0.8.0: addMapping x 168 ops/sec ±2.52% (80 runs sampled)
|
|
||||||
Fastest is gen-mapping: addSegment
|
|
||||||
|
|
||||||
Generate speed:
|
|
||||||
gen-mapping: decoded output x 150,824,370 ops/sec ±0.07% (102 runs sampled)
|
|
||||||
gen-mapping: encoded output x 663 ops/sec ±0.22% (98 runs sampled)
|
|
||||||
source-map-js: encoded output x 197 ops/sec ±0.45% (84 runs sampled)
|
|
||||||
source-map-0.6.1: encoded output x 198 ops/sec ±0.33% (85 runs sampled)
|
|
||||||
source-map-0.8.0: encoded output x 197 ops/sec ±0.06% (93 runs sampled)
|
|
||||||
Fastest is gen-mapping: decoded output
|
|
||||||
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
|
|
||||||
babel.min.js.map
|
|
||||||
Memory Usage:
|
|
||||||
gen-mapping: addSegment 37578063 bytes
|
|
||||||
gen-mapping: addMapping 37212897 bytes
|
|
||||||
source-map-js 47638527 bytes
|
|
||||||
source-map-0.6.1 47690503 bytes
|
|
||||||
source-map-0.8.0 47470188 bytes
|
|
||||||
Smallest memory usage is gen-mapping: addMapping
|
|
||||||
|
|
||||||
Adding speed:
|
|
||||||
gen-mapping: addSegment x 31.05 ops/sec ±8.31% (43 runs sampled)
|
|
||||||
gen-mapping: addMapping x 29.83 ops/sec ±7.36% (51 runs sampled)
|
|
||||||
source-map-js: addMapping x 20.73 ops/sec ±6.22% (38 runs sampled)
|
|
||||||
source-map-0.6.1: addMapping x 20.03 ops/sec ±10.51% (38 runs sampled)
|
|
||||||
source-map-0.8.0: addMapping x 19.30 ops/sec ±8.27% (37 runs sampled)
|
|
||||||
Fastest is gen-mapping: addSegment
|
|
||||||
|
|
||||||
Generate speed:
|
|
||||||
gen-mapping: decoded output x 381,379,234 ops/sec ±0.29% (96 runs sampled)
|
|
||||||
gen-mapping: encoded output x 95.15 ops/sec ±2.98% (72 runs sampled)
|
|
||||||
source-map-js: encoded output x 15.20 ops/sec ±7.41% (33 runs sampled)
|
|
||||||
source-map-0.6.1: encoded output x 16.36 ops/sec ±10.46% (31 runs sampled)
|
|
||||||
source-map-0.8.0: encoded output x 16.06 ops/sec ±6.45% (31 runs sampled)
|
|
||||||
Fastest is gen-mapping: decoded output
|
|
||||||
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
|
|
||||||
preact.js.map
|
|
||||||
Memory Usage:
|
|
||||||
gen-mapping: addSegment 416247 bytes
|
|
||||||
gen-mapping: addMapping 419824 bytes
|
|
||||||
source-map-js 1024619 bytes
|
|
||||||
source-map-0.6.1 1146004 bytes
|
|
||||||
source-map-0.8.0 1113250 bytes
|
|
||||||
Smallest memory usage is gen-mapping: addSegment
|
|
||||||
|
|
||||||
Adding speed:
|
|
||||||
gen-mapping: addSegment x 13,755 ops/sec ±0.15% (98 runs sampled)
|
|
||||||
gen-mapping: addMapping x 13,013 ops/sec ±0.11% (101 runs sampled)
|
|
||||||
source-map-js: addMapping x 4,564 ops/sec ±0.21% (98 runs sampled)
|
|
||||||
source-map-0.6.1: addMapping x 4,562 ops/sec ±0.11% (99 runs sampled)
|
|
||||||
source-map-0.8.0: addMapping x 4,593 ops/sec ±0.11% (100 runs sampled)
|
|
||||||
Fastest is gen-mapping: addSegment
|
|
||||||
|
|
||||||
Generate speed:
|
|
||||||
gen-mapping: decoded output x 379,864,020 ops/sec ±0.23% (93 runs sampled)
|
|
||||||
gen-mapping: encoded output x 14,368 ops/sec ±4.07% (82 runs sampled)
|
|
||||||
source-map-js: encoded output x 5,261 ops/sec ±0.21% (99 runs sampled)
|
|
||||||
source-map-0.6.1: encoded output x 5,124 ops/sec ±0.58% (99 runs sampled)
|
|
||||||
source-map-0.8.0: encoded output x 5,434 ops/sec ±0.33% (96 runs sampled)
|
|
||||||
Fastest is gen-mapping: decoded output
|
|
||||||
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
|
|
||||||
react.js.map
|
|
||||||
Memory Usage:
|
|
||||||
gen-mapping: addSegment 975096 bytes
|
|
||||||
gen-mapping: addMapping 1102981 bytes
|
|
||||||
source-map-js 2918836 bytes
|
|
||||||
source-map-0.6.1 2885435 bytes
|
|
||||||
source-map-0.8.0 2874336 bytes
|
|
||||||
Smallest memory usage is gen-mapping: addSegment
|
|
||||||
|
|
||||||
Adding speed:
|
|
||||||
gen-mapping: addSegment x 4,772 ops/sec ±0.15% (100 runs sampled)
|
|
||||||
gen-mapping: addMapping x 4,456 ops/sec ±0.13% (97 runs sampled)
|
|
||||||
source-map-js: addMapping x 1,618 ops/sec ±0.24% (97 runs sampled)
|
|
||||||
source-map-0.6.1: addMapping x 1,622 ops/sec ±0.12% (99 runs sampled)
|
|
||||||
source-map-0.8.0: addMapping x 1,631 ops/sec ±0.12% (100 runs sampled)
|
|
||||||
Fastest is gen-mapping: addSegment
|
|
||||||
|
|
||||||
Generate speed:
|
|
||||||
gen-mapping: decoded output x 379,107,695 ops/sec ±0.07% (99 runs sampled)
|
|
||||||
gen-mapping: encoded output x 5,421 ops/sec ±1.60% (89 runs sampled)
|
|
||||||
source-map-js: encoded output x 2,113 ops/sec ±1.81% (98 runs sampled)
|
|
||||||
source-map-0.6.1: encoded output x 2,126 ops/sec ±0.10% (100 runs sampled)
|
|
||||||
source-map-0.8.0: encoded output x 2,176 ops/sec ±0.39% (98 runs sampled)
|
|
||||||
Fastest is gen-mapping: decoded output
|
|
||||||
```
|
|
||||||
|
|
||||||
[source-map]: https://www.npmjs.com/package/source-map
|
|
||||||
[trace-mapping]: https://github.com/jridgewell/trace-mapping
|
|
230
node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs
generated
vendored
230
node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs
generated
vendored
@ -1,230 +0,0 @@
|
|||||||
import { SetArray, put } from '@jridgewell/set-array';
|
|
||||||
import { encode } from '@jridgewell/sourcemap-codec';
|
|
||||||
import { TraceMap, decodedMappings } from '@jridgewell/trace-mapping';
|
|
||||||
|
|
||||||
const COLUMN = 0;
|
|
||||||
const SOURCES_INDEX = 1;
|
|
||||||
const SOURCE_LINE = 2;
|
|
||||||
const SOURCE_COLUMN = 3;
|
|
||||||
const NAMES_INDEX = 4;
|
|
||||||
|
|
||||||
const NO_NAME = -1;
|
|
||||||
/**
|
|
||||||
* A low-level API to associate a generated position with an original source position. Line and
|
|
||||||
* column here are 0-based, unlike `addMapping`.
|
|
||||||
*/
|
|
||||||
let addSegment;
|
|
||||||
/**
|
|
||||||
* A high-level API to associate a generated position with an original source position. Line is
|
|
||||||
* 1-based, but column is 0-based, due to legacy behavior in `source-map` library.
|
|
||||||
*/
|
|
||||||
let addMapping;
|
|
||||||
/**
|
|
||||||
* Same as `addSegment`, but will only add the segment if it generates useful information in the
|
|
||||||
* resulting map. This only works correctly if segments are added **in order**, meaning you should
|
|
||||||
* not add a segment with a lower generated line/column than one that came before.
|
|
||||||
*/
|
|
||||||
let maybeAddSegment;
|
|
||||||
/**
|
|
||||||
* Same as `addMapping`, but will only add the mapping if it generates useful information in the
|
|
||||||
* resulting map. This only works correctly if mappings are added **in order**, meaning you should
|
|
||||||
* not add a mapping with a lower generated line/column than one that came before.
|
|
||||||
*/
|
|
||||||
let maybeAddMapping;
|
|
||||||
/**
|
|
||||||
* Adds/removes the content of the source file to the source map.
|
|
||||||
*/
|
|
||||||
let setSourceContent;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
let toDecodedMap;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
let toEncodedMap;
|
|
||||||
/**
|
|
||||||
* Constructs a new GenMapping, using the already present mappings of the input.
|
|
||||||
*/
|
|
||||||
let fromMap;
|
|
||||||
/**
|
|
||||||
* Returns an array of high-level mapping objects for every recorded segment, which could then be
|
|
||||||
* passed to the `source-map` library.
|
|
||||||
*/
|
|
||||||
let allMappings;
|
|
||||||
// This split declaration is only so that terser can elminiate the static initialization block.
|
|
||||||
let addSegmentInternal;
|
|
||||||
/**
|
|
||||||
* Provides the state to generate a sourcemap.
|
|
||||||
*/
|
|
||||||
class GenMapping {
|
|
||||||
constructor({ file, sourceRoot } = {}) {
|
|
||||||
this._names = new SetArray();
|
|
||||||
this._sources = new SetArray();
|
|
||||||
this._sourcesContent = [];
|
|
||||||
this._mappings = [];
|
|
||||||
this.file = file;
|
|
||||||
this.sourceRoot = sourceRoot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
|
|
||||||
return addSegmentInternal(false, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);
|
|
||||||
};
|
|
||||||
maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
|
|
||||||
return addSegmentInternal(true, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);
|
|
||||||
};
|
|
||||||
addMapping = (map, mapping) => {
|
|
||||||
return addMappingInternal(false, map, mapping);
|
|
||||||
};
|
|
||||||
maybeAddMapping = (map, mapping) => {
|
|
||||||
return addMappingInternal(true, map, mapping);
|
|
||||||
};
|
|
||||||
setSourceContent = (map, source, content) => {
|
|
||||||
const { _sources: sources, _sourcesContent: sourcesContent } = map;
|
|
||||||
sourcesContent[put(sources, source)] = content;
|
|
||||||
};
|
|
||||||
toDecodedMap = (map) => {
|
|
||||||
const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
|
|
||||||
removeEmptyFinalLines(mappings);
|
|
||||||
return {
|
|
||||||
version: 3,
|
|
||||||
file: file || undefined,
|
|
||||||
names: names.array,
|
|
||||||
sourceRoot: sourceRoot || undefined,
|
|
||||||
sources: sources.array,
|
|
||||||
sourcesContent,
|
|
||||||
mappings,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
toEncodedMap = (map) => {
|
|
||||||
const decoded = toDecodedMap(map);
|
|
||||||
return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });
|
|
||||||
};
|
|
||||||
allMappings = (map) => {
|
|
||||||
const out = [];
|
|
||||||
const { _mappings: mappings, _sources: sources, _names: names } = map;
|
|
||||||
for (let i = 0; i < mappings.length; i++) {
|
|
||||||
const line = mappings[i];
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const seg = line[j];
|
|
||||||
const generated = { line: i + 1, column: seg[COLUMN] };
|
|
||||||
let source = undefined;
|
|
||||||
let original = undefined;
|
|
||||||
let name = undefined;
|
|
||||||
if (seg.length !== 1) {
|
|
||||||
source = sources.array[seg[SOURCES_INDEX]];
|
|
||||||
original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };
|
|
||||||
if (seg.length === 5)
|
|
||||||
name = names.array[seg[NAMES_INDEX]];
|
|
||||||
}
|
|
||||||
out.push({ generated, source, original, name });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
};
|
|
||||||
fromMap = (input) => {
|
|
||||||
const map = new TraceMap(input);
|
|
||||||
const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });
|
|
||||||
putAll(gen._names, map.names);
|
|
||||||
putAll(gen._sources, map.sources);
|
|
||||||
gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);
|
|
||||||
gen._mappings = decodedMappings(map);
|
|
||||||
return gen;
|
|
||||||
};
|
|
||||||
// Internal helpers
|
|
||||||
addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
|
|
||||||
const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
|
|
||||||
const line = getLine(mappings, genLine);
|
|
||||||
const index = getColumnIndex(line, genColumn);
|
|
||||||
if (!source) {
|
|
||||||
if (skipable && skipSourceless(line, index))
|
|
||||||
return;
|
|
||||||
return insert(line, index, [genColumn]);
|
|
||||||
}
|
|
||||||
const sourcesIndex = put(sources, source);
|
|
||||||
const namesIndex = name ? put(names, name) : NO_NAME;
|
|
||||||
if (sourcesIndex === sourcesContent.length)
|
|
||||||
sourcesContent[sourcesIndex] = content !== null && content !== void 0 ? content : null;
|
|
||||||
if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return insert(line, index, name
|
|
||||||
? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
|
|
||||||
: [genColumn, sourcesIndex, sourceLine, sourceColumn]);
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
function getLine(mappings, index) {
|
|
||||||
for (let i = mappings.length; i <= index; i++) {
|
|
||||||
mappings[i] = [];
|
|
||||||
}
|
|
||||||
return mappings[index];
|
|
||||||
}
|
|
||||||
function getColumnIndex(line, genColumn) {
|
|
||||||
let index = line.length;
|
|
||||||
for (let i = index - 1; i >= 0; index = i--) {
|
|
||||||
const current = line[i];
|
|
||||||
if (genColumn >= current[COLUMN])
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function insert(array, index, value) {
|
|
||||||
for (let i = array.length; i > index; i--) {
|
|
||||||
array[i] = array[i - 1];
|
|
||||||
}
|
|
||||||
array[index] = value;
|
|
||||||
}
|
|
||||||
function removeEmptyFinalLines(mappings) {
|
|
||||||
const { length } = mappings;
|
|
||||||
let len = length;
|
|
||||||
for (let i = len - 1; i >= 0; len = i, i--) {
|
|
||||||
if (mappings[i].length > 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (len < length)
|
|
||||||
mappings.length = len;
|
|
||||||
}
|
|
||||||
function putAll(strarr, array) {
|
|
||||||
for (let i = 0; i < array.length; i++)
|
|
||||||
put(strarr, array[i]);
|
|
||||||
}
|
|
||||||
function skipSourceless(line, index) {
|
|
||||||
// The start of a line is already sourceless, so adding a sourceless segment to the beginning
|
|
||||||
// doesn't generate any useful information.
|
|
||||||
if (index === 0)
|
|
||||||
return true;
|
|
||||||
const prev = line[index - 1];
|
|
||||||
// If the previous segment is also sourceless, then adding another sourceless segment doesn't
|
|
||||||
// genrate any new information. Else, this segment will end the source/named segment and point to
|
|
||||||
// a sourceless position, which is useful.
|
|
||||||
return prev.length === 1;
|
|
||||||
}
|
|
||||||
function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {
|
|
||||||
// A source/named segment at the start of a line gives position at that genColumn
|
|
||||||
if (index === 0)
|
|
||||||
return false;
|
|
||||||
const prev = line[index - 1];
|
|
||||||
// If the previous segment is sourceless, then we're transitioning to a source.
|
|
||||||
if (prev.length === 1)
|
|
||||||
return false;
|
|
||||||
// If the previous segment maps to the exact same source position, then this segment doesn't
|
|
||||||
// provide any new position information.
|
|
||||||
return (sourcesIndex === prev[SOURCES_INDEX] &&
|
|
||||||
sourceLine === prev[SOURCE_LINE] &&
|
|
||||||
sourceColumn === prev[SOURCE_COLUMN] &&
|
|
||||||
namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));
|
|
||||||
}
|
|
||||||
function addMappingInternal(skipable, map, mapping) {
|
|
||||||
const { generated, source, original, name, content } = mapping;
|
|
||||||
if (!source) {
|
|
||||||
return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null, null);
|
|
||||||
}
|
|
||||||
const s = source;
|
|
||||||
return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name, content);
|
|
||||||
}
|
|
||||||
|
|
||||||
export { GenMapping, addMapping, addSegment, allMappings, fromMap, maybeAddMapping, maybeAddSegment, setSourceContent, toDecodedMap, toEncodedMap };
|
|
||||||
//# sourceMappingURL=gen-mapping.mjs.map
|
|
1
node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map
generated
vendored
1
node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map
generated
vendored
File diff suppressed because one or more lines are too long
236
node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js
generated
vendored
236
node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js
generated
vendored
@ -1,236 +0,0 @@
|
|||||||
(function (global, factory) {
|
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@jridgewell/set-array'), require('@jridgewell/sourcemap-codec'), require('@jridgewell/trace-mapping')) :
|
|
||||||
typeof define === 'function' && define.amd ? define(['exports', '@jridgewell/set-array', '@jridgewell/sourcemap-codec', '@jridgewell/trace-mapping'], factory) :
|
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.genMapping = {}, global.setArray, global.sourcemapCodec, global.traceMapping));
|
|
||||||
})(this, (function (exports, setArray, sourcemapCodec, traceMapping) { 'use strict';
|
|
||||||
|
|
||||||
const COLUMN = 0;
|
|
||||||
const SOURCES_INDEX = 1;
|
|
||||||
const SOURCE_LINE = 2;
|
|
||||||
const SOURCE_COLUMN = 3;
|
|
||||||
const NAMES_INDEX = 4;
|
|
||||||
|
|
||||||
const NO_NAME = -1;
|
|
||||||
/**
|
|
||||||
* A low-level API to associate a generated position with an original source position. Line and
|
|
||||||
* column here are 0-based, unlike `addMapping`.
|
|
||||||
*/
|
|
||||||
exports.addSegment = void 0;
|
|
||||||
/**
|
|
||||||
* A high-level API to associate a generated position with an original source position. Line is
|
|
||||||
* 1-based, but column is 0-based, due to legacy behavior in `source-map` library.
|
|
||||||
*/
|
|
||||||
exports.addMapping = void 0;
|
|
||||||
/**
|
|
||||||
* Same as `addSegment`, but will only add the segment if it generates useful information in the
|
|
||||||
* resulting map. This only works correctly if segments are added **in order**, meaning you should
|
|
||||||
* not add a segment with a lower generated line/column than one that came before.
|
|
||||||
*/
|
|
||||||
exports.maybeAddSegment = void 0;
|
|
||||||
/**
|
|
||||||
* Same as `addMapping`, but will only add the mapping if it generates useful information in the
|
|
||||||
* resulting map. This only works correctly if mappings are added **in order**, meaning you should
|
|
||||||
* not add a mapping with a lower generated line/column than one that came before.
|
|
||||||
*/
|
|
||||||
exports.maybeAddMapping = void 0;
|
|
||||||
/**
|
|
||||||
* Adds/removes the content of the source file to the source map.
|
|
||||||
*/
|
|
||||||
exports.setSourceContent = void 0;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
exports.toDecodedMap = void 0;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
exports.toEncodedMap = void 0;
|
|
||||||
/**
|
|
||||||
* Constructs a new GenMapping, using the already present mappings of the input.
|
|
||||||
*/
|
|
||||||
exports.fromMap = void 0;
|
|
||||||
/**
|
|
||||||
* Returns an array of high-level mapping objects for every recorded segment, which could then be
|
|
||||||
* passed to the `source-map` library.
|
|
||||||
*/
|
|
||||||
exports.allMappings = void 0;
|
|
||||||
// This split declaration is only so that terser can elminiate the static initialization block.
|
|
||||||
let addSegmentInternal;
|
|
||||||
/**
|
|
||||||
* Provides the state to generate a sourcemap.
|
|
||||||
*/
|
|
||||||
class GenMapping {
|
|
||||||
constructor({ file, sourceRoot } = {}) {
|
|
||||||
this._names = new setArray.SetArray();
|
|
||||||
this._sources = new setArray.SetArray();
|
|
||||||
this._sourcesContent = [];
|
|
||||||
this._mappings = [];
|
|
||||||
this.file = file;
|
|
||||||
this.sourceRoot = sourceRoot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
exports.addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
|
|
||||||
return addSegmentInternal(false, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);
|
|
||||||
};
|
|
||||||
exports.maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
|
|
||||||
return addSegmentInternal(true, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);
|
|
||||||
};
|
|
||||||
exports.addMapping = (map, mapping) => {
|
|
||||||
return addMappingInternal(false, map, mapping);
|
|
||||||
};
|
|
||||||
exports.maybeAddMapping = (map, mapping) => {
|
|
||||||
return addMappingInternal(true, map, mapping);
|
|
||||||
};
|
|
||||||
exports.setSourceContent = (map, source, content) => {
|
|
||||||
const { _sources: sources, _sourcesContent: sourcesContent } = map;
|
|
||||||
sourcesContent[setArray.put(sources, source)] = content;
|
|
||||||
};
|
|
||||||
exports.toDecodedMap = (map) => {
|
|
||||||
const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
|
|
||||||
removeEmptyFinalLines(mappings);
|
|
||||||
return {
|
|
||||||
version: 3,
|
|
||||||
file: file || undefined,
|
|
||||||
names: names.array,
|
|
||||||
sourceRoot: sourceRoot || undefined,
|
|
||||||
sources: sources.array,
|
|
||||||
sourcesContent,
|
|
||||||
mappings,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
exports.toEncodedMap = (map) => {
|
|
||||||
const decoded = exports.toDecodedMap(map);
|
|
||||||
return Object.assign(Object.assign({}, decoded), { mappings: sourcemapCodec.encode(decoded.mappings) });
|
|
||||||
};
|
|
||||||
exports.allMappings = (map) => {
|
|
||||||
const out = [];
|
|
||||||
const { _mappings: mappings, _sources: sources, _names: names } = map;
|
|
||||||
for (let i = 0; i < mappings.length; i++) {
|
|
||||||
const line = mappings[i];
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const seg = line[j];
|
|
||||||
const generated = { line: i + 1, column: seg[COLUMN] };
|
|
||||||
let source = undefined;
|
|
||||||
let original = undefined;
|
|
||||||
let name = undefined;
|
|
||||||
if (seg.length !== 1) {
|
|
||||||
source = sources.array[seg[SOURCES_INDEX]];
|
|
||||||
original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };
|
|
||||||
if (seg.length === 5)
|
|
||||||
name = names.array[seg[NAMES_INDEX]];
|
|
||||||
}
|
|
||||||
out.push({ generated, source, original, name });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
};
|
|
||||||
exports.fromMap = (input) => {
|
|
||||||
const map = new traceMapping.TraceMap(input);
|
|
||||||
const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });
|
|
||||||
putAll(gen._names, map.names);
|
|
||||||
putAll(gen._sources, map.sources);
|
|
||||||
gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);
|
|
||||||
gen._mappings = traceMapping.decodedMappings(map);
|
|
||||||
return gen;
|
|
||||||
};
|
|
||||||
// Internal helpers
|
|
||||||
addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
|
|
||||||
const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
|
|
||||||
const line = getLine(mappings, genLine);
|
|
||||||
const index = getColumnIndex(line, genColumn);
|
|
||||||
if (!source) {
|
|
||||||
if (skipable && skipSourceless(line, index))
|
|
||||||
return;
|
|
||||||
return insert(line, index, [genColumn]);
|
|
||||||
}
|
|
||||||
const sourcesIndex = setArray.put(sources, source);
|
|
||||||
const namesIndex = name ? setArray.put(names, name) : NO_NAME;
|
|
||||||
if (sourcesIndex === sourcesContent.length)
|
|
||||||
sourcesContent[sourcesIndex] = content !== null && content !== void 0 ? content : null;
|
|
||||||
if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return insert(line, index, name
|
|
||||||
? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
|
|
||||||
: [genColumn, sourcesIndex, sourceLine, sourceColumn]);
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
function getLine(mappings, index) {
|
|
||||||
for (let i = mappings.length; i <= index; i++) {
|
|
||||||
mappings[i] = [];
|
|
||||||
}
|
|
||||||
return mappings[index];
|
|
||||||
}
|
|
||||||
function getColumnIndex(line, genColumn) {
|
|
||||||
let index = line.length;
|
|
||||||
for (let i = index - 1; i >= 0; index = i--) {
|
|
||||||
const current = line[i];
|
|
||||||
if (genColumn >= current[COLUMN])
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function insert(array, index, value) {
|
|
||||||
for (let i = array.length; i > index; i--) {
|
|
||||||
array[i] = array[i - 1];
|
|
||||||
}
|
|
||||||
array[index] = value;
|
|
||||||
}
|
|
||||||
function removeEmptyFinalLines(mappings) {
|
|
||||||
const { length } = mappings;
|
|
||||||
let len = length;
|
|
||||||
for (let i = len - 1; i >= 0; len = i, i--) {
|
|
||||||
if (mappings[i].length > 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (len < length)
|
|
||||||
mappings.length = len;
|
|
||||||
}
|
|
||||||
function putAll(strarr, array) {
|
|
||||||
for (let i = 0; i < array.length; i++)
|
|
||||||
setArray.put(strarr, array[i]);
|
|
||||||
}
|
|
||||||
function skipSourceless(line, index) {
|
|
||||||
// The start of a line is already sourceless, so adding a sourceless segment to the beginning
|
|
||||||
// doesn't generate any useful information.
|
|
||||||
if (index === 0)
|
|
||||||
return true;
|
|
||||||
const prev = line[index - 1];
|
|
||||||
// If the previous segment is also sourceless, then adding another sourceless segment doesn't
|
|
||||||
// genrate any new information. Else, this segment will end the source/named segment and point to
|
|
||||||
// a sourceless position, which is useful.
|
|
||||||
return prev.length === 1;
|
|
||||||
}
|
|
||||||
function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {
|
|
||||||
// A source/named segment at the start of a line gives position at that genColumn
|
|
||||||
if (index === 0)
|
|
||||||
return false;
|
|
||||||
const prev = line[index - 1];
|
|
||||||
// If the previous segment is sourceless, then we're transitioning to a source.
|
|
||||||
if (prev.length === 1)
|
|
||||||
return false;
|
|
||||||
// If the previous segment maps to the exact same source position, then this segment doesn't
|
|
||||||
// provide any new position information.
|
|
||||||
return (sourcesIndex === prev[SOURCES_INDEX] &&
|
|
||||||
sourceLine === prev[SOURCE_LINE] &&
|
|
||||||
sourceColumn === prev[SOURCE_COLUMN] &&
|
|
||||||
namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));
|
|
||||||
}
|
|
||||||
function addMappingInternal(skipable, map, mapping) {
|
|
||||||
const { generated, source, original, name, content } = mapping;
|
|
||||||
if (!source) {
|
|
||||||
return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null, null);
|
|
||||||
}
|
|
||||||
const s = source;
|
|
||||||
return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name, content);
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.GenMapping = GenMapping;
|
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
|
||||||
|
|
||||||
}));
|
|
||||||
//# sourceMappingURL=gen-mapping.umd.js.map
|
|
1
node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map
generated
vendored
1
node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map
generated
vendored
File diff suppressed because one or more lines are too long
90
node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts
generated
vendored
90
node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts
generated
vendored
@ -1,90 +0,0 @@
|
|||||||
import type { SourceMapInput } from '@jridgewell/trace-mapping';
|
|
||||||
import type { DecodedSourceMap, EncodedSourceMap, Pos, Mapping } from './types';
|
|
||||||
export type { DecodedSourceMap, EncodedSourceMap, Mapping };
|
|
||||||
export declare type Options = {
|
|
||||||
file?: string | null;
|
|
||||||
sourceRoot?: string | null;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* A low-level API to associate a generated position with an original source position. Line and
|
|
||||||
* column here are 0-based, unlike `addMapping`.
|
|
||||||
*/
|
|
||||||
export declare let addSegment: {
|
|
||||||
(map: GenMapping, genLine: number, genColumn: number, source?: null, sourceLine?: null, sourceColumn?: null, name?: null, content?: null): void;
|
|
||||||
(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name?: null, content?: string | null): void;
|
|
||||||
(map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name: string, content?: string | null): void;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* A high-level API to associate a generated position with an original source position. Line is
|
|
||||||
* 1-based, but column is 0-based, due to legacy behavior in `source-map` library.
|
|
||||||
*/
|
|
||||||
export declare let addMapping: {
|
|
||||||
(map: GenMapping, mapping: {
|
|
||||||
generated: Pos;
|
|
||||||
source?: null;
|
|
||||||
original?: null;
|
|
||||||
name?: null;
|
|
||||||
content?: null;
|
|
||||||
}): void;
|
|
||||||
(map: GenMapping, mapping: {
|
|
||||||
generated: Pos;
|
|
||||||
source: string;
|
|
||||||
original: Pos;
|
|
||||||
name?: null;
|
|
||||||
content?: string | null;
|
|
||||||
}): void;
|
|
||||||
(map: GenMapping, mapping: {
|
|
||||||
generated: Pos;
|
|
||||||
source: string;
|
|
||||||
original: Pos;
|
|
||||||
name: string;
|
|
||||||
content?: string | null;
|
|
||||||
}): void;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Same as `addSegment`, but will only add the segment if it generates useful information in the
|
|
||||||
* resulting map. This only works correctly if segments are added **in order**, meaning you should
|
|
||||||
* not add a segment with a lower generated line/column than one that came before.
|
|
||||||
*/
|
|
||||||
export declare let maybeAddSegment: typeof addSegment;
|
|
||||||
/**
|
|
||||||
* Same as `addMapping`, but will only add the mapping if it generates useful information in the
|
|
||||||
* resulting map. This only works correctly if mappings are added **in order**, meaning you should
|
|
||||||
* not add a mapping with a lower generated line/column than one that came before.
|
|
||||||
*/
|
|
||||||
export declare let maybeAddMapping: typeof addMapping;
|
|
||||||
/**
|
|
||||||
* Adds/removes the content of the source file to the source map.
|
|
||||||
*/
|
|
||||||
export declare let setSourceContent: (map: GenMapping, source: string, content: string | null) => void;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
export declare let toDecodedMap: (map: GenMapping) => DecodedSourceMap;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
export declare let toEncodedMap: (map: GenMapping) => EncodedSourceMap;
|
|
||||||
/**
|
|
||||||
* Constructs a new GenMapping, using the already present mappings of the input.
|
|
||||||
*/
|
|
||||||
export declare let fromMap: (input: SourceMapInput) => GenMapping;
|
|
||||||
/**
|
|
||||||
* Returns an array of high-level mapping objects for every recorded segment, which could then be
|
|
||||||
* passed to the `source-map` library.
|
|
||||||
*/
|
|
||||||
export declare let allMappings: (map: GenMapping) => Mapping[];
|
|
||||||
/**
|
|
||||||
* Provides the state to generate a sourcemap.
|
|
||||||
*/
|
|
||||||
export declare class GenMapping {
|
|
||||||
private _names;
|
|
||||||
private _sources;
|
|
||||||
private _sourcesContent;
|
|
||||||
private _mappings;
|
|
||||||
file: string | null | undefined;
|
|
||||||
sourceRoot: string | null | undefined;
|
|
||||||
constructor({ file, sourceRoot }?: Options);
|
|
||||||
}
|
|
12
node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts
generated
vendored
12
node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
declare type GeneratedColumn = number;
|
|
||||||
declare type SourcesIndex = number;
|
|
||||||
declare type SourceLine = number;
|
|
||||||
declare type SourceColumn = number;
|
|
||||||
declare type NamesIndex = number;
|
|
||||||
export declare type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex];
|
|
||||||
export declare const COLUMN = 0;
|
|
||||||
export declare const SOURCES_INDEX = 1;
|
|
||||||
export declare const SOURCE_LINE = 2;
|
|
||||||
export declare const SOURCE_COLUMN = 3;
|
|
||||||
export declare const NAMES_INDEX = 4;
|
|
||||||
export {};
|
|
35
node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts
generated
vendored
35
node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts
generated
vendored
@ -1,35 +0,0 @@
|
|||||||
import type { SourceMapSegment } from './sourcemap-segment';
|
|
||||||
export interface SourceMapV3 {
|
|
||||||
file?: string | null;
|
|
||||||
names: readonly string[];
|
|
||||||
sourceRoot?: string;
|
|
||||||
sources: readonly (string | null)[];
|
|
||||||
sourcesContent?: readonly (string | null)[];
|
|
||||||
version: 3;
|
|
||||||
}
|
|
||||||
export interface EncodedSourceMap extends SourceMapV3 {
|
|
||||||
mappings: string;
|
|
||||||
}
|
|
||||||
export interface DecodedSourceMap extends SourceMapV3 {
|
|
||||||
mappings: readonly SourceMapSegment[][];
|
|
||||||
}
|
|
||||||
export interface Pos {
|
|
||||||
line: number;
|
|
||||||
column: number;
|
|
||||||
}
|
|
||||||
export declare type Mapping = {
|
|
||||||
generated: Pos;
|
|
||||||
source: undefined;
|
|
||||||
original: undefined;
|
|
||||||
name: undefined;
|
|
||||||
} | {
|
|
||||||
generated: Pos;
|
|
||||||
source: string;
|
|
||||||
original: Pos;
|
|
||||||
name: string;
|
|
||||||
} | {
|
|
||||||
generated: Pos;
|
|
||||||
source: string;
|
|
||||||
original: Pos;
|
|
||||||
name: undefined;
|
|
||||||
};
|
|
77
node_modules/@jridgewell/gen-mapping/package.json
generated
vendored
77
node_modules/@jridgewell/gen-mapping/package.json
generated
vendored
@ -1,77 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@jridgewell/gen-mapping",
|
|
||||||
"version": "0.3.3",
|
|
||||||
"description": "Generate source maps",
|
|
||||||
"keywords": [
|
|
||||||
"source",
|
|
||||||
"map"
|
|
||||||
],
|
|
||||||
"author": "Justin Ridgewell <justin@ridgewell.name>",
|
|
||||||
"license": "MIT",
|
|
||||||
"repository": "https://github.com/jridgewell/gen-mapping",
|
|
||||||
"main": "dist/gen-mapping.umd.js",
|
|
||||||
"module": "dist/gen-mapping.mjs",
|
|
||||||
"types": "dist/types/gen-mapping.d.ts",
|
|
||||||
"exports": {
|
|
||||||
".": [
|
|
||||||
{
|
|
||||||
"types": "./dist/types/gen-mapping.d.ts",
|
|
||||||
"browser": "./dist/gen-mapping.umd.js",
|
|
||||||
"require": "./dist/gen-mapping.umd.js",
|
|
||||||
"import": "./dist/gen-mapping.mjs"
|
|
||||||
},
|
|
||||||
"./dist/gen-mapping.umd.js"
|
|
||||||
],
|
|
||||||
"./package.json": "./package.json"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"dist"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6.0.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"benchmark": "run-s build:rollup benchmark:*",
|
|
||||||
"benchmark:install": "cd benchmark && npm install",
|
|
||||||
"benchmark:only": "node benchmark/index.mjs",
|
|
||||||
"prebuild": "rm -rf dist",
|
|
||||||
"build": "run-s -n build:*",
|
|
||||||
"build:rollup": "rollup -c rollup.config.js",
|
|
||||||
"build:ts": "tsc --project tsconfig.build.json",
|
|
||||||
"lint": "run-s -n lint:*",
|
|
||||||
"lint:prettier": "npm run test:lint:prettier -- --write",
|
|
||||||
"lint:ts": "npm run test:lint:ts -- --fix",
|
|
||||||
"pretest": "run-s build:rollup",
|
|
||||||
"test": "run-s -n test:lint test:coverage",
|
|
||||||
"test:debug": "mocha --inspect-brk",
|
|
||||||
"test:lint": "run-s -n test:lint:*",
|
|
||||||
"test:lint:prettier": "prettier --check '{src,test}/**/*.ts'",
|
|
||||||
"test:lint:ts": "eslint '{src,test}/**/*.ts'",
|
|
||||||
"test:only": "mocha",
|
|
||||||
"test:coverage": "c8 mocha",
|
|
||||||
"test:watch": "run-p 'build:rollup -- --watch' 'test:only -- --watch'",
|
|
||||||
"prepublishOnly": "npm run preversion",
|
|
||||||
"preversion": "run-s test build"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@rollup/plugin-typescript": "8.3.2",
|
|
||||||
"@types/mocha": "9.1.1",
|
|
||||||
"@types/node": "17.0.29",
|
|
||||||
"@typescript-eslint/eslint-plugin": "5.21.0",
|
|
||||||
"@typescript-eslint/parser": "5.21.0",
|
|
||||||
"benchmark": "2.1.4",
|
|
||||||
"c8": "7.11.2",
|
|
||||||
"eslint": "8.14.0",
|
|
||||||
"eslint-config-prettier": "8.5.0",
|
|
||||||
"mocha": "9.2.2",
|
|
||||||
"npm-run-all": "4.1.5",
|
|
||||||
"prettier": "2.6.2",
|
|
||||||
"rollup": "2.70.2",
|
|
||||||
"typescript": "4.6.3"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@jridgewell/set-array": "^1.0.1",
|
|
||||||
"@jridgewell/sourcemap-codec": "^1.4.10",
|
|
||||||
"@jridgewell/trace-mapping": "^0.3.9"
|
|
||||||
}
|
|
||||||
}
|
|
19
node_modules/@jridgewell/resolve-uri/LICENSE
generated
vendored
19
node_modules/@jridgewell/resolve-uri/LICENSE
generated
vendored
@ -1,19 +0,0 @@
|
|||||||
Copyright 2019 Justin Ridgewell <jridgewell@google.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
40
node_modules/@jridgewell/resolve-uri/README.md
generated
vendored
40
node_modules/@jridgewell/resolve-uri/README.md
generated
vendored
@ -1,40 +0,0 @@
|
|||||||
# @jridgewell/resolve-uri
|
|
||||||
|
|
||||||
> Resolve a URI relative to an optional base URI
|
|
||||||
|
|
||||||
Resolve any combination of absolute URIs, protocol-realtive URIs, absolute paths, or relative paths.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install @jridgewell/resolve-uri
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
function resolve(input: string, base?: string): string;
|
|
||||||
```
|
|
||||||
|
|
||||||
```js
|
|
||||||
import resolve from '@jridgewell/resolve-uri';
|
|
||||||
|
|
||||||
resolve('foo', 'https://example.com'); // => 'https://example.com/foo'
|
|
||||||
```
|
|
||||||
|
|
||||||
| Input | Base | Resolution | Explanation |
|
|
||||||
|-----------------------|-------------------------|--------------------------------|--------------------------------------------------------------|
|
|
||||||
| `https://example.com` | _any_ | `https://example.com/` | Input is normalized only |
|
|
||||||
| `//example.com` | `https://base.com/` | `https://example.com/` | Input inherits the base's protocol |
|
|
||||||
| `//example.com` | _rest_ | `//example.com/` | Input is normalized only |
|
|
||||||
| `/example` | `https://base.com/` | `https://base.com/example` | Input inherits the base's origin |
|
|
||||||
| `/example` | `//base.com/` | `//base.com/example` | Input inherits the base's host and remains protocol relative |
|
|
||||||
| `/example` | _rest_ | `/example` | Input is normalized only |
|
|
||||||
| `example` | `https://base.com/dir/` | `https://base.com/dir/example` | Input is joined with the base |
|
|
||||||
| `example` | `https://base.com/file` | `https://base.com/example` | Input is joined with the base without its file |
|
|
||||||
| `example` | `//base.com/dir/` | `//base.com/dir/example` | Input is joined with the base's last directory |
|
|
||||||
| `example` | `//base.com/file` | `//base.com/example` | Input is joined with the base without its file |
|
|
||||||
| `example` | `/base/dir/` | `/base/dir/example` | Input is joined with the base's last directory |
|
|
||||||
| `example` | `/base/file` | `/base/example` | Input is joined with the base without its file |
|
|
||||||
| `example` | `base/dir/` | `base/dir/example` | Input is joined with the base's last directory |
|
|
||||||
| `example` | `base/file` | `base/example` | Input is joined with the base without its file |
|
|
242
node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs
generated
vendored
242
node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs
generated
vendored
@ -1,242 +0,0 @@
|
|||||||
// Matches the scheme of a URL, eg "http://"
|
|
||||||
const schemeRegex = /^[\w+.-]+:\/\//;
|
|
||||||
/**
|
|
||||||
* Matches the parts of a URL:
|
|
||||||
* 1. Scheme, including ":", guaranteed.
|
|
||||||
* 2. User/password, including "@", optional.
|
|
||||||
* 3. Host, guaranteed.
|
|
||||||
* 4. Port, including ":", optional.
|
|
||||||
* 5. Path, including "/", optional.
|
|
||||||
* 6. Query, including "?", optional.
|
|
||||||
* 7. Hash, including "#", optional.
|
|
||||||
*/
|
|
||||||
const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/;
|
|
||||||
/**
|
|
||||||
* File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start
|
|
||||||
* with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).
|
|
||||||
*
|
|
||||||
* 1. Host, optional.
|
|
||||||
* 2. Path, which may include "/", guaranteed.
|
|
||||||
* 3. Query, including "?", optional.
|
|
||||||
* 4. Hash, including "#", optional.
|
|
||||||
*/
|
|
||||||
const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;
|
|
||||||
var UrlType;
|
|
||||||
(function (UrlType) {
|
|
||||||
UrlType[UrlType["Empty"] = 1] = "Empty";
|
|
||||||
UrlType[UrlType["Hash"] = 2] = "Hash";
|
|
||||||
UrlType[UrlType["Query"] = 3] = "Query";
|
|
||||||
UrlType[UrlType["RelativePath"] = 4] = "RelativePath";
|
|
||||||
UrlType[UrlType["AbsolutePath"] = 5] = "AbsolutePath";
|
|
||||||
UrlType[UrlType["SchemeRelative"] = 6] = "SchemeRelative";
|
|
||||||
UrlType[UrlType["Absolute"] = 7] = "Absolute";
|
|
||||||
})(UrlType || (UrlType = {}));
|
|
||||||
function isAbsoluteUrl(input) {
|
|
||||||
return schemeRegex.test(input);
|
|
||||||
}
|
|
||||||
function isSchemeRelativeUrl(input) {
|
|
||||||
return input.startsWith('//');
|
|
||||||
}
|
|
||||||
function isAbsolutePath(input) {
|
|
||||||
return input.startsWith('/');
|
|
||||||
}
|
|
||||||
function isFileUrl(input) {
|
|
||||||
return input.startsWith('file:');
|
|
||||||
}
|
|
||||||
function isRelative(input) {
|
|
||||||
return /^[.?#]/.test(input);
|
|
||||||
}
|
|
||||||
function parseAbsoluteUrl(input) {
|
|
||||||
const match = urlRegex.exec(input);
|
|
||||||
return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/', match[6] || '', match[7] || '');
|
|
||||||
}
|
|
||||||
function parseFileUrl(input) {
|
|
||||||
const match = fileRegex.exec(input);
|
|
||||||
const path = match[2];
|
|
||||||
return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path, match[3] || '', match[4] || '');
|
|
||||||
}
|
|
||||||
function makeUrl(scheme, user, host, port, path, query, hash) {
|
|
||||||
return {
|
|
||||||
scheme,
|
|
||||||
user,
|
|
||||||
host,
|
|
||||||
port,
|
|
||||||
path,
|
|
||||||
query,
|
|
||||||
hash,
|
|
||||||
type: UrlType.Absolute,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function parseUrl(input) {
|
|
||||||
if (isSchemeRelativeUrl(input)) {
|
|
||||||
const url = parseAbsoluteUrl('http:' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
url.type = UrlType.SchemeRelative;
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
if (isAbsolutePath(input)) {
|
|
||||||
const url = parseAbsoluteUrl('http://foo.com' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
url.host = '';
|
|
||||||
url.type = UrlType.AbsolutePath;
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
if (isFileUrl(input))
|
|
||||||
return parseFileUrl(input);
|
|
||||||
if (isAbsoluteUrl(input))
|
|
||||||
return parseAbsoluteUrl(input);
|
|
||||||
const url = parseAbsoluteUrl('http://foo.com/' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
url.host = '';
|
|
||||||
url.type = input
|
|
||||||
? input.startsWith('?')
|
|
||||||
? UrlType.Query
|
|
||||||
: input.startsWith('#')
|
|
||||||
? UrlType.Hash
|
|
||||||
: UrlType.RelativePath
|
|
||||||
: UrlType.Empty;
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
function stripPathFilename(path) {
|
|
||||||
// If a path ends with a parent directory "..", then it's a relative path with excess parent
|
|
||||||
// paths. It's not a file, so we can't strip it.
|
|
||||||
if (path.endsWith('/..'))
|
|
||||||
return path;
|
|
||||||
const index = path.lastIndexOf('/');
|
|
||||||
return path.slice(0, index + 1);
|
|
||||||
}
|
|
||||||
function mergePaths(url, base) {
|
|
||||||
normalizePath(base, base.type);
|
|
||||||
// If the path is just a "/", then it was an empty path to begin with (remember, we're a relative
|
|
||||||
// path).
|
|
||||||
if (url.path === '/') {
|
|
||||||
url.path = base.path;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Resolution happens relative to the base path's directory, not the file.
|
|
||||||
url.path = stripPathFilename(base.path) + url.path;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* The path can have empty directories "//", unneeded parents "foo/..", or current directory
|
|
||||||
* "foo/.". We need to normalize to a standard representation.
|
|
||||||
*/
|
|
||||||
function normalizePath(url, type) {
|
|
||||||
const rel = type <= UrlType.RelativePath;
|
|
||||||
const pieces = url.path.split('/');
|
|
||||||
// We need to preserve the first piece always, so that we output a leading slash. The item at
|
|
||||||
// pieces[0] is an empty string.
|
|
||||||
let pointer = 1;
|
|
||||||
// Positive is the number of real directories we've output, used for popping a parent directory.
|
|
||||||
// Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo".
|
|
||||||
let positive = 0;
|
|
||||||
// We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will
|
|
||||||
// generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a
|
|
||||||
// real directory, we won't need to append, unless the other conditions happen again.
|
|
||||||
let addTrailingSlash = false;
|
|
||||||
for (let i = 1; i < pieces.length; i++) {
|
|
||||||
const piece = pieces[i];
|
|
||||||
// An empty directory, could be a trailing slash, or just a double "//" in the path.
|
|
||||||
if (!piece) {
|
|
||||||
addTrailingSlash = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// If we encounter a real directory, then we don't need to append anymore.
|
|
||||||
addTrailingSlash = false;
|
|
||||||
// A current directory, which we can always drop.
|
|
||||||
if (piece === '.')
|
|
||||||
continue;
|
|
||||||
// A parent directory, we need to see if there are any real directories we can pop. Else, we
|
|
||||||
// have an excess of parents, and we'll need to keep the "..".
|
|
||||||
if (piece === '..') {
|
|
||||||
if (positive) {
|
|
||||||
addTrailingSlash = true;
|
|
||||||
positive--;
|
|
||||||
pointer--;
|
|
||||||
}
|
|
||||||
else if (rel) {
|
|
||||||
// If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute
|
|
||||||
// URL, protocol relative URL, or an absolute path, we don't need to keep excess.
|
|
||||||
pieces[pointer++] = piece;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// We've encountered a real directory. Move it to the next insertion pointer, which accounts for
|
|
||||||
// any popped or dropped directories.
|
|
||||||
pieces[pointer++] = piece;
|
|
||||||
positive++;
|
|
||||||
}
|
|
||||||
let path = '';
|
|
||||||
for (let i = 1; i < pointer; i++) {
|
|
||||||
path += '/' + pieces[i];
|
|
||||||
}
|
|
||||||
if (!path || (addTrailingSlash && !path.endsWith('/..'))) {
|
|
||||||
path += '/';
|
|
||||||
}
|
|
||||||
url.path = path;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Attempts to resolve `input` URL/path relative to `base`.
|
|
||||||
*/
|
|
||||||
function resolve(input, base) {
|
|
||||||
if (!input && !base)
|
|
||||||
return '';
|
|
||||||
const url = parseUrl(input);
|
|
||||||
let inputType = url.type;
|
|
||||||
if (base && inputType !== UrlType.Absolute) {
|
|
||||||
const baseUrl = parseUrl(base);
|
|
||||||
const baseType = baseUrl.type;
|
|
||||||
switch (inputType) {
|
|
||||||
case UrlType.Empty:
|
|
||||||
url.hash = baseUrl.hash;
|
|
||||||
// fall through
|
|
||||||
case UrlType.Hash:
|
|
||||||
url.query = baseUrl.query;
|
|
||||||
// fall through
|
|
||||||
case UrlType.Query:
|
|
||||||
case UrlType.RelativePath:
|
|
||||||
mergePaths(url, baseUrl);
|
|
||||||
// fall through
|
|
||||||
case UrlType.AbsolutePath:
|
|
||||||
// The host, user, and port are joined, you can't copy one without the others.
|
|
||||||
url.user = baseUrl.user;
|
|
||||||
url.host = baseUrl.host;
|
|
||||||
url.port = baseUrl.port;
|
|
||||||
// fall through
|
|
||||||
case UrlType.SchemeRelative:
|
|
||||||
// The input doesn't have a schema at least, so we need to copy at least that over.
|
|
||||||
url.scheme = baseUrl.scheme;
|
|
||||||
}
|
|
||||||
if (baseType > inputType)
|
|
||||||
inputType = baseType;
|
|
||||||
}
|
|
||||||
normalizePath(url, inputType);
|
|
||||||
const queryHash = url.query + url.hash;
|
|
||||||
switch (inputType) {
|
|
||||||
// This is impossible, because of the empty checks at the start of the function.
|
|
||||||
// case UrlType.Empty:
|
|
||||||
case UrlType.Hash:
|
|
||||||
case UrlType.Query:
|
|
||||||
return queryHash;
|
|
||||||
case UrlType.RelativePath: {
|
|
||||||
// The first char is always a "/", and we need it to be relative.
|
|
||||||
const path = url.path.slice(1);
|
|
||||||
if (!path)
|
|
||||||
return queryHash || '.';
|
|
||||||
if (isRelative(base || input) && !isRelative(path)) {
|
|
||||||
// If base started with a leading ".", or there is no base and input started with a ".",
|
|
||||||
// then we need to ensure that the relative path starts with a ".". We don't know if
|
|
||||||
// relative starts with a "..", though, so check before prepending.
|
|
||||||
return './' + path + queryHash;
|
|
||||||
}
|
|
||||||
return path + queryHash;
|
|
||||||
}
|
|
||||||
case UrlType.AbsolutePath:
|
|
||||||
return url.path + queryHash;
|
|
||||||
default:
|
|
||||||
return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export { resolve as default };
|
|
||||||
//# sourceMappingURL=resolve-uri.mjs.map
|
|
1
node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map
generated
vendored
1
node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map
generated
vendored
File diff suppressed because one or more lines are too long
250
node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js
generated
vendored
250
node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js
generated
vendored
@ -1,250 +0,0 @@
|
|||||||
(function (global, factory) {
|
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
||||||
typeof define === 'function' && define.amd ? define(factory) :
|
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.resolveURI = factory());
|
|
||||||
})(this, (function () { 'use strict';
|
|
||||||
|
|
||||||
// Matches the scheme of a URL, eg "http://"
|
|
||||||
const schemeRegex = /^[\w+.-]+:\/\//;
|
|
||||||
/**
|
|
||||||
* Matches the parts of a URL:
|
|
||||||
* 1. Scheme, including ":", guaranteed.
|
|
||||||
* 2. User/password, including "@", optional.
|
|
||||||
* 3. Host, guaranteed.
|
|
||||||
* 4. Port, including ":", optional.
|
|
||||||
* 5. Path, including "/", optional.
|
|
||||||
* 6. Query, including "?", optional.
|
|
||||||
* 7. Hash, including "#", optional.
|
|
||||||
*/
|
|
||||||
const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/;
|
|
||||||
/**
|
|
||||||
* File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start
|
|
||||||
* with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).
|
|
||||||
*
|
|
||||||
* 1. Host, optional.
|
|
||||||
* 2. Path, which may include "/", guaranteed.
|
|
||||||
* 3. Query, including "?", optional.
|
|
||||||
* 4. Hash, including "#", optional.
|
|
||||||
*/
|
|
||||||
const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;
|
|
||||||
var UrlType;
|
|
||||||
(function (UrlType) {
|
|
||||||
UrlType[UrlType["Empty"] = 1] = "Empty";
|
|
||||||
UrlType[UrlType["Hash"] = 2] = "Hash";
|
|
||||||
UrlType[UrlType["Query"] = 3] = "Query";
|
|
||||||
UrlType[UrlType["RelativePath"] = 4] = "RelativePath";
|
|
||||||
UrlType[UrlType["AbsolutePath"] = 5] = "AbsolutePath";
|
|
||||||
UrlType[UrlType["SchemeRelative"] = 6] = "SchemeRelative";
|
|
||||||
UrlType[UrlType["Absolute"] = 7] = "Absolute";
|
|
||||||
})(UrlType || (UrlType = {}));
|
|
||||||
function isAbsoluteUrl(input) {
|
|
||||||
return schemeRegex.test(input);
|
|
||||||
}
|
|
||||||
function isSchemeRelativeUrl(input) {
|
|
||||||
return input.startsWith('//');
|
|
||||||
}
|
|
||||||
function isAbsolutePath(input) {
|
|
||||||
return input.startsWith('/');
|
|
||||||
}
|
|
||||||
function isFileUrl(input) {
|
|
||||||
return input.startsWith('file:');
|
|
||||||
}
|
|
||||||
function isRelative(input) {
|
|
||||||
return /^[.?#]/.test(input);
|
|
||||||
}
|
|
||||||
function parseAbsoluteUrl(input) {
|
|
||||||
const match = urlRegex.exec(input);
|
|
||||||
return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/', match[6] || '', match[7] || '');
|
|
||||||
}
|
|
||||||
function parseFileUrl(input) {
|
|
||||||
const match = fileRegex.exec(input);
|
|
||||||
const path = match[2];
|
|
||||||
return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path, match[3] || '', match[4] || '');
|
|
||||||
}
|
|
||||||
function makeUrl(scheme, user, host, port, path, query, hash) {
|
|
||||||
return {
|
|
||||||
scheme,
|
|
||||||
user,
|
|
||||||
host,
|
|
||||||
port,
|
|
||||||
path,
|
|
||||||
query,
|
|
||||||
hash,
|
|
||||||
type: UrlType.Absolute,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function parseUrl(input) {
|
|
||||||
if (isSchemeRelativeUrl(input)) {
|
|
||||||
const url = parseAbsoluteUrl('http:' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
url.type = UrlType.SchemeRelative;
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
if (isAbsolutePath(input)) {
|
|
||||||
const url = parseAbsoluteUrl('http://foo.com' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
url.host = '';
|
|
||||||
url.type = UrlType.AbsolutePath;
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
if (isFileUrl(input))
|
|
||||||
return parseFileUrl(input);
|
|
||||||
if (isAbsoluteUrl(input))
|
|
||||||
return parseAbsoluteUrl(input);
|
|
||||||
const url = parseAbsoluteUrl('http://foo.com/' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
url.host = '';
|
|
||||||
url.type = input
|
|
||||||
? input.startsWith('?')
|
|
||||||
? UrlType.Query
|
|
||||||
: input.startsWith('#')
|
|
||||||
? UrlType.Hash
|
|
||||||
: UrlType.RelativePath
|
|
||||||
: UrlType.Empty;
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
function stripPathFilename(path) {
|
|
||||||
// If a path ends with a parent directory "..", then it's a relative path with excess parent
|
|
||||||
// paths. It's not a file, so we can't strip it.
|
|
||||||
if (path.endsWith('/..'))
|
|
||||||
return path;
|
|
||||||
const index = path.lastIndexOf('/');
|
|
||||||
return path.slice(0, index + 1);
|
|
||||||
}
|
|
||||||
function mergePaths(url, base) {
|
|
||||||
normalizePath(base, base.type);
|
|
||||||
// If the path is just a "/", then it was an empty path to begin with (remember, we're a relative
|
|
||||||
// path).
|
|
||||||
if (url.path === '/') {
|
|
||||||
url.path = base.path;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Resolution happens relative to the base path's directory, not the file.
|
|
||||||
url.path = stripPathFilename(base.path) + url.path;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* The path can have empty directories "//", unneeded parents "foo/..", or current directory
|
|
||||||
* "foo/.". We need to normalize to a standard representation.
|
|
||||||
*/
|
|
||||||
function normalizePath(url, type) {
|
|
||||||
const rel = type <= UrlType.RelativePath;
|
|
||||||
const pieces = url.path.split('/');
|
|
||||||
// We need to preserve the first piece always, so that we output a leading slash. The item at
|
|
||||||
// pieces[0] is an empty string.
|
|
||||||
let pointer = 1;
|
|
||||||
// Positive is the number of real directories we've output, used for popping a parent directory.
|
|
||||||
// Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo".
|
|
||||||
let positive = 0;
|
|
||||||
// We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will
|
|
||||||
// generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a
|
|
||||||
// real directory, we won't need to append, unless the other conditions happen again.
|
|
||||||
let addTrailingSlash = false;
|
|
||||||
for (let i = 1; i < pieces.length; i++) {
|
|
||||||
const piece = pieces[i];
|
|
||||||
// An empty directory, could be a trailing slash, or just a double "//" in the path.
|
|
||||||
if (!piece) {
|
|
||||||
addTrailingSlash = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// If we encounter a real directory, then we don't need to append anymore.
|
|
||||||
addTrailingSlash = false;
|
|
||||||
// A current directory, which we can always drop.
|
|
||||||
if (piece === '.')
|
|
||||||
continue;
|
|
||||||
// A parent directory, we need to see if there are any real directories we can pop. Else, we
|
|
||||||
// have an excess of parents, and we'll need to keep the "..".
|
|
||||||
if (piece === '..') {
|
|
||||||
if (positive) {
|
|
||||||
addTrailingSlash = true;
|
|
||||||
positive--;
|
|
||||||
pointer--;
|
|
||||||
}
|
|
||||||
else if (rel) {
|
|
||||||
// If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute
|
|
||||||
// URL, protocol relative URL, or an absolute path, we don't need to keep excess.
|
|
||||||
pieces[pointer++] = piece;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// We've encountered a real directory. Move it to the next insertion pointer, which accounts for
|
|
||||||
// any popped or dropped directories.
|
|
||||||
pieces[pointer++] = piece;
|
|
||||||
positive++;
|
|
||||||
}
|
|
||||||
let path = '';
|
|
||||||
for (let i = 1; i < pointer; i++) {
|
|
||||||
path += '/' + pieces[i];
|
|
||||||
}
|
|
||||||
if (!path || (addTrailingSlash && !path.endsWith('/..'))) {
|
|
||||||
path += '/';
|
|
||||||
}
|
|
||||||
url.path = path;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Attempts to resolve `input` URL/path relative to `base`.
|
|
||||||
*/
|
|
||||||
function resolve(input, base) {
|
|
||||||
if (!input && !base)
|
|
||||||
return '';
|
|
||||||
const url = parseUrl(input);
|
|
||||||
let inputType = url.type;
|
|
||||||
if (base && inputType !== UrlType.Absolute) {
|
|
||||||
const baseUrl = parseUrl(base);
|
|
||||||
const baseType = baseUrl.type;
|
|
||||||
switch (inputType) {
|
|
||||||
case UrlType.Empty:
|
|
||||||
url.hash = baseUrl.hash;
|
|
||||||
// fall through
|
|
||||||
case UrlType.Hash:
|
|
||||||
url.query = baseUrl.query;
|
|
||||||
// fall through
|
|
||||||
case UrlType.Query:
|
|
||||||
case UrlType.RelativePath:
|
|
||||||
mergePaths(url, baseUrl);
|
|
||||||
// fall through
|
|
||||||
case UrlType.AbsolutePath:
|
|
||||||
// The host, user, and port are joined, you can't copy one without the others.
|
|
||||||
url.user = baseUrl.user;
|
|
||||||
url.host = baseUrl.host;
|
|
||||||
url.port = baseUrl.port;
|
|
||||||
// fall through
|
|
||||||
case UrlType.SchemeRelative:
|
|
||||||
// The input doesn't have a schema at least, so we need to copy at least that over.
|
|
||||||
url.scheme = baseUrl.scheme;
|
|
||||||
}
|
|
||||||
if (baseType > inputType)
|
|
||||||
inputType = baseType;
|
|
||||||
}
|
|
||||||
normalizePath(url, inputType);
|
|
||||||
const queryHash = url.query + url.hash;
|
|
||||||
switch (inputType) {
|
|
||||||
// This is impossible, because of the empty checks at the start of the function.
|
|
||||||
// case UrlType.Empty:
|
|
||||||
case UrlType.Hash:
|
|
||||||
case UrlType.Query:
|
|
||||||
return queryHash;
|
|
||||||
case UrlType.RelativePath: {
|
|
||||||
// The first char is always a "/", and we need it to be relative.
|
|
||||||
const path = url.path.slice(1);
|
|
||||||
if (!path)
|
|
||||||
return queryHash || '.';
|
|
||||||
if (isRelative(base || input) && !isRelative(path)) {
|
|
||||||
// If base started with a leading ".", or there is no base and input started with a ".",
|
|
||||||
// then we need to ensure that the relative path starts with a ".". We don't know if
|
|
||||||
// relative starts with a "..", though, so check before prepending.
|
|
||||||
return './' + path + queryHash;
|
|
||||||
}
|
|
||||||
return path + queryHash;
|
|
||||||
}
|
|
||||||
case UrlType.AbsolutePath:
|
|
||||||
return url.path + queryHash;
|
|
||||||
default:
|
|
||||||
return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return resolve;
|
|
||||||
|
|
||||||
}));
|
|
||||||
//# sourceMappingURL=resolve-uri.umd.js.map
|
|
1
node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map
generated
vendored
1
node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map
generated
vendored
File diff suppressed because one or more lines are too long
4
node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts
generated
vendored
4
node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts
generated
vendored
@ -1,4 +0,0 @@
|
|||||||
/**
|
|
||||||
* Attempts to resolve `input` URL/path relative to `base`.
|
|
||||||
*/
|
|
||||||
export default function resolve(input: string, base: string | undefined): string;
|
|
69
node_modules/@jridgewell/resolve-uri/package.json
generated
vendored
69
node_modules/@jridgewell/resolve-uri/package.json
generated
vendored
@ -1,69 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@jridgewell/resolve-uri",
|
|
||||||
"version": "3.1.1",
|
|
||||||
"description": "Resolve a URI relative to an optional base URI",
|
|
||||||
"keywords": [
|
|
||||||
"resolve",
|
|
||||||
"uri",
|
|
||||||
"url",
|
|
||||||
"path"
|
|
||||||
],
|
|
||||||
"author": "Justin Ridgewell <justin@ridgewell.name>",
|
|
||||||
"license": "MIT",
|
|
||||||
"repository": "https://github.com/jridgewell/resolve-uri",
|
|
||||||
"main": "dist/resolve-uri.umd.js",
|
|
||||||
"module": "dist/resolve-uri.mjs",
|
|
||||||
"types": "dist/types/resolve-uri.d.ts",
|
|
||||||
"exports": {
|
|
||||||
".": [
|
|
||||||
{
|
|
||||||
"types": "./dist/types/resolve-uri.d.ts",
|
|
||||||
"browser": "./dist/resolve-uri.umd.js",
|
|
||||||
"require": "./dist/resolve-uri.umd.js",
|
|
||||||
"import": "./dist/resolve-uri.mjs"
|
|
||||||
},
|
|
||||||
"./dist/resolve-uri.umd.js"
|
|
||||||
],
|
|
||||||
"./package.json": "./package.json"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"dist"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6.0.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"prebuild": "rm -rf dist",
|
|
||||||
"build": "run-s -n build:*",
|
|
||||||
"build:rollup": "rollup -c rollup.config.js",
|
|
||||||
"build:ts": "tsc --project tsconfig.build.json",
|
|
||||||
"lint": "run-s -n lint:*",
|
|
||||||
"lint:prettier": "npm run test:lint:prettier -- --write",
|
|
||||||
"lint:ts": "npm run test:lint:ts -- --fix",
|
|
||||||
"pretest": "run-s build:rollup",
|
|
||||||
"test": "run-s -n test:lint test:only",
|
|
||||||
"test:debug": "mocha --inspect-brk",
|
|
||||||
"test:lint": "run-s -n test:lint:*",
|
|
||||||
"test:lint:prettier": "prettier --check '{src,test}/**/*.ts'",
|
|
||||||
"test:lint:ts": "eslint '{src,test}/**/*.ts'",
|
|
||||||
"test:only": "mocha",
|
|
||||||
"test:coverage": "c8 mocha",
|
|
||||||
"test:watch": "mocha --watch",
|
|
||||||
"prepublishOnly": "npm run preversion",
|
|
||||||
"preversion": "run-s test build"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@jridgewell/resolve-uri-latest": "npm:@jridgewell/resolve-uri@*",
|
|
||||||
"@rollup/plugin-typescript": "8.3.0",
|
|
||||||
"@typescript-eslint/eslint-plugin": "5.10.0",
|
|
||||||
"@typescript-eslint/parser": "5.10.0",
|
|
||||||
"c8": "7.11.0",
|
|
||||||
"eslint": "8.7.0",
|
|
||||||
"eslint-config-prettier": "8.3.0",
|
|
||||||
"mocha": "9.2.0",
|
|
||||||
"npm-run-all": "4.1.5",
|
|
||||||
"prettier": "2.5.1",
|
|
||||||
"rollup": "2.66.0",
|
|
||||||
"typescript": "4.5.5"
|
|
||||||
}
|
|
||||||
}
|
|
19
node_modules/@jridgewell/set-array/LICENSE
generated
vendored
19
node_modules/@jridgewell/set-array/LICENSE
generated
vendored
@ -1,19 +0,0 @@
|
|||||||
Copyright 2022 Justin Ridgewell <jridgewell@google.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
37
node_modules/@jridgewell/set-array/README.md
generated
vendored
37
node_modules/@jridgewell/set-array/README.md
generated
vendored
@ -1,37 +0,0 @@
|
|||||||
# @jridgewell/set-array
|
|
||||||
|
|
||||||
> Like a Set, but provides the index of the `key` in the backing array
|
|
||||||
|
|
||||||
This is designed to allow synchronizing a second array with the contents of the backing array, like
|
|
||||||
how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`, and there
|
|
||||||
are never duplicates.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install @jridgewell/set-array
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```js
|
|
||||||
import { SetArray, get, put, pop } from '@jridgewell/set-array';
|
|
||||||
|
|
||||||
const sa = new SetArray();
|
|
||||||
|
|
||||||
let index = put(sa, 'first');
|
|
||||||
assert.strictEqual(index, 0);
|
|
||||||
|
|
||||||
index = put(sa, 'second');
|
|
||||||
assert.strictEqual(index, 1);
|
|
||||||
|
|
||||||
assert.deepEqual(sa.array, [ 'first', 'second' ]);
|
|
||||||
|
|
||||||
index = get(sa, 'first');
|
|
||||||
assert.strictEqual(index, 0);
|
|
||||||
|
|
||||||
pop(sa);
|
|
||||||
index = get(sa, 'second');
|
|
||||||
assert.strictEqual(index, undefined);
|
|
||||||
assert.deepEqual(sa.array, [ 'first' ]);
|
|
||||||
```
|
|
48
node_modules/@jridgewell/set-array/dist/set-array.mjs
generated
vendored
48
node_modules/@jridgewell/set-array/dist/set-array.mjs
generated
vendored
@ -1,48 +0,0 @@
|
|||||||
/**
|
|
||||||
* Gets the index associated with `key` in the backing array, if it is already present.
|
|
||||||
*/
|
|
||||||
let get;
|
|
||||||
/**
|
|
||||||
* Puts `key` into the backing array, if it is not already present. Returns
|
|
||||||
* the index of the `key` in the backing array.
|
|
||||||
*/
|
|
||||||
let put;
|
|
||||||
/**
|
|
||||||
* Pops the last added item out of the SetArray.
|
|
||||||
*/
|
|
||||||
let pop;
|
|
||||||
/**
|
|
||||||
* SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
|
|
||||||
* index of the `key` in the backing array.
|
|
||||||
*
|
|
||||||
* This is designed to allow synchronizing a second array with the contents of the backing array,
|
|
||||||
* like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
|
|
||||||
* and there are never duplicates.
|
|
||||||
*/
|
|
||||||
class SetArray {
|
|
||||||
constructor() {
|
|
||||||
this._indexes = { __proto__: null };
|
|
||||||
this.array = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
get = (strarr, key) => strarr._indexes[key];
|
|
||||||
put = (strarr, key) => {
|
|
||||||
// The key may or may not be present. If it is present, it's a number.
|
|
||||||
const index = get(strarr, key);
|
|
||||||
if (index !== undefined)
|
|
||||||
return index;
|
|
||||||
const { array, _indexes: indexes } = strarr;
|
|
||||||
return (indexes[key] = array.push(key) - 1);
|
|
||||||
};
|
|
||||||
pop = (strarr) => {
|
|
||||||
const { array, _indexes: indexes } = strarr;
|
|
||||||
if (array.length === 0)
|
|
||||||
return;
|
|
||||||
const last = array.pop();
|
|
||||||
indexes[last] = undefined;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
export { SetArray, get, pop, put };
|
|
||||||
//# sourceMappingURL=set-array.mjs.map
|
|
1
node_modules/@jridgewell/set-array/dist/set-array.mjs.map
generated
vendored
1
node_modules/@jridgewell/set-array/dist/set-array.mjs.map
generated
vendored
@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"set-array.mjs","sources":["../src/set-array.ts"],"sourcesContent":["/**\n * Gets the index associated with `key` in the backing array, if it is already present.\n */\nexport let get: (strarr: SetArray, key: string) => number | undefined;\n\n/**\n * Puts `key` into the backing array, if it is not already present. Returns\n * the index of the `key` in the backing array.\n */\nexport let put: (strarr: SetArray, key: string) => number;\n\n/**\n * Pops the last added item out of the SetArray.\n */\nexport let pop: (strarr: SetArray) => void;\n\n/**\n * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\n * index of the `key` in the backing array.\n *\n * This is designed to allow synchronizing a second array with the contents of the backing array,\n * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\n * and there are never duplicates.\n */\nexport class SetArray {\n private declare _indexes: { [key: string]: number | undefined };\n declare array: readonly string[];\n\n constructor() {\n this._indexes = { __proto__: null } as any;\n this.array = [];\n }\n\n static {\n get = (strarr, key) => strarr._indexes[key];\n\n put = (strarr, key) => {\n // The key may or may not be present. If it is present, it's a number.\n const index = get(strarr, key);\n if (index !== undefined) return index;\n\n const { array, _indexes: indexes } = strarr;\n\n return (indexes[key] = (array as string[]).push(key) - 1);\n };\n\n pop = (strarr) => {\n const { array, _indexes: indexes } = strarr;\n if (array.length === 0) return;\n\n const last = (array as string[]).pop()!;\n indexes[last] = undefined;\n };\n }\n}\n"],"names":[],"mappings":"AAAA;;;IAGW,IAA2D;AAEtE;;;;IAIW,IAA+C;AAE1D;;;IAGW,IAAgC;AAE3C;;;;;;;;MAQa,QAAQ;IAInB;QACE,IAAI,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,IAAI,EAAS,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;KACjB;CAuBF;AArBC;IACE,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE5C,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG;;QAEhB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAEtC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAE5C,QAAQ,OAAO,CAAC,GAAG,CAAC,GAAI,KAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;KAC3D,CAAC;IAEF,GAAG,GAAG,CAAC,MAAM;QACX,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE/B,MAAM,IAAI,GAAI,KAAkB,CAAC,GAAG,EAAG,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;KAC3B,CAAC;AACJ,CAAC,GAAA;;;;"}
|
|
58
node_modules/@jridgewell/set-array/dist/set-array.umd.js
generated
vendored
58
node_modules/@jridgewell/set-array/dist/set-array.umd.js
generated
vendored
@ -1,58 +0,0 @@
|
|||||||
(function (global, factory) {
|
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
||||||
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.setArray = {}));
|
|
||||||
})(this, (function (exports) { 'use strict';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the index associated with `key` in the backing array, if it is already present.
|
|
||||||
*/
|
|
||||||
exports.get = void 0;
|
|
||||||
/**
|
|
||||||
* Puts `key` into the backing array, if it is not already present. Returns
|
|
||||||
* the index of the `key` in the backing array.
|
|
||||||
*/
|
|
||||||
exports.put = void 0;
|
|
||||||
/**
|
|
||||||
* Pops the last added item out of the SetArray.
|
|
||||||
*/
|
|
||||||
exports.pop = void 0;
|
|
||||||
/**
|
|
||||||
* SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
|
|
||||||
* index of the `key` in the backing array.
|
|
||||||
*
|
|
||||||
* This is designed to allow synchronizing a second array with the contents of the backing array,
|
|
||||||
* like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
|
|
||||||
* and there are never duplicates.
|
|
||||||
*/
|
|
||||||
class SetArray {
|
|
||||||
constructor() {
|
|
||||||
this._indexes = { __proto__: null };
|
|
||||||
this.array = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
exports.get = (strarr, key) => strarr._indexes[key];
|
|
||||||
exports.put = (strarr, key) => {
|
|
||||||
// The key may or may not be present. If it is present, it's a number.
|
|
||||||
const index = exports.get(strarr, key);
|
|
||||||
if (index !== undefined)
|
|
||||||
return index;
|
|
||||||
const { array, _indexes: indexes } = strarr;
|
|
||||||
return (indexes[key] = array.push(key) - 1);
|
|
||||||
};
|
|
||||||
exports.pop = (strarr) => {
|
|
||||||
const { array, _indexes: indexes } = strarr;
|
|
||||||
if (array.length === 0)
|
|
||||||
return;
|
|
||||||
const last = array.pop();
|
|
||||||
indexes[last] = undefined;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
exports.SetArray = SetArray;
|
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
|
||||||
|
|
||||||
}));
|
|
||||||
//# sourceMappingURL=set-array.umd.js.map
|
|
1
node_modules/@jridgewell/set-array/dist/set-array.umd.js.map
generated
vendored
1
node_modules/@jridgewell/set-array/dist/set-array.umd.js.map
generated
vendored
@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"set-array.umd.js","sources":["../src/set-array.ts"],"sourcesContent":["/**\n * Gets the index associated with `key` in the backing array, if it is already present.\n */\nexport let get: (strarr: SetArray, key: string) => number | undefined;\n\n/**\n * Puts `key` into the backing array, if it is not already present. Returns\n * the index of the `key` in the backing array.\n */\nexport let put: (strarr: SetArray, key: string) => number;\n\n/**\n * Pops the last added item out of the SetArray.\n */\nexport let pop: (strarr: SetArray) => void;\n\n/**\n * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\n * index of the `key` in the backing array.\n *\n * This is designed to allow synchronizing a second array with the contents of the backing array,\n * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\n * and there are never duplicates.\n */\nexport class SetArray {\n private declare _indexes: { [key: string]: number | undefined };\n declare array: readonly string[];\n\n constructor() {\n this._indexes = { __proto__: null } as any;\n this.array = [];\n }\n\n static {\n get = (strarr, key) => strarr._indexes[key];\n\n put = (strarr, key) => {\n // The key may or may not be present. If it is present, it's a number.\n const index = get(strarr, key);\n if (index !== undefined) return index;\n\n const { array, _indexes: indexes } = strarr;\n\n return (indexes[key] = (array as string[]).push(key) - 1);\n };\n\n pop = (strarr) => {\n const { array, _indexes: indexes } = strarr;\n if (array.length === 0) return;\n\n const last = (array as string[]).pop()!;\n indexes[last] = undefined;\n };\n }\n}\n"],"names":["get","put","pop"],"mappings":";;;;;;IAAA;;;AAGWA,yBAA2D;IAEtE;;;;AAIWC,yBAA+C;IAE1D;;;AAGWC,yBAAgC;IAE3C;;;;;;;;UAQa,QAAQ;QAInB;YACE,IAAI,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,IAAI,EAAS,CAAC;YAC3C,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;SACjB;KAuBF;IArBC;QACEF,WAAG,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE5CC,WAAG,GAAG,CAAC,MAAM,EAAE,GAAG;;YAEhB,MAAM,KAAK,GAAGD,WAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAEtC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAE5C,QAAQ,OAAO,CAAC,GAAG,CAAC,GAAI,KAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;SAC3D,CAAC;QAEFE,WAAG,GAAG,CAAC,MAAM;YACX,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAE/B,MAAM,IAAI,GAAI,KAAkB,CAAC,GAAG,EAAG,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;SAC3B,CAAC;IACJ,CAAC,GAAA;;;;;;;;;;"}
|
|
26
node_modules/@jridgewell/set-array/dist/types/set-array.d.ts
generated
vendored
26
node_modules/@jridgewell/set-array/dist/types/set-array.d.ts
generated
vendored
@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* Gets the index associated with `key` in the backing array, if it is already present.
|
|
||||||
*/
|
|
||||||
export declare let get: (strarr: SetArray, key: string) => number | undefined;
|
|
||||||
/**
|
|
||||||
* Puts `key` into the backing array, if it is not already present. Returns
|
|
||||||
* the index of the `key` in the backing array.
|
|
||||||
*/
|
|
||||||
export declare let put: (strarr: SetArray, key: string) => number;
|
|
||||||
/**
|
|
||||||
* Pops the last added item out of the SetArray.
|
|
||||||
*/
|
|
||||||
export declare let pop: (strarr: SetArray) => void;
|
|
||||||
/**
|
|
||||||
* SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
|
|
||||||
* index of the `key` in the backing array.
|
|
||||||
*
|
|
||||||
* This is designed to allow synchronizing a second array with the contents of the backing array,
|
|
||||||
* like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
|
|
||||||
* and there are never duplicates.
|
|
||||||
*/
|
|
||||||
export declare class SetArray {
|
|
||||||
private _indexes;
|
|
||||||
array: readonly string[];
|
|
||||||
constructor();
|
|
||||||
}
|
|
66
node_modules/@jridgewell/set-array/package.json
generated
vendored
66
node_modules/@jridgewell/set-array/package.json
generated
vendored
@ -1,66 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@jridgewell/set-array",
|
|
||||||
"version": "1.1.2",
|
|
||||||
"description": "Like a Set, but provides the index of the `key` in the backing array",
|
|
||||||
"keywords": [],
|
|
||||||
"author": "Justin Ridgewell <justin@ridgewell.name>",
|
|
||||||
"license": "MIT",
|
|
||||||
"repository": "https://github.com/jridgewell/set-array",
|
|
||||||
"main": "dist/set-array.umd.js",
|
|
||||||
"module": "dist/set-array.mjs",
|
|
||||||
"typings": "dist/types/set-array.d.ts",
|
|
||||||
"exports": {
|
|
||||||
".": [
|
|
||||||
{
|
|
||||||
"types": "./dist/types/set-array.d.ts",
|
|
||||||
"browser": "./dist/set-array.umd.js",
|
|
||||||
"require": "./dist/set-array.umd.js",
|
|
||||||
"import": "./dist/set-array.mjs"
|
|
||||||
},
|
|
||||||
"./dist/set-array.umd.js"
|
|
||||||
],
|
|
||||||
"./package.json": "./package.json"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"dist",
|
|
||||||
"src"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6.0.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"prebuild": "rm -rf dist",
|
|
||||||
"build": "run-s -n build:*",
|
|
||||||
"build:rollup": "rollup -c rollup.config.js",
|
|
||||||
"build:ts": "tsc --project tsconfig.build.json",
|
|
||||||
"lint": "run-s -n lint:*",
|
|
||||||
"lint:prettier": "npm run test:lint:prettier -- --write",
|
|
||||||
"lint:ts": "npm run test:lint:ts -- --fix",
|
|
||||||
"pretest": "run-s build:rollup",
|
|
||||||
"test": "run-s -n test:lint test:only",
|
|
||||||
"test:debug": "mocha --inspect-brk",
|
|
||||||
"test:lint": "run-s -n test:lint:*",
|
|
||||||
"test:lint:prettier": "prettier --check '{src,test}/**/*.ts'",
|
|
||||||
"test:lint:ts": "eslint '{src,test}/**/*.ts'",
|
|
||||||
"test:only": "mocha",
|
|
||||||
"test:coverage": "c8 mocha",
|
|
||||||
"test:watch": "mocha --watch",
|
|
||||||
"prepublishOnly": "npm run preversion",
|
|
||||||
"preversion": "run-s test build"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@rollup/plugin-typescript": "8.3.0",
|
|
||||||
"@types/mocha": "9.1.1",
|
|
||||||
"@types/node": "17.0.29",
|
|
||||||
"@typescript-eslint/eslint-plugin": "5.10.0",
|
|
||||||
"@typescript-eslint/parser": "5.10.0",
|
|
||||||
"c8": "7.11.0",
|
|
||||||
"eslint": "8.7.0",
|
|
||||||
"eslint-config-prettier": "8.3.0",
|
|
||||||
"mocha": "9.2.0",
|
|
||||||
"npm-run-all": "4.1.5",
|
|
||||||
"prettier": "2.5.1",
|
|
||||||
"rollup": "2.66.0",
|
|
||||||
"typescript": "4.5.5"
|
|
||||||
}
|
|
||||||
}
|
|
55
node_modules/@jridgewell/set-array/src/set-array.ts
generated
vendored
55
node_modules/@jridgewell/set-array/src/set-array.ts
generated
vendored
@ -1,55 +0,0 @@
|
|||||||
/**
|
|
||||||
* Gets the index associated with `key` in the backing array, if it is already present.
|
|
||||||
*/
|
|
||||||
export let get: (strarr: SetArray, key: string) => number | undefined;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Puts `key` into the backing array, if it is not already present. Returns
|
|
||||||
* the index of the `key` in the backing array.
|
|
||||||
*/
|
|
||||||
export let put: (strarr: SetArray, key: string) => number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pops the last added item out of the SetArray.
|
|
||||||
*/
|
|
||||||
export let pop: (strarr: SetArray) => void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
|
|
||||||
* index of the `key` in the backing array.
|
|
||||||
*
|
|
||||||
* This is designed to allow synchronizing a second array with the contents of the backing array,
|
|
||||||
* like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
|
|
||||||
* and there are never duplicates.
|
|
||||||
*/
|
|
||||||
export class SetArray {
|
|
||||||
private declare _indexes: { [key: string]: number | undefined };
|
|
||||||
declare array: readonly string[];
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
this._indexes = { __proto__: null } as any;
|
|
||||||
this.array = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
static {
|
|
||||||
get = (strarr, key) => strarr._indexes[key];
|
|
||||||
|
|
||||||
put = (strarr, key) => {
|
|
||||||
// The key may or may not be present. If it is present, it's a number.
|
|
||||||
const index = get(strarr, key);
|
|
||||||
if (index !== undefined) return index;
|
|
||||||
|
|
||||||
const { array, _indexes: indexes } = strarr;
|
|
||||||
|
|
||||||
return (indexes[key] = (array as string[]).push(key) - 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
pop = (strarr) => {
|
|
||||||
const { array, _indexes: indexes } = strarr;
|
|
||||||
if (array.length === 0) return;
|
|
||||||
|
|
||||||
const last = (array as string[]).pop()!;
|
|
||||||
indexes[last] = undefined;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
19
node_modules/@jridgewell/source-map/LICENSE
generated
vendored
19
node_modules/@jridgewell/source-map/LICENSE
generated
vendored
@ -1,19 +0,0 @@
|
|||||||
Copyright 2019 Justin Ridgewell <jridgewell@google.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
82
node_modules/@jridgewell/source-map/README.md
generated
vendored
82
node_modules/@jridgewell/source-map/README.md
generated
vendored
@ -1,82 +0,0 @@
|
|||||||
# @jridgewell/source-map
|
|
||||||
|
|
||||||
> Packages `@jridgewell/trace-mapping` and `@jridgewell/gen-mapping` into the familiar source-map API
|
|
||||||
|
|
||||||
This isn't the full API, but it's the core functionality. This wraps
|
|
||||||
[@jridgewell/trace-mapping][trace-mapping] and [@jridgewell/gen-mapping][gen-mapping]
|
|
||||||
implementations.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install @jridgewell/source-map
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
TODO
|
|
||||||
|
|
||||||
### SourceMapConsumer
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { SourceMapConsumer } from '@jridgewell/source-map';
|
|
||||||
const smc = new SourceMapConsumer({
|
|
||||||
version: 3,
|
|
||||||
names: ['foo'],
|
|
||||||
sources: ['input.js'],
|
|
||||||
mappings: 'AAAAA',
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const smc = new SourceMapConsumer(map);
|
|
||||||
smc.originalPositionFor({ line: 1, column: 0 });
|
|
||||||
```
|
|
||||||
|
|
||||||
### SourceMapGenerator
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { SourceMapGenerator } from '@jridgewell/source-map';
|
|
||||||
const smg = new SourceMapGenerator({
|
|
||||||
file: 'output.js',
|
|
||||||
sourceRoot: 'https://example.com/',
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapGenerator.prototype.addMapping(mapping)
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const smg = new SourceMapGenerator();
|
|
||||||
smg.addMapping({
|
|
||||||
generated: { line: 1, column: 0 },
|
|
||||||
source: 'input.js',
|
|
||||||
original: { line: 1, column: 0 },
|
|
||||||
name: 'foo',
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const smg = new SourceMapGenerator();
|
|
||||||
smg.setSourceContent('input.js', 'foobar');
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapGenerator.prototype.toJSON()
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const smg = new SourceMapGenerator();
|
|
||||||
smg.toJSON(); // { version: 3, names: [], sources: [], mappings: '' }
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapGenerator.prototype.toDecodedMap()
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const smg = new SourceMapGenerator();
|
|
||||||
smg.toDecodedMap(); // { version: 3, names: [], sources: [], mappings: [] }
|
|
||||||
```
|
|
||||||
|
|
||||||
[trace-mapping]: https://github.com/jridgewell/trace-mapping/
|
|
||||||
[gen-mapping]: https://github.com/jridgewell/gen-mapping/
|
|
928
node_modules/@jridgewell/source-map/dist/source-map.mjs
generated
vendored
928
node_modules/@jridgewell/source-map/dist/source-map.mjs
generated
vendored
@ -1,928 +0,0 @@
|
|||||||
const comma = ','.charCodeAt(0);
|
|
||||||
const semicolon = ';'.charCodeAt(0);
|
|
||||||
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
||||||
const intToChar = new Uint8Array(64); // 64 possible chars.
|
|
||||||
const charToInteger = new Uint8Array(128); // z is 122 in ASCII
|
|
||||||
for (let i = 0; i < chars.length; i++) {
|
|
||||||
const c = chars.charCodeAt(i);
|
|
||||||
charToInteger[c] = i;
|
|
||||||
intToChar[i] = c;
|
|
||||||
}
|
|
||||||
// Provide a fallback for older environments.
|
|
||||||
const td = typeof TextDecoder !== 'undefined'
|
|
||||||
? new TextDecoder()
|
|
||||||
: typeof Buffer !== 'undefined'
|
|
||||||
? {
|
|
||||||
decode(buf) {
|
|
||||||
const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
||||||
return out.toString();
|
|
||||||
},
|
|
||||||
}
|
|
||||||
: {
|
|
||||||
decode(buf) {
|
|
||||||
let out = '';
|
|
||||||
for (let i = 0; i < buf.length; i++) {
|
|
||||||
out += String.fromCharCode(buf[i]);
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
function decode(mappings) {
|
|
||||||
const state = new Int32Array(5);
|
|
||||||
const decoded = [];
|
|
||||||
let line = [];
|
|
||||||
let sorted = true;
|
|
||||||
let lastCol = 0;
|
|
||||||
for (let i = 0; i < mappings.length;) {
|
|
||||||
const c = mappings.charCodeAt(i);
|
|
||||||
if (c === comma) {
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
else if (c === semicolon) {
|
|
||||||
state[0] = lastCol = 0;
|
|
||||||
if (!sorted)
|
|
||||||
sort(line);
|
|
||||||
sorted = true;
|
|
||||||
decoded.push(line);
|
|
||||||
line = [];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
i = decodeInteger(mappings, i, state, 0); // generatedCodeColumn
|
|
||||||
const col = state[0];
|
|
||||||
if (col < lastCol)
|
|
||||||
sorted = false;
|
|
||||||
lastCol = col;
|
|
||||||
if (!hasMoreSegments(mappings, i)) {
|
|
||||||
line.push([col]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
i = decodeInteger(mappings, i, state, 1); // sourceFileIndex
|
|
||||||
i = decodeInteger(mappings, i, state, 2); // sourceCodeLine
|
|
||||||
i = decodeInteger(mappings, i, state, 3); // sourceCodeColumn
|
|
||||||
if (!hasMoreSegments(mappings, i)) {
|
|
||||||
line.push([col, state[1], state[2], state[3]]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
i = decodeInteger(mappings, i, state, 4); // nameIndex
|
|
||||||
line.push([col, state[1], state[2], state[3], state[4]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!sorted)
|
|
||||||
sort(line);
|
|
||||||
decoded.push(line);
|
|
||||||
return decoded;
|
|
||||||
}
|
|
||||||
function decodeInteger(mappings, pos, state, j) {
|
|
||||||
let value = 0;
|
|
||||||
let shift = 0;
|
|
||||||
let integer = 0;
|
|
||||||
do {
|
|
||||||
const c = mappings.charCodeAt(pos++);
|
|
||||||
integer = charToInteger[c];
|
|
||||||
value |= (integer & 31) << shift;
|
|
||||||
shift += 5;
|
|
||||||
} while (integer & 32);
|
|
||||||
const shouldNegate = value & 1;
|
|
||||||
value >>>= 1;
|
|
||||||
if (shouldNegate) {
|
|
||||||
value = -0x80000000 | -value;
|
|
||||||
}
|
|
||||||
state[j] += value;
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
function hasMoreSegments(mappings, i) {
|
|
||||||
if (i >= mappings.length)
|
|
||||||
return false;
|
|
||||||
const c = mappings.charCodeAt(i);
|
|
||||||
if (c === comma || c === semicolon)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
function sort(line) {
|
|
||||||
line.sort(sortComparator$1);
|
|
||||||
}
|
|
||||||
function sortComparator$1(a, b) {
|
|
||||||
return a[0] - b[0];
|
|
||||||
}
|
|
||||||
function encode(decoded) {
|
|
||||||
const state = new Int32Array(5);
|
|
||||||
let buf = new Uint8Array(1024);
|
|
||||||
let pos = 0;
|
|
||||||
for (let i = 0; i < decoded.length; i++) {
|
|
||||||
const line = decoded[i];
|
|
||||||
if (i > 0) {
|
|
||||||
buf = reserve(buf, pos, 1);
|
|
||||||
buf[pos++] = semicolon;
|
|
||||||
}
|
|
||||||
if (line.length === 0)
|
|
||||||
continue;
|
|
||||||
state[0] = 0;
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const segment = line[j];
|
|
||||||
// We can push up to 5 ints, each int can take at most 7 chars, and we
|
|
||||||
// may push a comma.
|
|
||||||
buf = reserve(buf, pos, 36);
|
|
||||||
if (j > 0)
|
|
||||||
buf[pos++] = comma;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 0); // generatedCodeColumn
|
|
||||||
if (segment.length === 1)
|
|
||||||
continue;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 1); // sourceFileIndex
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 2); // sourceCodeLine
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 3); // sourceCodeColumn
|
|
||||||
if (segment.length === 4)
|
|
||||||
continue;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 4); // nameIndex
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return td.decode(buf.subarray(0, pos));
|
|
||||||
}
|
|
||||||
function reserve(buf, pos, count) {
|
|
||||||
if (buf.length > pos + count)
|
|
||||||
return buf;
|
|
||||||
const swap = new Uint8Array(buf.length * 2);
|
|
||||||
swap.set(buf);
|
|
||||||
return swap;
|
|
||||||
}
|
|
||||||
function encodeInteger(buf, pos, state, segment, j) {
|
|
||||||
const next = segment[j];
|
|
||||||
let num = next - state[j];
|
|
||||||
state[j] = next;
|
|
||||||
num = num < 0 ? (-num << 1) | 1 : num << 1;
|
|
||||||
do {
|
|
||||||
let clamped = num & 0b011111;
|
|
||||||
num >>>= 5;
|
|
||||||
if (num > 0)
|
|
||||||
clamped |= 0b100000;
|
|
||||||
buf[pos++] = intToChar[clamped];
|
|
||||||
} while (num > 0);
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Matches the scheme of a URL, eg "http://"
|
|
||||||
const schemeRegex = /^[\w+.-]+:\/\//;
|
|
||||||
/**
|
|
||||||
* Matches the parts of a URL:
|
|
||||||
* 1. Scheme, including ":", guaranteed.
|
|
||||||
* 2. User/password, including "@", optional.
|
|
||||||
* 3. Host, guaranteed.
|
|
||||||
* 4. Port, including ":", optional.
|
|
||||||
* 5. Path, including "/", optional.
|
|
||||||
*/
|
|
||||||
const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?/;
|
|
||||||
/**
|
|
||||||
* File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start
|
|
||||||
* with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).
|
|
||||||
*
|
|
||||||
* 1. Host, optional.
|
|
||||||
* 2. Path, which may inclue "/", guaranteed.
|
|
||||||
*/
|
|
||||||
const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/]*)?)?(\/?.*)/i;
|
|
||||||
function isAbsoluteUrl(input) {
|
|
||||||
return schemeRegex.test(input);
|
|
||||||
}
|
|
||||||
function isSchemeRelativeUrl(input) {
|
|
||||||
return input.startsWith('//');
|
|
||||||
}
|
|
||||||
function isAbsolutePath(input) {
|
|
||||||
return input.startsWith('/');
|
|
||||||
}
|
|
||||||
function isFileUrl(input) {
|
|
||||||
return input.startsWith('file:');
|
|
||||||
}
|
|
||||||
function parseAbsoluteUrl(input) {
|
|
||||||
const match = urlRegex.exec(input);
|
|
||||||
return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/');
|
|
||||||
}
|
|
||||||
function parseFileUrl(input) {
|
|
||||||
const match = fileRegex.exec(input);
|
|
||||||
const path = match[2];
|
|
||||||
return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path);
|
|
||||||
}
|
|
||||||
function makeUrl(scheme, user, host, port, path) {
|
|
||||||
return {
|
|
||||||
scheme,
|
|
||||||
user,
|
|
||||||
host,
|
|
||||||
port,
|
|
||||||
path,
|
|
||||||
relativePath: false,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function parseUrl(input) {
|
|
||||||
if (isSchemeRelativeUrl(input)) {
|
|
||||||
const url = parseAbsoluteUrl('http:' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
if (isAbsolutePath(input)) {
|
|
||||||
const url = parseAbsoluteUrl('http://foo.com' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
url.host = '';
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
if (isFileUrl(input))
|
|
||||||
return parseFileUrl(input);
|
|
||||||
if (isAbsoluteUrl(input))
|
|
||||||
return parseAbsoluteUrl(input);
|
|
||||||
const url = parseAbsoluteUrl('http://foo.com/' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
url.host = '';
|
|
||||||
url.relativePath = true;
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
function stripPathFilename(path) {
|
|
||||||
// If a path ends with a parent directory "..", then it's a relative path with excess parent
|
|
||||||
// paths. It's not a file, so we can't strip it.
|
|
||||||
if (path.endsWith('/..'))
|
|
||||||
return path;
|
|
||||||
const index = path.lastIndexOf('/');
|
|
||||||
return path.slice(0, index + 1);
|
|
||||||
}
|
|
||||||
function mergePaths(url, base) {
|
|
||||||
// If we're not a relative path, then we're an absolute path, and it doesn't matter what base is.
|
|
||||||
if (!url.relativePath)
|
|
||||||
return;
|
|
||||||
normalizePath(base);
|
|
||||||
// If the path is just a "/", then it was an empty path to begin with (remember, we're a relative
|
|
||||||
// path).
|
|
||||||
if (url.path === '/') {
|
|
||||||
url.path = base.path;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Resolution happens relative to the base path's directory, not the file.
|
|
||||||
url.path = stripPathFilename(base.path) + url.path;
|
|
||||||
}
|
|
||||||
// If the base path is absolute, then our path is now absolute too.
|
|
||||||
url.relativePath = base.relativePath;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* The path can have empty directories "//", unneeded parents "foo/..", or current directory
|
|
||||||
* "foo/.". We need to normalize to a standard representation.
|
|
||||||
*/
|
|
||||||
function normalizePath(url) {
|
|
||||||
const { relativePath } = url;
|
|
||||||
const pieces = url.path.split('/');
|
|
||||||
// We need to preserve the first piece always, so that we output a leading slash. The item at
|
|
||||||
// pieces[0] is an empty string.
|
|
||||||
let pointer = 1;
|
|
||||||
// Positive is the number of real directories we've output, used for popping a parent directory.
|
|
||||||
// Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo".
|
|
||||||
let positive = 0;
|
|
||||||
// We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will
|
|
||||||
// generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a
|
|
||||||
// real directory, we won't need to append, unless the other conditions happen again.
|
|
||||||
let addTrailingSlash = false;
|
|
||||||
for (let i = 1; i < pieces.length; i++) {
|
|
||||||
const piece = pieces[i];
|
|
||||||
// An empty directory, could be a trailing slash, or just a double "//" in the path.
|
|
||||||
if (!piece) {
|
|
||||||
addTrailingSlash = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// If we encounter a real directory, then we don't need to append anymore.
|
|
||||||
addTrailingSlash = false;
|
|
||||||
// A current directory, which we can always drop.
|
|
||||||
if (piece === '.')
|
|
||||||
continue;
|
|
||||||
// A parent directory, we need to see if there are any real directories we can pop. Else, we
|
|
||||||
// have an excess of parents, and we'll need to keep the "..".
|
|
||||||
if (piece === '..') {
|
|
||||||
if (positive) {
|
|
||||||
addTrailingSlash = true;
|
|
||||||
positive--;
|
|
||||||
pointer--;
|
|
||||||
}
|
|
||||||
else if (relativePath) {
|
|
||||||
// If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute
|
|
||||||
// URL, protocol relative URL, or an absolute path, we don't need to keep excess.
|
|
||||||
pieces[pointer++] = piece;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// We've encountered a real directory. Move it to the next insertion pointer, which accounts for
|
|
||||||
// any popped or dropped directories.
|
|
||||||
pieces[pointer++] = piece;
|
|
||||||
positive++;
|
|
||||||
}
|
|
||||||
let path = '';
|
|
||||||
for (let i = 1; i < pointer; i++) {
|
|
||||||
path += '/' + pieces[i];
|
|
||||||
}
|
|
||||||
if (!path || (addTrailingSlash && !path.endsWith('/..'))) {
|
|
||||||
path += '/';
|
|
||||||
}
|
|
||||||
url.path = path;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Attempts to resolve `input` URL/path relative to `base`.
|
|
||||||
*/
|
|
||||||
function resolve$1(input, base) {
|
|
||||||
if (!input && !base)
|
|
||||||
return '';
|
|
||||||
const url = parseUrl(input);
|
|
||||||
// If we have a base, and the input isn't already an absolute URL, then we need to merge.
|
|
||||||
if (base && !url.scheme) {
|
|
||||||
const baseUrl = parseUrl(base);
|
|
||||||
url.scheme = baseUrl.scheme;
|
|
||||||
// If there's no host, then we were just a path.
|
|
||||||
if (!url.host) {
|
|
||||||
// The host, user, and port are joined, you can't copy one without the others.
|
|
||||||
url.user = baseUrl.user;
|
|
||||||
url.host = baseUrl.host;
|
|
||||||
url.port = baseUrl.port;
|
|
||||||
}
|
|
||||||
mergePaths(url, baseUrl);
|
|
||||||
}
|
|
||||||
normalizePath(url);
|
|
||||||
// If the input (and base, if there was one) are both relative, then we need to output a relative.
|
|
||||||
if (url.relativePath) {
|
|
||||||
// The first char is always a "/".
|
|
||||||
const path = url.path.slice(1);
|
|
||||||
if (!path)
|
|
||||||
return '.';
|
|
||||||
// If base started with a leading ".", or there is no base and input started with a ".", then we
|
|
||||||
// need to ensure that the relative path starts with a ".". We don't know if relative starts
|
|
||||||
// with a "..", though, so check before prepending.
|
|
||||||
const keepRelative = (base || input).startsWith('.');
|
|
||||||
return !keepRelative || path.startsWith('.') ? path : './' + path;
|
|
||||||
}
|
|
||||||
// If there's no host (and no scheme/user/port), then we need to output an absolute path.
|
|
||||||
if (!url.scheme && !url.host)
|
|
||||||
return url.path;
|
|
||||||
// We're outputting either an absolute URL, or a protocol relative one.
|
|
||||||
return `${url.scheme}//${url.user}${url.host}${url.port}${url.path}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolve(input, base) {
|
|
||||||
// The base is always treated as a directory, if it's not empty.
|
|
||||||
// https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327
|
|
||||||
// https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401
|
|
||||||
if (base && !base.endsWith('/'))
|
|
||||||
base += '/';
|
|
||||||
return resolve$1(input, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes everything after the last "/", but leaves the slash.
|
|
||||||
*/
|
|
||||||
function stripFilename(path) {
|
|
||||||
if (!path)
|
|
||||||
return '';
|
|
||||||
const index = path.lastIndexOf('/');
|
|
||||||
return path.slice(0, index + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const COLUMN$1 = 0;
|
|
||||||
const SOURCES_INDEX$1 = 1;
|
|
||||||
const SOURCE_LINE$1 = 2;
|
|
||||||
const SOURCE_COLUMN$1 = 3;
|
|
||||||
const NAMES_INDEX$1 = 4;
|
|
||||||
|
|
||||||
function maybeSort(mappings, owned) {
|
|
||||||
const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);
|
|
||||||
if (unsortedIndex === mappings.length)
|
|
||||||
return mappings;
|
|
||||||
// If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If
|
|
||||||
// not, we do not want to modify the consumer's input array.
|
|
||||||
if (!owned)
|
|
||||||
mappings = mappings.slice();
|
|
||||||
for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {
|
|
||||||
mappings[i] = sortSegments(mappings[i], owned);
|
|
||||||
}
|
|
||||||
return mappings;
|
|
||||||
}
|
|
||||||
function nextUnsortedSegmentLine(mappings, start) {
|
|
||||||
for (let i = start; i < mappings.length; i++) {
|
|
||||||
if (!isSorted(mappings[i]))
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return mappings.length;
|
|
||||||
}
|
|
||||||
function isSorted(line) {
|
|
||||||
for (let j = 1; j < line.length; j++) {
|
|
||||||
if (line[j][COLUMN$1] < line[j - 1][COLUMN$1]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
function sortSegments(line, owned) {
|
|
||||||
if (!owned)
|
|
||||||
line = line.slice();
|
|
||||||
return line.sort(sortComparator);
|
|
||||||
}
|
|
||||||
function sortComparator(a, b) {
|
|
||||||
return a[COLUMN$1] - b[COLUMN$1];
|
|
||||||
}
|
|
||||||
|
|
||||||
let found = false;
|
|
||||||
/**
|
|
||||||
* A binary search implementation that returns the index if a match is found.
|
|
||||||
* If no match is found, then the left-index (the index associated with the item that comes just
|
|
||||||
* before the desired index) is returned. To maintain proper sort order, a splice would happen at
|
|
||||||
* the next index:
|
|
||||||
*
|
|
||||||
* ```js
|
|
||||||
* const array = [1, 3];
|
|
||||||
* const needle = 2;
|
|
||||||
* const index = binarySearch(array, needle, (item, needle) => item - needle);
|
|
||||||
*
|
|
||||||
* assert.equal(index, 0);
|
|
||||||
* array.splice(index + 1, 0, needle);
|
|
||||||
* assert.deepEqual(array, [1, 2, 3]);
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
function binarySearch(haystack, needle, low, high) {
|
|
||||||
while (low <= high) {
|
|
||||||
const mid = low + ((high - low) >> 1);
|
|
||||||
const cmp = haystack[mid][COLUMN$1] - needle;
|
|
||||||
if (cmp === 0) {
|
|
||||||
found = true;
|
|
||||||
return mid;
|
|
||||||
}
|
|
||||||
if (cmp < 0) {
|
|
||||||
low = mid + 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
high = mid - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
found = false;
|
|
||||||
return low - 1;
|
|
||||||
}
|
|
||||||
function upperBound(haystack, needle, index) {
|
|
||||||
for (let i = index + 1; i < haystack.length; i++, index++) {
|
|
||||||
if (haystack[i][COLUMN$1] !== needle)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function lowerBound(haystack, needle, index) {
|
|
||||||
for (let i = index - 1; i >= 0; i--, index--) {
|
|
||||||
if (haystack[i][COLUMN$1] !== needle)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function memoizedState() {
|
|
||||||
return {
|
|
||||||
lastKey: -1,
|
|
||||||
lastNeedle: -1,
|
|
||||||
lastIndex: -1,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This overly complicated beast is just to record the last tested line/column and the resulting
|
|
||||||
* index, allowing us to skip a few tests if mappings are monotonically increasing.
|
|
||||||
*/
|
|
||||||
function memoizedBinarySearch(haystack, needle, state, key) {
|
|
||||||
const { lastKey, lastNeedle, lastIndex } = state;
|
|
||||||
let low = 0;
|
|
||||||
let high = haystack.length - 1;
|
|
||||||
if (key === lastKey) {
|
|
||||||
if (needle === lastNeedle) {
|
|
||||||
found = lastIndex !== -1 && haystack[lastIndex][COLUMN$1] === needle;
|
|
||||||
return lastIndex;
|
|
||||||
}
|
|
||||||
if (needle >= lastNeedle) {
|
|
||||||
// lastIndex may be -1 if the previous needle was not found.
|
|
||||||
low = lastIndex === -1 ? 0 : lastIndex;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
high = lastIndex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state.lastKey = key;
|
|
||||||
state.lastNeedle = needle;
|
|
||||||
return (state.lastIndex = binarySearch(haystack, needle, low, high));
|
|
||||||
}
|
|
||||||
|
|
||||||
const AnyMap = function (map, mapUrl) {
|
|
||||||
const parsed = typeof map === 'string' ? JSON.parse(map) : map;
|
|
||||||
if (!('sections' in parsed))
|
|
||||||
return new TraceMap(parsed, mapUrl);
|
|
||||||
const mappings = [];
|
|
||||||
const sources = [];
|
|
||||||
const sourcesContent = [];
|
|
||||||
const names = [];
|
|
||||||
const { sections } = parsed;
|
|
||||||
let i = 0;
|
|
||||||
for (; i < sections.length - 1; i++) {
|
|
||||||
const no = sections[i + 1].offset;
|
|
||||||
addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, no.line, no.column);
|
|
||||||
}
|
|
||||||
if (sections.length > 0) {
|
|
||||||
addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, Infinity, Infinity);
|
|
||||||
}
|
|
||||||
const joined = {
|
|
||||||
version: 3,
|
|
||||||
file: parsed.file,
|
|
||||||
names,
|
|
||||||
sources,
|
|
||||||
sourcesContent,
|
|
||||||
mappings,
|
|
||||||
};
|
|
||||||
return presortedDecodedMap(joined);
|
|
||||||
};
|
|
||||||
function addSection(section, mapUrl, mappings, sources, sourcesContent, names, stopLine, stopColumn) {
|
|
||||||
const map = AnyMap(section.map, mapUrl);
|
|
||||||
const { line: lineOffset, column: columnOffset } = section.offset;
|
|
||||||
const sourcesOffset = sources.length;
|
|
||||||
const namesOffset = names.length;
|
|
||||||
const decoded = decodedMappings(map);
|
|
||||||
const { resolvedSources } = map;
|
|
||||||
append(sources, resolvedSources);
|
|
||||||
append(sourcesContent, map.sourcesContent || fillSourcesContent(resolvedSources.length));
|
|
||||||
append(names, map.names);
|
|
||||||
// If this section jumps forwards several lines, we need to add lines to the output mappings catch up.
|
|
||||||
for (let i = mappings.length; i <= lineOffset; i++)
|
|
||||||
mappings.push([]);
|
|
||||||
// We can only add so many lines before we step into the range that the next section's map
|
|
||||||
// controls. When we get to the last line, then we'll start checking the segments to see if
|
|
||||||
// they've crossed into the column range.
|
|
||||||
const stopI = stopLine - lineOffset;
|
|
||||||
const len = Math.min(decoded.length, stopI + 1);
|
|
||||||
for (let i = 0; i < len; i++) {
|
|
||||||
const line = decoded[i];
|
|
||||||
// On the 0th loop, the line will already exist due to a previous section, or the line catch up
|
|
||||||
// loop above.
|
|
||||||
const out = i === 0 ? mappings[lineOffset] : (mappings[lineOffset + i] = []);
|
|
||||||
// On the 0th loop, the section's column offset shifts us forward. On all other lines (since the
|
|
||||||
// map can be multiple lines), it doesn't.
|
|
||||||
const cOffset = i === 0 ? columnOffset : 0;
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const seg = line[j];
|
|
||||||
const column = cOffset + seg[COLUMN$1];
|
|
||||||
// If this segment steps into the column range that the next section's map controls, we need
|
|
||||||
// to stop early.
|
|
||||||
if (i === stopI && column >= stopColumn)
|
|
||||||
break;
|
|
||||||
if (seg.length === 1) {
|
|
||||||
out.push([column]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX$1];
|
|
||||||
const sourceLine = seg[SOURCE_LINE$1];
|
|
||||||
const sourceColumn = seg[SOURCE_COLUMN$1];
|
|
||||||
if (seg.length === 4) {
|
|
||||||
out.push([column, sourcesIndex, sourceLine, sourceColumn]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.push([column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX$1]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function append(arr, other) {
|
|
||||||
for (let i = 0; i < other.length; i++)
|
|
||||||
arr.push(other[i]);
|
|
||||||
}
|
|
||||||
// Sourcemaps don't need to have sourcesContent, and if they don't, we need to create an array of
|
|
||||||
// equal length to the sources. This is because the sources and sourcesContent are paired arrays,
|
|
||||||
// where `sourcesContent[i]` is the content of the `sources[i]` file. If we didn't, then joined
|
|
||||||
// sourcemap would desynchronize the sources/contents.
|
|
||||||
function fillSourcesContent(len) {
|
|
||||||
const sourcesContent = [];
|
|
||||||
for (let i = 0; i < len; i++)
|
|
||||||
sourcesContent[i] = null;
|
|
||||||
return sourcesContent;
|
|
||||||
}
|
|
||||||
|
|
||||||
const INVALID_ORIGINAL_MAPPING = Object.freeze({
|
|
||||||
source: null,
|
|
||||||
line: null,
|
|
||||||
column: null,
|
|
||||||
name: null,
|
|
||||||
});
|
|
||||||
Object.freeze({
|
|
||||||
line: null,
|
|
||||||
column: null,
|
|
||||||
});
|
|
||||||
const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';
|
|
||||||
const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';
|
|
||||||
const LEAST_UPPER_BOUND = -1;
|
|
||||||
const GREATEST_LOWER_BOUND = 1;
|
|
||||||
/**
|
|
||||||
* Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.
|
|
||||||
*/
|
|
||||||
let decodedMappings;
|
|
||||||
/**
|
|
||||||
* A higher-level API to find the source/line/column associated with a generated line/column
|
|
||||||
* (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in
|
|
||||||
* `source-map` library.
|
|
||||||
*/
|
|
||||||
let originalPositionFor;
|
|
||||||
/**
|
|
||||||
* A helper that skips sorting of the input map's mappings array, which can be expensive for larger
|
|
||||||
* maps.
|
|
||||||
*/
|
|
||||||
let presortedDecodedMap;
|
|
||||||
class TraceMap {
|
|
||||||
constructor(map, mapUrl) {
|
|
||||||
this._decodedMemo = memoizedState();
|
|
||||||
this._bySources = undefined;
|
|
||||||
this._bySourceMemos = undefined;
|
|
||||||
const isString = typeof map === 'string';
|
|
||||||
if (!isString && map.constructor === TraceMap)
|
|
||||||
return map;
|
|
||||||
const parsed = (isString ? JSON.parse(map) : map);
|
|
||||||
const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
|
|
||||||
this.version = version;
|
|
||||||
this.file = file;
|
|
||||||
this.names = names;
|
|
||||||
this.sourceRoot = sourceRoot;
|
|
||||||
this.sources = sources;
|
|
||||||
this.sourcesContent = sourcesContent;
|
|
||||||
if (sourceRoot || mapUrl) {
|
|
||||||
const from = resolve(sourceRoot || '', stripFilename(mapUrl));
|
|
||||||
this.resolvedSources = sources.map((s) => resolve(s || '', from));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.resolvedSources = sources.map((s) => s || '');
|
|
||||||
}
|
|
||||||
const { mappings } = parsed;
|
|
||||||
if (typeof mappings === 'string') {
|
|
||||||
this._encoded = mappings;
|
|
||||||
this._decoded = undefined;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this._encoded = undefined;
|
|
||||||
this._decoded = maybeSort(mappings, isString);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
decodedMappings = (map) => {
|
|
||||||
return (map._decoded || (map._decoded = decode(map._encoded)));
|
|
||||||
};
|
|
||||||
originalPositionFor = (map, { line, column, bias }) => {
|
|
||||||
line--;
|
|
||||||
if (line < 0)
|
|
||||||
throw new Error(LINE_GTR_ZERO);
|
|
||||||
if (column < 0)
|
|
||||||
throw new Error(COL_GTR_EQ_ZERO);
|
|
||||||
const decoded = decodedMappings(map);
|
|
||||||
// It's common for parent source maps to have pointers to lines that have no
|
|
||||||
// mapping (like a "//# sourceMappingURL=") at the end of the child file.
|
|
||||||
if (line >= decoded.length)
|
|
||||||
return INVALID_ORIGINAL_MAPPING;
|
|
||||||
const segment = traceSegmentInternal(decoded[line], map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
|
|
||||||
if (segment == null)
|
|
||||||
return INVALID_ORIGINAL_MAPPING;
|
|
||||||
if (segment.length == 1)
|
|
||||||
return INVALID_ORIGINAL_MAPPING;
|
|
||||||
const { names, resolvedSources } = map;
|
|
||||||
return {
|
|
||||||
source: resolvedSources[segment[SOURCES_INDEX$1]],
|
|
||||||
line: segment[SOURCE_LINE$1] + 1,
|
|
||||||
column: segment[SOURCE_COLUMN$1],
|
|
||||||
name: segment.length === 5 ? names[segment[NAMES_INDEX$1]] : null,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
presortedDecodedMap = (map, mapUrl) => {
|
|
||||||
const clone = Object.assign({}, map);
|
|
||||||
clone.mappings = [];
|
|
||||||
const tracer = new TraceMap(clone, mapUrl);
|
|
||||||
tracer._decoded = map.mappings;
|
|
||||||
return tracer;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
function traceSegmentInternal(segments, memo, line, column, bias) {
|
|
||||||
let index = memoizedBinarySearch(segments, column, memo, line);
|
|
||||||
if (found) {
|
|
||||||
index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);
|
|
||||||
}
|
|
||||||
else if (bias === LEAST_UPPER_BOUND)
|
|
||||||
index++;
|
|
||||||
if (index === -1 || index === segments.length)
|
|
||||||
return null;
|
|
||||||
return segments[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the index associated with `key` in the backing array, if it is already present.
|
|
||||||
*/
|
|
||||||
let get;
|
|
||||||
/**
|
|
||||||
* Puts `key` into the backing array, if it is not already present. Returns
|
|
||||||
* the index of the `key` in the backing array.
|
|
||||||
*/
|
|
||||||
let put;
|
|
||||||
/**
|
|
||||||
* SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
|
|
||||||
* index of the `key` in the backing array.
|
|
||||||
*
|
|
||||||
* This is designed to allow synchronizing a second array with the contents of the backing array,
|
|
||||||
* like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
|
|
||||||
* and there are never duplicates.
|
|
||||||
*/
|
|
||||||
class SetArray {
|
|
||||||
constructor() {
|
|
||||||
this._indexes = { __proto__: null };
|
|
||||||
this.array = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
get = (strarr, key) => strarr._indexes[key];
|
|
||||||
put = (strarr, key) => {
|
|
||||||
// The key may or may not be present. If it is present, it's a number.
|
|
||||||
const index = get(strarr, key);
|
|
||||||
if (index !== undefined)
|
|
||||||
return index;
|
|
||||||
const { array, _indexes: indexes } = strarr;
|
|
||||||
return (indexes[key] = array.push(key) - 1);
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
const COLUMN = 0;
|
|
||||||
const SOURCES_INDEX = 1;
|
|
||||||
const SOURCE_LINE = 2;
|
|
||||||
const SOURCE_COLUMN = 3;
|
|
||||||
const NAMES_INDEX = 4;
|
|
||||||
|
|
||||||
const NO_NAME = -1;
|
|
||||||
/**
|
|
||||||
* Same as `addMapping`, but will only add the mapping if it generates useful information in the
|
|
||||||
* resulting map. This only works correctly if mappings are added **in order**, meaning you should
|
|
||||||
* not add a mapping with a lower generated line/column than one that came before.
|
|
||||||
*/
|
|
||||||
let maybeAddMapping;
|
|
||||||
/**
|
|
||||||
* Adds/removes the content of the source file to the source map.
|
|
||||||
*/
|
|
||||||
let setSourceContent;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
let toDecodedMap;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
let toEncodedMap;
|
|
||||||
// This split declaration is only so that terser can elminiate the static initialization block.
|
|
||||||
let addSegmentInternal;
|
|
||||||
/**
|
|
||||||
* Provides the state to generate a sourcemap.
|
|
||||||
*/
|
|
||||||
class GenMapping {
|
|
||||||
constructor({ file, sourceRoot } = {}) {
|
|
||||||
this._names = new SetArray();
|
|
||||||
this._sources = new SetArray();
|
|
||||||
this._sourcesContent = [];
|
|
||||||
this._mappings = [];
|
|
||||||
this.file = file;
|
|
||||||
this.sourceRoot = sourceRoot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
maybeAddMapping = (map, mapping) => {
|
|
||||||
return addMappingInternal(true, map, mapping);
|
|
||||||
};
|
|
||||||
setSourceContent = (map, source, content) => {
|
|
||||||
const { _sources: sources, _sourcesContent: sourcesContent } = map;
|
|
||||||
sourcesContent[put(sources, source)] = content;
|
|
||||||
};
|
|
||||||
toDecodedMap = (map) => {
|
|
||||||
const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
|
|
||||||
removeEmptyFinalLines(mappings);
|
|
||||||
return {
|
|
||||||
version: 3,
|
|
||||||
file: file || undefined,
|
|
||||||
names: names.array,
|
|
||||||
sourceRoot: sourceRoot || undefined,
|
|
||||||
sources: sources.array,
|
|
||||||
sourcesContent,
|
|
||||||
mappings,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
toEncodedMap = (map) => {
|
|
||||||
const decoded = toDecodedMap(map);
|
|
||||||
return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });
|
|
||||||
};
|
|
||||||
// Internal helpers
|
|
||||||
addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {
|
|
||||||
const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
|
|
||||||
const line = getLine(mappings, genLine);
|
|
||||||
const index = getColumnIndex(line, genColumn);
|
|
||||||
if (!source) {
|
|
||||||
if (skipable && skipSourceless(line, index))
|
|
||||||
return;
|
|
||||||
return insert(line, index, [genColumn]);
|
|
||||||
}
|
|
||||||
const sourcesIndex = put(sources, source);
|
|
||||||
const namesIndex = name ? put(names, name) : NO_NAME;
|
|
||||||
if (sourcesIndex === sourcesContent.length)
|
|
||||||
sourcesContent[sourcesIndex] = null;
|
|
||||||
if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return insert(line, index, name
|
|
||||||
? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
|
|
||||||
: [genColumn, sourcesIndex, sourceLine, sourceColumn]);
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
function getLine(mappings, index) {
|
|
||||||
for (let i = mappings.length; i <= index; i++) {
|
|
||||||
mappings[i] = [];
|
|
||||||
}
|
|
||||||
return mappings[index];
|
|
||||||
}
|
|
||||||
function getColumnIndex(line, genColumn) {
|
|
||||||
let index = line.length;
|
|
||||||
for (let i = index - 1; i >= 0; index = i--) {
|
|
||||||
const current = line[i];
|
|
||||||
if (genColumn >= current[COLUMN])
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function insert(array, index, value) {
|
|
||||||
for (let i = array.length; i > index; i--) {
|
|
||||||
array[i] = array[i - 1];
|
|
||||||
}
|
|
||||||
array[index] = value;
|
|
||||||
}
|
|
||||||
function removeEmptyFinalLines(mappings) {
|
|
||||||
const { length } = mappings;
|
|
||||||
let len = length;
|
|
||||||
for (let i = len - 1; i >= 0; len = i, i--) {
|
|
||||||
if (mappings[i].length > 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (len < length)
|
|
||||||
mappings.length = len;
|
|
||||||
}
|
|
||||||
function skipSourceless(line, index) {
|
|
||||||
// The start of a line is already sourceless, so adding a sourceless segment to the beginning
|
|
||||||
// doesn't generate any useful information.
|
|
||||||
if (index === 0)
|
|
||||||
return true;
|
|
||||||
const prev = line[index - 1];
|
|
||||||
// If the previous segment is also sourceless, then adding another sourceless segment doesn't
|
|
||||||
// genrate any new information. Else, this segment will end the source/named segment and point to
|
|
||||||
// a sourceless position, which is useful.
|
|
||||||
return prev.length === 1;
|
|
||||||
}
|
|
||||||
function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {
|
|
||||||
// A source/named segment at the start of a line gives position at that genColumn
|
|
||||||
if (index === 0)
|
|
||||||
return false;
|
|
||||||
const prev = line[index - 1];
|
|
||||||
// If the previous segment is sourceless, then we're transitioning to a source.
|
|
||||||
if (prev.length === 1)
|
|
||||||
return false;
|
|
||||||
// If the previous segment maps to the exact same source position, then this segment doesn't
|
|
||||||
// provide any new position information.
|
|
||||||
return (sourcesIndex === prev[SOURCES_INDEX] &&
|
|
||||||
sourceLine === prev[SOURCE_LINE] &&
|
|
||||||
sourceColumn === prev[SOURCE_COLUMN] &&
|
|
||||||
namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));
|
|
||||||
}
|
|
||||||
function addMappingInternal(skipable, map, mapping) {
|
|
||||||
const { generated, source, original, name } = mapping;
|
|
||||||
if (!source) {
|
|
||||||
return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null);
|
|
||||||
}
|
|
||||||
const s = source;
|
|
||||||
return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
class SourceMapConsumer {
|
|
||||||
constructor(map, mapUrl) {
|
|
||||||
const trace = (this._map = new AnyMap(map, mapUrl));
|
|
||||||
this.file = trace.file;
|
|
||||||
this.names = trace.names;
|
|
||||||
this.sourceRoot = trace.sourceRoot;
|
|
||||||
this.sources = trace.resolvedSources;
|
|
||||||
this.sourcesContent = trace.sourcesContent;
|
|
||||||
}
|
|
||||||
originalPositionFor(needle) {
|
|
||||||
return originalPositionFor(this._map, needle);
|
|
||||||
}
|
|
||||||
destroy() {
|
|
||||||
// noop.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class SourceMapGenerator {
|
|
||||||
constructor(opts) {
|
|
||||||
this._map = new GenMapping(opts);
|
|
||||||
}
|
|
||||||
addMapping(mapping) {
|
|
||||||
maybeAddMapping(this._map, mapping);
|
|
||||||
}
|
|
||||||
setSourceContent(source, content) {
|
|
||||||
setSourceContent(this._map, source, content);
|
|
||||||
}
|
|
||||||
toJSON() {
|
|
||||||
return toEncodedMap(this._map);
|
|
||||||
}
|
|
||||||
toDecodedMap() {
|
|
||||||
return toDecodedMap(this._map);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export { SourceMapConsumer, SourceMapGenerator };
|
|
||||||
//# sourceMappingURL=source-map.mjs.map
|
|
1
node_modules/@jridgewell/source-map/dist/source-map.mjs.map
generated
vendored
1
node_modules/@jridgewell/source-map/dist/source-map.mjs.map
generated
vendored
File diff suppressed because one or more lines are too long
939
node_modules/@jridgewell/source-map/dist/source-map.umd.js
generated
vendored
939
node_modules/@jridgewell/source-map/dist/source-map.umd.js
generated
vendored
@ -1,939 +0,0 @@
|
|||||||
(function (global, factory) {
|
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
||||||
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.sourceMap = {}));
|
|
||||||
})(this, (function (exports) { 'use strict';
|
|
||||||
|
|
||||||
const comma = ','.charCodeAt(0);
|
|
||||||
const semicolon = ';'.charCodeAt(0);
|
|
||||||
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
||||||
const intToChar = new Uint8Array(64); // 64 possible chars.
|
|
||||||
const charToInteger = new Uint8Array(128); // z is 122 in ASCII
|
|
||||||
for (let i = 0; i < chars.length; i++) {
|
|
||||||
const c = chars.charCodeAt(i);
|
|
||||||
charToInteger[c] = i;
|
|
||||||
intToChar[i] = c;
|
|
||||||
}
|
|
||||||
// Provide a fallback for older environments.
|
|
||||||
const td = typeof TextDecoder !== 'undefined'
|
|
||||||
? new TextDecoder()
|
|
||||||
: typeof Buffer !== 'undefined'
|
|
||||||
? {
|
|
||||||
decode(buf) {
|
|
||||||
const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
||||||
return out.toString();
|
|
||||||
},
|
|
||||||
}
|
|
||||||
: {
|
|
||||||
decode(buf) {
|
|
||||||
let out = '';
|
|
||||||
for (let i = 0; i < buf.length; i++) {
|
|
||||||
out += String.fromCharCode(buf[i]);
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
function decode(mappings) {
|
|
||||||
const state = new Int32Array(5);
|
|
||||||
const decoded = [];
|
|
||||||
let line = [];
|
|
||||||
let sorted = true;
|
|
||||||
let lastCol = 0;
|
|
||||||
for (let i = 0; i < mappings.length;) {
|
|
||||||
const c = mappings.charCodeAt(i);
|
|
||||||
if (c === comma) {
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
else if (c === semicolon) {
|
|
||||||
state[0] = lastCol = 0;
|
|
||||||
if (!sorted)
|
|
||||||
sort(line);
|
|
||||||
sorted = true;
|
|
||||||
decoded.push(line);
|
|
||||||
line = [];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
i = decodeInteger(mappings, i, state, 0); // generatedCodeColumn
|
|
||||||
const col = state[0];
|
|
||||||
if (col < lastCol)
|
|
||||||
sorted = false;
|
|
||||||
lastCol = col;
|
|
||||||
if (!hasMoreSegments(mappings, i)) {
|
|
||||||
line.push([col]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
i = decodeInteger(mappings, i, state, 1); // sourceFileIndex
|
|
||||||
i = decodeInteger(mappings, i, state, 2); // sourceCodeLine
|
|
||||||
i = decodeInteger(mappings, i, state, 3); // sourceCodeColumn
|
|
||||||
if (!hasMoreSegments(mappings, i)) {
|
|
||||||
line.push([col, state[1], state[2], state[3]]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
i = decodeInteger(mappings, i, state, 4); // nameIndex
|
|
||||||
line.push([col, state[1], state[2], state[3], state[4]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!sorted)
|
|
||||||
sort(line);
|
|
||||||
decoded.push(line);
|
|
||||||
return decoded;
|
|
||||||
}
|
|
||||||
function decodeInteger(mappings, pos, state, j) {
|
|
||||||
let value = 0;
|
|
||||||
let shift = 0;
|
|
||||||
let integer = 0;
|
|
||||||
do {
|
|
||||||
const c = mappings.charCodeAt(pos++);
|
|
||||||
integer = charToInteger[c];
|
|
||||||
value |= (integer & 31) << shift;
|
|
||||||
shift += 5;
|
|
||||||
} while (integer & 32);
|
|
||||||
const shouldNegate = value & 1;
|
|
||||||
value >>>= 1;
|
|
||||||
if (shouldNegate) {
|
|
||||||
value = -0x80000000 | -value;
|
|
||||||
}
|
|
||||||
state[j] += value;
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
function hasMoreSegments(mappings, i) {
|
|
||||||
if (i >= mappings.length)
|
|
||||||
return false;
|
|
||||||
const c = mappings.charCodeAt(i);
|
|
||||||
if (c === comma || c === semicolon)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
function sort(line) {
|
|
||||||
line.sort(sortComparator$1);
|
|
||||||
}
|
|
||||||
function sortComparator$1(a, b) {
|
|
||||||
return a[0] - b[0];
|
|
||||||
}
|
|
||||||
function encode(decoded) {
|
|
||||||
const state = new Int32Array(5);
|
|
||||||
let buf = new Uint8Array(1024);
|
|
||||||
let pos = 0;
|
|
||||||
for (let i = 0; i < decoded.length; i++) {
|
|
||||||
const line = decoded[i];
|
|
||||||
if (i > 0) {
|
|
||||||
buf = reserve(buf, pos, 1);
|
|
||||||
buf[pos++] = semicolon;
|
|
||||||
}
|
|
||||||
if (line.length === 0)
|
|
||||||
continue;
|
|
||||||
state[0] = 0;
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const segment = line[j];
|
|
||||||
// We can push up to 5 ints, each int can take at most 7 chars, and we
|
|
||||||
// may push a comma.
|
|
||||||
buf = reserve(buf, pos, 36);
|
|
||||||
if (j > 0)
|
|
||||||
buf[pos++] = comma;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 0); // generatedCodeColumn
|
|
||||||
if (segment.length === 1)
|
|
||||||
continue;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 1); // sourceFileIndex
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 2); // sourceCodeLine
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 3); // sourceCodeColumn
|
|
||||||
if (segment.length === 4)
|
|
||||||
continue;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 4); // nameIndex
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return td.decode(buf.subarray(0, pos));
|
|
||||||
}
|
|
||||||
function reserve(buf, pos, count) {
|
|
||||||
if (buf.length > pos + count)
|
|
||||||
return buf;
|
|
||||||
const swap = new Uint8Array(buf.length * 2);
|
|
||||||
swap.set(buf);
|
|
||||||
return swap;
|
|
||||||
}
|
|
||||||
function encodeInteger(buf, pos, state, segment, j) {
|
|
||||||
const next = segment[j];
|
|
||||||
let num = next - state[j];
|
|
||||||
state[j] = next;
|
|
||||||
num = num < 0 ? (-num << 1) | 1 : num << 1;
|
|
||||||
do {
|
|
||||||
let clamped = num & 0b011111;
|
|
||||||
num >>>= 5;
|
|
||||||
if (num > 0)
|
|
||||||
clamped |= 0b100000;
|
|
||||||
buf[pos++] = intToChar[clamped];
|
|
||||||
} while (num > 0);
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Matches the scheme of a URL, eg "http://"
|
|
||||||
const schemeRegex = /^[\w+.-]+:\/\//;
|
|
||||||
/**
|
|
||||||
* Matches the parts of a URL:
|
|
||||||
* 1. Scheme, including ":", guaranteed.
|
|
||||||
* 2. User/password, including "@", optional.
|
|
||||||
* 3. Host, guaranteed.
|
|
||||||
* 4. Port, including ":", optional.
|
|
||||||
* 5. Path, including "/", optional.
|
|
||||||
*/
|
|
||||||
const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?/;
|
|
||||||
/**
|
|
||||||
* File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start
|
|
||||||
* with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).
|
|
||||||
*
|
|
||||||
* 1. Host, optional.
|
|
||||||
* 2. Path, which may inclue "/", guaranteed.
|
|
||||||
*/
|
|
||||||
const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/]*)?)?(\/?.*)/i;
|
|
||||||
function isAbsoluteUrl(input) {
|
|
||||||
return schemeRegex.test(input);
|
|
||||||
}
|
|
||||||
function isSchemeRelativeUrl(input) {
|
|
||||||
return input.startsWith('//');
|
|
||||||
}
|
|
||||||
function isAbsolutePath(input) {
|
|
||||||
return input.startsWith('/');
|
|
||||||
}
|
|
||||||
function isFileUrl(input) {
|
|
||||||
return input.startsWith('file:');
|
|
||||||
}
|
|
||||||
function parseAbsoluteUrl(input) {
|
|
||||||
const match = urlRegex.exec(input);
|
|
||||||
return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/');
|
|
||||||
}
|
|
||||||
function parseFileUrl(input) {
|
|
||||||
const match = fileRegex.exec(input);
|
|
||||||
const path = match[2];
|
|
||||||
return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path);
|
|
||||||
}
|
|
||||||
function makeUrl(scheme, user, host, port, path) {
|
|
||||||
return {
|
|
||||||
scheme,
|
|
||||||
user,
|
|
||||||
host,
|
|
||||||
port,
|
|
||||||
path,
|
|
||||||
relativePath: false,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function parseUrl(input) {
|
|
||||||
if (isSchemeRelativeUrl(input)) {
|
|
||||||
const url = parseAbsoluteUrl('http:' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
if (isAbsolutePath(input)) {
|
|
||||||
const url = parseAbsoluteUrl('http://foo.com' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
url.host = '';
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
if (isFileUrl(input))
|
|
||||||
return parseFileUrl(input);
|
|
||||||
if (isAbsoluteUrl(input))
|
|
||||||
return parseAbsoluteUrl(input);
|
|
||||||
const url = parseAbsoluteUrl('http://foo.com/' + input);
|
|
||||||
url.scheme = '';
|
|
||||||
url.host = '';
|
|
||||||
url.relativePath = true;
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
function stripPathFilename(path) {
|
|
||||||
// If a path ends with a parent directory "..", then it's a relative path with excess parent
|
|
||||||
// paths. It's not a file, so we can't strip it.
|
|
||||||
if (path.endsWith('/..'))
|
|
||||||
return path;
|
|
||||||
const index = path.lastIndexOf('/');
|
|
||||||
return path.slice(0, index + 1);
|
|
||||||
}
|
|
||||||
function mergePaths(url, base) {
|
|
||||||
// If we're not a relative path, then we're an absolute path, and it doesn't matter what base is.
|
|
||||||
if (!url.relativePath)
|
|
||||||
return;
|
|
||||||
normalizePath(base);
|
|
||||||
// If the path is just a "/", then it was an empty path to begin with (remember, we're a relative
|
|
||||||
// path).
|
|
||||||
if (url.path === '/') {
|
|
||||||
url.path = base.path;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Resolution happens relative to the base path's directory, not the file.
|
|
||||||
url.path = stripPathFilename(base.path) + url.path;
|
|
||||||
}
|
|
||||||
// If the base path is absolute, then our path is now absolute too.
|
|
||||||
url.relativePath = base.relativePath;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* The path can have empty directories "//", unneeded parents "foo/..", or current directory
|
|
||||||
* "foo/.". We need to normalize to a standard representation.
|
|
||||||
*/
|
|
||||||
function normalizePath(url) {
|
|
||||||
const { relativePath } = url;
|
|
||||||
const pieces = url.path.split('/');
|
|
||||||
// We need to preserve the first piece always, so that we output a leading slash. The item at
|
|
||||||
// pieces[0] is an empty string.
|
|
||||||
let pointer = 1;
|
|
||||||
// Positive is the number of real directories we've output, used for popping a parent directory.
|
|
||||||
// Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo".
|
|
||||||
let positive = 0;
|
|
||||||
// We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will
|
|
||||||
// generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a
|
|
||||||
// real directory, we won't need to append, unless the other conditions happen again.
|
|
||||||
let addTrailingSlash = false;
|
|
||||||
for (let i = 1; i < pieces.length; i++) {
|
|
||||||
const piece = pieces[i];
|
|
||||||
// An empty directory, could be a trailing slash, or just a double "//" in the path.
|
|
||||||
if (!piece) {
|
|
||||||
addTrailingSlash = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// If we encounter a real directory, then we don't need to append anymore.
|
|
||||||
addTrailingSlash = false;
|
|
||||||
// A current directory, which we can always drop.
|
|
||||||
if (piece === '.')
|
|
||||||
continue;
|
|
||||||
// A parent directory, we need to see if there are any real directories we can pop. Else, we
|
|
||||||
// have an excess of parents, and we'll need to keep the "..".
|
|
||||||
if (piece === '..') {
|
|
||||||
if (positive) {
|
|
||||||
addTrailingSlash = true;
|
|
||||||
positive--;
|
|
||||||
pointer--;
|
|
||||||
}
|
|
||||||
else if (relativePath) {
|
|
||||||
// If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute
|
|
||||||
// URL, protocol relative URL, or an absolute path, we don't need to keep excess.
|
|
||||||
pieces[pointer++] = piece;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// We've encountered a real directory. Move it to the next insertion pointer, which accounts for
|
|
||||||
// any popped or dropped directories.
|
|
||||||
pieces[pointer++] = piece;
|
|
||||||
positive++;
|
|
||||||
}
|
|
||||||
let path = '';
|
|
||||||
for (let i = 1; i < pointer; i++) {
|
|
||||||
path += '/' + pieces[i];
|
|
||||||
}
|
|
||||||
if (!path || (addTrailingSlash && !path.endsWith('/..'))) {
|
|
||||||
path += '/';
|
|
||||||
}
|
|
||||||
url.path = path;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Attempts to resolve `input` URL/path relative to `base`.
|
|
||||||
*/
|
|
||||||
function resolve$1(input, base) {
|
|
||||||
if (!input && !base)
|
|
||||||
return '';
|
|
||||||
const url = parseUrl(input);
|
|
||||||
// If we have a base, and the input isn't already an absolute URL, then we need to merge.
|
|
||||||
if (base && !url.scheme) {
|
|
||||||
const baseUrl = parseUrl(base);
|
|
||||||
url.scheme = baseUrl.scheme;
|
|
||||||
// If there's no host, then we were just a path.
|
|
||||||
if (!url.host) {
|
|
||||||
// The host, user, and port are joined, you can't copy one without the others.
|
|
||||||
url.user = baseUrl.user;
|
|
||||||
url.host = baseUrl.host;
|
|
||||||
url.port = baseUrl.port;
|
|
||||||
}
|
|
||||||
mergePaths(url, baseUrl);
|
|
||||||
}
|
|
||||||
normalizePath(url);
|
|
||||||
// If the input (and base, if there was one) are both relative, then we need to output a relative.
|
|
||||||
if (url.relativePath) {
|
|
||||||
// The first char is always a "/".
|
|
||||||
const path = url.path.slice(1);
|
|
||||||
if (!path)
|
|
||||||
return '.';
|
|
||||||
// If base started with a leading ".", or there is no base and input started with a ".", then we
|
|
||||||
// need to ensure that the relative path starts with a ".". We don't know if relative starts
|
|
||||||
// with a "..", though, so check before prepending.
|
|
||||||
const keepRelative = (base || input).startsWith('.');
|
|
||||||
return !keepRelative || path.startsWith('.') ? path : './' + path;
|
|
||||||
}
|
|
||||||
// If there's no host (and no scheme/user/port), then we need to output an absolute path.
|
|
||||||
if (!url.scheme && !url.host)
|
|
||||||
return url.path;
|
|
||||||
// We're outputting either an absolute URL, or a protocol relative one.
|
|
||||||
return `${url.scheme}//${url.user}${url.host}${url.port}${url.path}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolve(input, base) {
|
|
||||||
// The base is always treated as a directory, if it's not empty.
|
|
||||||
// https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327
|
|
||||||
// https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401
|
|
||||||
if (base && !base.endsWith('/'))
|
|
||||||
base += '/';
|
|
||||||
return resolve$1(input, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes everything after the last "/", but leaves the slash.
|
|
||||||
*/
|
|
||||||
function stripFilename(path) {
|
|
||||||
if (!path)
|
|
||||||
return '';
|
|
||||||
const index = path.lastIndexOf('/');
|
|
||||||
return path.slice(0, index + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const COLUMN$1 = 0;
|
|
||||||
const SOURCES_INDEX$1 = 1;
|
|
||||||
const SOURCE_LINE$1 = 2;
|
|
||||||
const SOURCE_COLUMN$1 = 3;
|
|
||||||
const NAMES_INDEX$1 = 4;
|
|
||||||
|
|
||||||
function maybeSort(mappings, owned) {
|
|
||||||
const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);
|
|
||||||
if (unsortedIndex === mappings.length)
|
|
||||||
return mappings;
|
|
||||||
// If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If
|
|
||||||
// not, we do not want to modify the consumer's input array.
|
|
||||||
if (!owned)
|
|
||||||
mappings = mappings.slice();
|
|
||||||
for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {
|
|
||||||
mappings[i] = sortSegments(mappings[i], owned);
|
|
||||||
}
|
|
||||||
return mappings;
|
|
||||||
}
|
|
||||||
function nextUnsortedSegmentLine(mappings, start) {
|
|
||||||
for (let i = start; i < mappings.length; i++) {
|
|
||||||
if (!isSorted(mappings[i]))
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return mappings.length;
|
|
||||||
}
|
|
||||||
function isSorted(line) {
|
|
||||||
for (let j = 1; j < line.length; j++) {
|
|
||||||
if (line[j][COLUMN$1] < line[j - 1][COLUMN$1]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
function sortSegments(line, owned) {
|
|
||||||
if (!owned)
|
|
||||||
line = line.slice();
|
|
||||||
return line.sort(sortComparator);
|
|
||||||
}
|
|
||||||
function sortComparator(a, b) {
|
|
||||||
return a[COLUMN$1] - b[COLUMN$1];
|
|
||||||
}
|
|
||||||
|
|
||||||
let found = false;
|
|
||||||
/**
|
|
||||||
* A binary search implementation that returns the index if a match is found.
|
|
||||||
* If no match is found, then the left-index (the index associated with the item that comes just
|
|
||||||
* before the desired index) is returned. To maintain proper sort order, a splice would happen at
|
|
||||||
* the next index:
|
|
||||||
*
|
|
||||||
* ```js
|
|
||||||
* const array = [1, 3];
|
|
||||||
* const needle = 2;
|
|
||||||
* const index = binarySearch(array, needle, (item, needle) => item - needle);
|
|
||||||
*
|
|
||||||
* assert.equal(index, 0);
|
|
||||||
* array.splice(index + 1, 0, needle);
|
|
||||||
* assert.deepEqual(array, [1, 2, 3]);
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
function binarySearch(haystack, needle, low, high) {
|
|
||||||
while (low <= high) {
|
|
||||||
const mid = low + ((high - low) >> 1);
|
|
||||||
const cmp = haystack[mid][COLUMN$1] - needle;
|
|
||||||
if (cmp === 0) {
|
|
||||||
found = true;
|
|
||||||
return mid;
|
|
||||||
}
|
|
||||||
if (cmp < 0) {
|
|
||||||
low = mid + 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
high = mid - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
found = false;
|
|
||||||
return low - 1;
|
|
||||||
}
|
|
||||||
function upperBound(haystack, needle, index) {
|
|
||||||
for (let i = index + 1; i < haystack.length; i++, index++) {
|
|
||||||
if (haystack[i][COLUMN$1] !== needle)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function lowerBound(haystack, needle, index) {
|
|
||||||
for (let i = index - 1; i >= 0; i--, index--) {
|
|
||||||
if (haystack[i][COLUMN$1] !== needle)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function memoizedState() {
|
|
||||||
return {
|
|
||||||
lastKey: -1,
|
|
||||||
lastNeedle: -1,
|
|
||||||
lastIndex: -1,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This overly complicated beast is just to record the last tested line/column and the resulting
|
|
||||||
* index, allowing us to skip a few tests if mappings are monotonically increasing.
|
|
||||||
*/
|
|
||||||
function memoizedBinarySearch(haystack, needle, state, key) {
|
|
||||||
const { lastKey, lastNeedle, lastIndex } = state;
|
|
||||||
let low = 0;
|
|
||||||
let high = haystack.length - 1;
|
|
||||||
if (key === lastKey) {
|
|
||||||
if (needle === lastNeedle) {
|
|
||||||
found = lastIndex !== -1 && haystack[lastIndex][COLUMN$1] === needle;
|
|
||||||
return lastIndex;
|
|
||||||
}
|
|
||||||
if (needle >= lastNeedle) {
|
|
||||||
// lastIndex may be -1 if the previous needle was not found.
|
|
||||||
low = lastIndex === -1 ? 0 : lastIndex;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
high = lastIndex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state.lastKey = key;
|
|
||||||
state.lastNeedle = needle;
|
|
||||||
return (state.lastIndex = binarySearch(haystack, needle, low, high));
|
|
||||||
}
|
|
||||||
|
|
||||||
const AnyMap = function (map, mapUrl) {
|
|
||||||
const parsed = typeof map === 'string' ? JSON.parse(map) : map;
|
|
||||||
if (!('sections' in parsed))
|
|
||||||
return new TraceMap(parsed, mapUrl);
|
|
||||||
const mappings = [];
|
|
||||||
const sources = [];
|
|
||||||
const sourcesContent = [];
|
|
||||||
const names = [];
|
|
||||||
const { sections } = parsed;
|
|
||||||
let i = 0;
|
|
||||||
for (; i < sections.length - 1; i++) {
|
|
||||||
const no = sections[i + 1].offset;
|
|
||||||
addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, no.line, no.column);
|
|
||||||
}
|
|
||||||
if (sections.length > 0) {
|
|
||||||
addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, Infinity, Infinity);
|
|
||||||
}
|
|
||||||
const joined = {
|
|
||||||
version: 3,
|
|
||||||
file: parsed.file,
|
|
||||||
names,
|
|
||||||
sources,
|
|
||||||
sourcesContent,
|
|
||||||
mappings,
|
|
||||||
};
|
|
||||||
return presortedDecodedMap(joined);
|
|
||||||
};
|
|
||||||
function addSection(section, mapUrl, mappings, sources, sourcesContent, names, stopLine, stopColumn) {
|
|
||||||
const map = AnyMap(section.map, mapUrl);
|
|
||||||
const { line: lineOffset, column: columnOffset } = section.offset;
|
|
||||||
const sourcesOffset = sources.length;
|
|
||||||
const namesOffset = names.length;
|
|
||||||
const decoded = decodedMappings(map);
|
|
||||||
const { resolvedSources } = map;
|
|
||||||
append(sources, resolvedSources);
|
|
||||||
append(sourcesContent, map.sourcesContent || fillSourcesContent(resolvedSources.length));
|
|
||||||
append(names, map.names);
|
|
||||||
// If this section jumps forwards several lines, we need to add lines to the output mappings catch up.
|
|
||||||
for (let i = mappings.length; i <= lineOffset; i++)
|
|
||||||
mappings.push([]);
|
|
||||||
// We can only add so many lines before we step into the range that the next section's map
|
|
||||||
// controls. When we get to the last line, then we'll start checking the segments to see if
|
|
||||||
// they've crossed into the column range.
|
|
||||||
const stopI = stopLine - lineOffset;
|
|
||||||
const len = Math.min(decoded.length, stopI + 1);
|
|
||||||
for (let i = 0; i < len; i++) {
|
|
||||||
const line = decoded[i];
|
|
||||||
// On the 0th loop, the line will already exist due to a previous section, or the line catch up
|
|
||||||
// loop above.
|
|
||||||
const out = i === 0 ? mappings[lineOffset] : (mappings[lineOffset + i] = []);
|
|
||||||
// On the 0th loop, the section's column offset shifts us forward. On all other lines (since the
|
|
||||||
// map can be multiple lines), it doesn't.
|
|
||||||
const cOffset = i === 0 ? columnOffset : 0;
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const seg = line[j];
|
|
||||||
const column = cOffset + seg[COLUMN$1];
|
|
||||||
// If this segment steps into the column range that the next section's map controls, we need
|
|
||||||
// to stop early.
|
|
||||||
if (i === stopI && column >= stopColumn)
|
|
||||||
break;
|
|
||||||
if (seg.length === 1) {
|
|
||||||
out.push([column]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX$1];
|
|
||||||
const sourceLine = seg[SOURCE_LINE$1];
|
|
||||||
const sourceColumn = seg[SOURCE_COLUMN$1];
|
|
||||||
if (seg.length === 4) {
|
|
||||||
out.push([column, sourcesIndex, sourceLine, sourceColumn]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.push([column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX$1]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function append(arr, other) {
|
|
||||||
for (let i = 0; i < other.length; i++)
|
|
||||||
arr.push(other[i]);
|
|
||||||
}
|
|
||||||
// Sourcemaps don't need to have sourcesContent, and if they don't, we need to create an array of
|
|
||||||
// equal length to the sources. This is because the sources and sourcesContent are paired arrays,
|
|
||||||
// where `sourcesContent[i]` is the content of the `sources[i]` file. If we didn't, then joined
|
|
||||||
// sourcemap would desynchronize the sources/contents.
|
|
||||||
function fillSourcesContent(len) {
|
|
||||||
const sourcesContent = [];
|
|
||||||
for (let i = 0; i < len; i++)
|
|
||||||
sourcesContent[i] = null;
|
|
||||||
return sourcesContent;
|
|
||||||
}
|
|
||||||
|
|
||||||
const INVALID_ORIGINAL_MAPPING = Object.freeze({
|
|
||||||
source: null,
|
|
||||||
line: null,
|
|
||||||
column: null,
|
|
||||||
name: null,
|
|
||||||
});
|
|
||||||
Object.freeze({
|
|
||||||
line: null,
|
|
||||||
column: null,
|
|
||||||
});
|
|
||||||
const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';
|
|
||||||
const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';
|
|
||||||
const LEAST_UPPER_BOUND = -1;
|
|
||||||
const GREATEST_LOWER_BOUND = 1;
|
|
||||||
/**
|
|
||||||
* Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.
|
|
||||||
*/
|
|
||||||
let decodedMappings;
|
|
||||||
/**
|
|
||||||
* A higher-level API to find the source/line/column associated with a generated line/column
|
|
||||||
* (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in
|
|
||||||
* `source-map` library.
|
|
||||||
*/
|
|
||||||
let originalPositionFor;
|
|
||||||
/**
|
|
||||||
* A helper that skips sorting of the input map's mappings array, which can be expensive for larger
|
|
||||||
* maps.
|
|
||||||
*/
|
|
||||||
let presortedDecodedMap;
|
|
||||||
class TraceMap {
|
|
||||||
constructor(map, mapUrl) {
|
|
||||||
this._decodedMemo = memoizedState();
|
|
||||||
this._bySources = undefined;
|
|
||||||
this._bySourceMemos = undefined;
|
|
||||||
const isString = typeof map === 'string';
|
|
||||||
if (!isString && map.constructor === TraceMap)
|
|
||||||
return map;
|
|
||||||
const parsed = (isString ? JSON.parse(map) : map);
|
|
||||||
const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
|
|
||||||
this.version = version;
|
|
||||||
this.file = file;
|
|
||||||
this.names = names;
|
|
||||||
this.sourceRoot = sourceRoot;
|
|
||||||
this.sources = sources;
|
|
||||||
this.sourcesContent = sourcesContent;
|
|
||||||
if (sourceRoot || mapUrl) {
|
|
||||||
const from = resolve(sourceRoot || '', stripFilename(mapUrl));
|
|
||||||
this.resolvedSources = sources.map((s) => resolve(s || '', from));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.resolvedSources = sources.map((s) => s || '');
|
|
||||||
}
|
|
||||||
const { mappings } = parsed;
|
|
||||||
if (typeof mappings === 'string') {
|
|
||||||
this._encoded = mappings;
|
|
||||||
this._decoded = undefined;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this._encoded = undefined;
|
|
||||||
this._decoded = maybeSort(mappings, isString);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
decodedMappings = (map) => {
|
|
||||||
return (map._decoded || (map._decoded = decode(map._encoded)));
|
|
||||||
};
|
|
||||||
originalPositionFor = (map, { line, column, bias }) => {
|
|
||||||
line--;
|
|
||||||
if (line < 0)
|
|
||||||
throw new Error(LINE_GTR_ZERO);
|
|
||||||
if (column < 0)
|
|
||||||
throw new Error(COL_GTR_EQ_ZERO);
|
|
||||||
const decoded = decodedMappings(map);
|
|
||||||
// It's common for parent source maps to have pointers to lines that have no
|
|
||||||
// mapping (like a "//# sourceMappingURL=") at the end of the child file.
|
|
||||||
if (line >= decoded.length)
|
|
||||||
return INVALID_ORIGINAL_MAPPING;
|
|
||||||
const segment = traceSegmentInternal(decoded[line], map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
|
|
||||||
if (segment == null)
|
|
||||||
return INVALID_ORIGINAL_MAPPING;
|
|
||||||
if (segment.length == 1)
|
|
||||||
return INVALID_ORIGINAL_MAPPING;
|
|
||||||
const { names, resolvedSources } = map;
|
|
||||||
return {
|
|
||||||
source: resolvedSources[segment[SOURCES_INDEX$1]],
|
|
||||||
line: segment[SOURCE_LINE$1] + 1,
|
|
||||||
column: segment[SOURCE_COLUMN$1],
|
|
||||||
name: segment.length === 5 ? names[segment[NAMES_INDEX$1]] : null,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
presortedDecodedMap = (map, mapUrl) => {
|
|
||||||
const clone = Object.assign({}, map);
|
|
||||||
clone.mappings = [];
|
|
||||||
const tracer = new TraceMap(clone, mapUrl);
|
|
||||||
tracer._decoded = map.mappings;
|
|
||||||
return tracer;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
function traceSegmentInternal(segments, memo, line, column, bias) {
|
|
||||||
let index = memoizedBinarySearch(segments, column, memo, line);
|
|
||||||
if (found) {
|
|
||||||
index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);
|
|
||||||
}
|
|
||||||
else if (bias === LEAST_UPPER_BOUND)
|
|
||||||
index++;
|
|
||||||
if (index === -1 || index === segments.length)
|
|
||||||
return null;
|
|
||||||
return segments[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the index associated with `key` in the backing array, if it is already present.
|
|
||||||
*/
|
|
||||||
let get;
|
|
||||||
/**
|
|
||||||
* Puts `key` into the backing array, if it is not already present. Returns
|
|
||||||
* the index of the `key` in the backing array.
|
|
||||||
*/
|
|
||||||
let put;
|
|
||||||
/**
|
|
||||||
* SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
|
|
||||||
* index of the `key` in the backing array.
|
|
||||||
*
|
|
||||||
* This is designed to allow synchronizing a second array with the contents of the backing array,
|
|
||||||
* like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
|
|
||||||
* and there are never duplicates.
|
|
||||||
*/
|
|
||||||
class SetArray {
|
|
||||||
constructor() {
|
|
||||||
this._indexes = { __proto__: null };
|
|
||||||
this.array = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
get = (strarr, key) => strarr._indexes[key];
|
|
||||||
put = (strarr, key) => {
|
|
||||||
// The key may or may not be present. If it is present, it's a number.
|
|
||||||
const index = get(strarr, key);
|
|
||||||
if (index !== undefined)
|
|
||||||
return index;
|
|
||||||
const { array, _indexes: indexes } = strarr;
|
|
||||||
return (indexes[key] = array.push(key) - 1);
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
const COLUMN = 0;
|
|
||||||
const SOURCES_INDEX = 1;
|
|
||||||
const SOURCE_LINE = 2;
|
|
||||||
const SOURCE_COLUMN = 3;
|
|
||||||
const NAMES_INDEX = 4;
|
|
||||||
|
|
||||||
const NO_NAME = -1;
|
|
||||||
/**
|
|
||||||
* Same as `addMapping`, but will only add the mapping if it generates useful information in the
|
|
||||||
* resulting map. This only works correctly if mappings are added **in order**, meaning you should
|
|
||||||
* not add a mapping with a lower generated line/column than one that came before.
|
|
||||||
*/
|
|
||||||
let maybeAddMapping;
|
|
||||||
/**
|
|
||||||
* Adds/removes the content of the source file to the source map.
|
|
||||||
*/
|
|
||||||
let setSourceContent;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
let toDecodedMap;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
let toEncodedMap;
|
|
||||||
// This split declaration is only so that terser can elminiate the static initialization block.
|
|
||||||
let addSegmentInternal;
|
|
||||||
/**
|
|
||||||
* Provides the state to generate a sourcemap.
|
|
||||||
*/
|
|
||||||
class GenMapping {
|
|
||||||
constructor({ file, sourceRoot } = {}) {
|
|
||||||
this._names = new SetArray();
|
|
||||||
this._sources = new SetArray();
|
|
||||||
this._sourcesContent = [];
|
|
||||||
this._mappings = [];
|
|
||||||
this.file = file;
|
|
||||||
this.sourceRoot = sourceRoot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
maybeAddMapping = (map, mapping) => {
|
|
||||||
return addMappingInternal(true, map, mapping);
|
|
||||||
};
|
|
||||||
setSourceContent = (map, source, content) => {
|
|
||||||
const { _sources: sources, _sourcesContent: sourcesContent } = map;
|
|
||||||
sourcesContent[put(sources, source)] = content;
|
|
||||||
};
|
|
||||||
toDecodedMap = (map) => {
|
|
||||||
const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
|
|
||||||
removeEmptyFinalLines(mappings);
|
|
||||||
return {
|
|
||||||
version: 3,
|
|
||||||
file: file || undefined,
|
|
||||||
names: names.array,
|
|
||||||
sourceRoot: sourceRoot || undefined,
|
|
||||||
sources: sources.array,
|
|
||||||
sourcesContent,
|
|
||||||
mappings,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
toEncodedMap = (map) => {
|
|
||||||
const decoded = toDecodedMap(map);
|
|
||||||
return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });
|
|
||||||
};
|
|
||||||
// Internal helpers
|
|
||||||
addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {
|
|
||||||
const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
|
|
||||||
const line = getLine(mappings, genLine);
|
|
||||||
const index = getColumnIndex(line, genColumn);
|
|
||||||
if (!source) {
|
|
||||||
if (skipable && skipSourceless(line, index))
|
|
||||||
return;
|
|
||||||
return insert(line, index, [genColumn]);
|
|
||||||
}
|
|
||||||
const sourcesIndex = put(sources, source);
|
|
||||||
const namesIndex = name ? put(names, name) : NO_NAME;
|
|
||||||
if (sourcesIndex === sourcesContent.length)
|
|
||||||
sourcesContent[sourcesIndex] = null;
|
|
||||||
if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return insert(line, index, name
|
|
||||||
? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
|
|
||||||
: [genColumn, sourcesIndex, sourceLine, sourceColumn]);
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
function getLine(mappings, index) {
|
|
||||||
for (let i = mappings.length; i <= index; i++) {
|
|
||||||
mappings[i] = [];
|
|
||||||
}
|
|
||||||
return mappings[index];
|
|
||||||
}
|
|
||||||
function getColumnIndex(line, genColumn) {
|
|
||||||
let index = line.length;
|
|
||||||
for (let i = index - 1; i >= 0; index = i--) {
|
|
||||||
const current = line[i];
|
|
||||||
if (genColumn >= current[COLUMN])
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function insert(array, index, value) {
|
|
||||||
for (let i = array.length; i > index; i--) {
|
|
||||||
array[i] = array[i - 1];
|
|
||||||
}
|
|
||||||
array[index] = value;
|
|
||||||
}
|
|
||||||
function removeEmptyFinalLines(mappings) {
|
|
||||||
const { length } = mappings;
|
|
||||||
let len = length;
|
|
||||||
for (let i = len - 1; i >= 0; len = i, i--) {
|
|
||||||
if (mappings[i].length > 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (len < length)
|
|
||||||
mappings.length = len;
|
|
||||||
}
|
|
||||||
function skipSourceless(line, index) {
|
|
||||||
// The start of a line is already sourceless, so adding a sourceless segment to the beginning
|
|
||||||
// doesn't generate any useful information.
|
|
||||||
if (index === 0)
|
|
||||||
return true;
|
|
||||||
const prev = line[index - 1];
|
|
||||||
// If the previous segment is also sourceless, then adding another sourceless segment doesn't
|
|
||||||
// genrate any new information. Else, this segment will end the source/named segment and point to
|
|
||||||
// a sourceless position, which is useful.
|
|
||||||
return prev.length === 1;
|
|
||||||
}
|
|
||||||
function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {
|
|
||||||
// A source/named segment at the start of a line gives position at that genColumn
|
|
||||||
if (index === 0)
|
|
||||||
return false;
|
|
||||||
const prev = line[index - 1];
|
|
||||||
// If the previous segment is sourceless, then we're transitioning to a source.
|
|
||||||
if (prev.length === 1)
|
|
||||||
return false;
|
|
||||||
// If the previous segment maps to the exact same source position, then this segment doesn't
|
|
||||||
// provide any new position information.
|
|
||||||
return (sourcesIndex === prev[SOURCES_INDEX] &&
|
|
||||||
sourceLine === prev[SOURCE_LINE] &&
|
|
||||||
sourceColumn === prev[SOURCE_COLUMN] &&
|
|
||||||
namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));
|
|
||||||
}
|
|
||||||
function addMappingInternal(skipable, map, mapping) {
|
|
||||||
const { generated, source, original, name } = mapping;
|
|
||||||
if (!source) {
|
|
||||||
return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null);
|
|
||||||
}
|
|
||||||
const s = source;
|
|
||||||
return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
class SourceMapConsumer {
|
|
||||||
constructor(map, mapUrl) {
|
|
||||||
const trace = (this._map = new AnyMap(map, mapUrl));
|
|
||||||
this.file = trace.file;
|
|
||||||
this.names = trace.names;
|
|
||||||
this.sourceRoot = trace.sourceRoot;
|
|
||||||
this.sources = trace.resolvedSources;
|
|
||||||
this.sourcesContent = trace.sourcesContent;
|
|
||||||
}
|
|
||||||
originalPositionFor(needle) {
|
|
||||||
return originalPositionFor(this._map, needle);
|
|
||||||
}
|
|
||||||
destroy() {
|
|
||||||
// noop.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class SourceMapGenerator {
|
|
||||||
constructor(opts) {
|
|
||||||
this._map = new GenMapping(opts);
|
|
||||||
}
|
|
||||||
addMapping(mapping) {
|
|
||||||
maybeAddMapping(this._map, mapping);
|
|
||||||
}
|
|
||||||
setSourceContent(source, content) {
|
|
||||||
setSourceContent(this._map, source, content);
|
|
||||||
}
|
|
||||||
toJSON() {
|
|
||||||
return toEncodedMap(this._map);
|
|
||||||
}
|
|
||||||
toDecodedMap() {
|
|
||||||
return toDecodedMap(this._map);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.SourceMapConsumer = SourceMapConsumer;
|
|
||||||
exports.SourceMapGenerator = SourceMapGenerator;
|
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
|
||||||
|
|
||||||
}));
|
|
||||||
//# sourceMappingURL=source-map.umd.js.map
|
|
1
node_modules/@jridgewell/source-map/dist/source-map.umd.js.map
generated
vendored
1
node_modules/@jridgewell/source-map/dist/source-map.umd.js.map
generated
vendored
File diff suppressed because one or more lines are too long
25
node_modules/@jridgewell/source-map/dist/types/source-map.d.ts
generated
vendored
25
node_modules/@jridgewell/source-map/dist/types/source-map.d.ts
generated
vendored
@ -1,25 +0,0 @@
|
|||||||
import { AnyMap, originalPositionFor } from '@jridgewell/trace-mapping';
|
|
||||||
import { GenMapping, maybeAddMapping, toDecodedMap, toEncodedMap, setSourceContent } from '@jridgewell/gen-mapping';
|
|
||||||
import type { TraceMap, SectionedSourceMapInput } from '@jridgewell/trace-mapping';
|
|
||||||
export type { TraceMap, SectionedSourceMapInput };
|
|
||||||
import type { Mapping, EncodedSourceMap, DecodedSourceMap } from '@jridgewell/gen-mapping';
|
|
||||||
export type { Mapping, EncodedSourceMap, DecodedSourceMap };
|
|
||||||
export declare class SourceMapConsumer {
|
|
||||||
private _map;
|
|
||||||
file: TraceMap['file'];
|
|
||||||
names: TraceMap['names'];
|
|
||||||
sourceRoot: TraceMap['sourceRoot'];
|
|
||||||
sources: TraceMap['sources'];
|
|
||||||
sourcesContent: TraceMap['sourcesContent'];
|
|
||||||
constructor(map: ConstructorParameters<typeof AnyMap>[0], mapUrl: Parameters<typeof AnyMap>[1]);
|
|
||||||
originalPositionFor(needle: Parameters<typeof originalPositionFor>[1]): ReturnType<typeof originalPositionFor>;
|
|
||||||
destroy(): void;
|
|
||||||
}
|
|
||||||
export declare class SourceMapGenerator {
|
|
||||||
private _map;
|
|
||||||
constructor(opts: ConstructorParameters<typeof GenMapping>[0]);
|
|
||||||
addMapping(mapping: Parameters<typeof maybeAddMapping>[1]): ReturnType<typeof maybeAddMapping>;
|
|
||||||
setSourceContent(source: Parameters<typeof setSourceContent>[1], content: Parameters<typeof setSourceContent>[2]): ReturnType<typeof setSourceContent>;
|
|
||||||
toJSON(): ReturnType<typeof toEncodedMap>;
|
|
||||||
toDecodedMap(): ReturnType<typeof toDecodedMap>;
|
|
||||||
}
|
|
71
node_modules/@jridgewell/source-map/package.json
generated
vendored
71
node_modules/@jridgewell/source-map/package.json
generated
vendored
@ -1,71 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@jridgewell/source-map",
|
|
||||||
"version": "0.3.5",
|
|
||||||
"description": "Packages @jridgewell/trace-mapping and @jridgewell/gen-mapping into the familiar source-map API",
|
|
||||||
"keywords": [
|
|
||||||
"sourcemap",
|
|
||||||
"source",
|
|
||||||
"map"
|
|
||||||
],
|
|
||||||
"author": "Justin Ridgewell <justin@ridgewell.name>",
|
|
||||||
"license": "MIT",
|
|
||||||
"repository": "https://github.com/jridgewell/source-map",
|
|
||||||
"main": "dist/source-map.umd.js",
|
|
||||||
"module": "dist/source-map.mjs",
|
|
||||||
"types": "dist/types/source-map.d.ts",
|
|
||||||
"exports": {
|
|
||||||
".": [
|
|
||||||
{
|
|
||||||
"types": "./dist/types/source-map.d.ts",
|
|
||||||
"browser": "./dist/source-map.umd.js",
|
|
||||||
"require": "./dist/source-map.umd.js",
|
|
||||||
"import": "./dist/source-map.mjs"
|
|
||||||
},
|
|
||||||
"./dist/source-map.umd.js"
|
|
||||||
],
|
|
||||||
"./package.json": "./package.json"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"dist"
|
|
||||||
],
|
|
||||||
"scripts": {
|
|
||||||
"prebuild": "rm -rf dist",
|
|
||||||
"build": "run-s -n build:*",
|
|
||||||
"build:rollup": "rollup -c rollup.config.js",
|
|
||||||
"build:ts": "tsc --project tsconfig.build.json",
|
|
||||||
"lint": "run-s -n lint:*",
|
|
||||||
"lint:prettier": "npm run test:lint:prettier -- --write",
|
|
||||||
"lint:ts": "npm run test:lint:ts -- --fix",
|
|
||||||
"pretest": "run-s build:rollup",
|
|
||||||
"test": "run-s -n test:lint test:only",
|
|
||||||
"test:debug": "mocha --inspect-brk",
|
|
||||||
"test:lint": "run-s -n test:lint:*",
|
|
||||||
"test:lint:prettier": "prettier --check '{src,test}/**/*.ts'",
|
|
||||||
"test:lint:ts": "eslint '{src,test}/**/*.ts'",
|
|
||||||
"test:only": "mocha",
|
|
||||||
"test:coverage": "c8 mocha",
|
|
||||||
"test:watch": "mocha --watch",
|
|
||||||
"prepublishOnly": "npm run preversion",
|
|
||||||
"preversion": "run-s test build"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@rollup/plugin-node-resolve": "13.2.1",
|
|
||||||
"@rollup/plugin-typescript": "8.3.0",
|
|
||||||
"@types/mocha": "9.1.1",
|
|
||||||
"@types/node": "17.0.30",
|
|
||||||
"@typescript-eslint/eslint-plugin": "5.10.0",
|
|
||||||
"@typescript-eslint/parser": "5.10.0",
|
|
||||||
"c8": "7.11.0",
|
|
||||||
"eslint": "8.7.0",
|
|
||||||
"eslint-config-prettier": "8.3.0",
|
|
||||||
"mocha": "9.2.0",
|
|
||||||
"npm-run-all": "4.1.5",
|
|
||||||
"prettier": "2.5.1",
|
|
||||||
"rollup": "2.66.0",
|
|
||||||
"typescript": "4.5.5"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@jridgewell/gen-mapping": "^0.3.0",
|
|
||||||
"@jridgewell/trace-mapping": "^0.3.9"
|
|
||||||
}
|
|
||||||
}
|
|
21
node_modules/@jridgewell/sourcemap-codec/LICENSE
generated
vendored
21
node_modules/@jridgewell/sourcemap-codec/LICENSE
generated
vendored
@ -1,21 +0,0 @@
|
|||||||
The MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2015 Rich Harris
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
200
node_modules/@jridgewell/sourcemap-codec/README.md
generated
vendored
200
node_modules/@jridgewell/sourcemap-codec/README.md
generated
vendored
@ -1,200 +0,0 @@
|
|||||||
# @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Encode/decode the `mappings` property of a [sourcemap](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit).
|
|
||||||
|
|
||||||
|
|
||||||
## Why?
|
|
||||||
|
|
||||||
Sourcemaps are difficult to generate and manipulate, because the `mappings` property – the part that actually links the generated code back to the original source – is encoded using an obscure method called [Variable-length quantity](https://en.wikipedia.org/wiki/Variable-length_quantity). On top of that, each segment in the mapping contains offsets rather than absolute indices, which means that you can't look at a segment in isolation – you have to understand the whole sourcemap.
|
|
||||||
|
|
||||||
This package makes the process slightly easier.
|
|
||||||
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install @jridgewell/sourcemap-codec
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```js
|
|
||||||
import { encode, decode } from '@jridgewell/sourcemap-codec';
|
|
||||||
|
|
||||||
var decoded = decode( ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' );
|
|
||||||
|
|
||||||
assert.deepEqual( decoded, [
|
|
||||||
// the first line (of the generated code) has no mappings,
|
|
||||||
// as shown by the starting semi-colon (which separates lines)
|
|
||||||
[],
|
|
||||||
|
|
||||||
// the second line contains four (comma-separated) segments
|
|
||||||
[
|
|
||||||
// segments are encoded as you'd expect:
|
|
||||||
// [ generatedCodeColumn, sourceIndex, sourceCodeLine, sourceCodeColumn, nameIndex ]
|
|
||||||
|
|
||||||
// i.e. the first segment begins at column 2, and maps back to the second column
|
|
||||||
// of the second line (both zero-based) of the 0th source, and uses the 0th
|
|
||||||
// name in the `map.names` array
|
|
||||||
[ 2, 0, 2, 2, 0 ],
|
|
||||||
|
|
||||||
// the remaining segments are 4-length rather than 5-length,
|
|
||||||
// because they don't map a name
|
|
||||||
[ 4, 0, 2, 4 ],
|
|
||||||
[ 6, 0, 2, 5 ],
|
|
||||||
[ 7, 0, 2, 7 ]
|
|
||||||
],
|
|
||||||
|
|
||||||
// the final line contains two segments
|
|
||||||
[
|
|
||||||
[ 2, 1, 10, 19 ],
|
|
||||||
[ 12, 1, 11, 20 ]
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
|
|
||||||
var encoded = encode( decoded );
|
|
||||||
assert.equal( encoded, ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' );
|
|
||||||
```
|
|
||||||
|
|
||||||
## Benchmarks
|
|
||||||
|
|
||||||
```
|
|
||||||
node v18.0.0
|
|
||||||
|
|
||||||
amp.js.map - 45120 segments
|
|
||||||
|
|
||||||
Decode Memory Usage:
|
|
||||||
@jridgewell/sourcemap-codec 5479160 bytes
|
|
||||||
sourcemap-codec 5659336 bytes
|
|
||||||
source-map-0.6.1 17144440 bytes
|
|
||||||
source-map-0.8.0 6867424 bytes
|
|
||||||
Smallest memory usage is @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Decode speed:
|
|
||||||
decode: @jridgewell/sourcemap-codec x 502 ops/sec ±1.03% (90 runs sampled)
|
|
||||||
decode: sourcemap-codec x 445 ops/sec ±0.97% (92 runs sampled)
|
|
||||||
decode: source-map-0.6.1 x 36.01 ops/sec ±1.64% (49 runs sampled)
|
|
||||||
decode: source-map-0.8.0 x 367 ops/sec ±0.04% (95 runs sampled)
|
|
||||||
Fastest is decode: @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Encode Memory Usage:
|
|
||||||
@jridgewell/sourcemap-codec 1261620 bytes
|
|
||||||
sourcemap-codec 9119248 bytes
|
|
||||||
source-map-0.6.1 8968560 bytes
|
|
||||||
source-map-0.8.0 8952952 bytes
|
|
||||||
Smallest memory usage is @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Encode speed:
|
|
||||||
encode: @jridgewell/sourcemap-codec x 738 ops/sec ±0.42% (98 runs sampled)
|
|
||||||
encode: sourcemap-codec x 238 ops/sec ±0.73% (88 runs sampled)
|
|
||||||
encode: source-map-0.6.1 x 162 ops/sec ±0.43% (84 runs sampled)
|
|
||||||
encode: source-map-0.8.0 x 191 ops/sec ±0.34% (90 runs sampled)
|
|
||||||
Fastest is encode: @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
|
|
||||||
babel.min.js.map - 347793 segments
|
|
||||||
|
|
||||||
Decode Memory Usage:
|
|
||||||
@jridgewell/sourcemap-codec 35338184 bytes
|
|
||||||
sourcemap-codec 35922736 bytes
|
|
||||||
source-map-0.6.1 62366360 bytes
|
|
||||||
source-map-0.8.0 44337416 bytes
|
|
||||||
Smallest memory usage is @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Decode speed:
|
|
||||||
decode: @jridgewell/sourcemap-codec x 40.35 ops/sec ±4.47% (54 runs sampled)
|
|
||||||
decode: sourcemap-codec x 36.76 ops/sec ±3.67% (51 runs sampled)
|
|
||||||
decode: source-map-0.6.1 x 4.44 ops/sec ±2.15% (16 runs sampled)
|
|
||||||
decode: source-map-0.8.0 x 59.35 ops/sec ±0.05% (78 runs sampled)
|
|
||||||
Fastest is decode: source-map-0.8.0
|
|
||||||
|
|
||||||
Encode Memory Usage:
|
|
||||||
@jridgewell/sourcemap-codec 7212604 bytes
|
|
||||||
sourcemap-codec 21421456 bytes
|
|
||||||
source-map-0.6.1 25286888 bytes
|
|
||||||
source-map-0.8.0 25498744 bytes
|
|
||||||
Smallest memory usage is @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Encode speed:
|
|
||||||
encode: @jridgewell/sourcemap-codec x 112 ops/sec ±0.13% (84 runs sampled)
|
|
||||||
encode: sourcemap-codec x 30.23 ops/sec ±2.76% (53 runs sampled)
|
|
||||||
encode: source-map-0.6.1 x 19.43 ops/sec ±3.70% (37 runs sampled)
|
|
||||||
encode: source-map-0.8.0 x 19.40 ops/sec ±3.26% (37 runs sampled)
|
|
||||||
Fastest is encode: @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
|
|
||||||
preact.js.map - 1992 segments
|
|
||||||
|
|
||||||
Decode Memory Usage:
|
|
||||||
@jridgewell/sourcemap-codec 500272 bytes
|
|
||||||
sourcemap-codec 516864 bytes
|
|
||||||
source-map-0.6.1 1596672 bytes
|
|
||||||
source-map-0.8.0 517272 bytes
|
|
||||||
Smallest memory usage is @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Decode speed:
|
|
||||||
decode: @jridgewell/sourcemap-codec x 16,137 ops/sec ±0.17% (99 runs sampled)
|
|
||||||
decode: sourcemap-codec x 12,139 ops/sec ±0.13% (99 runs sampled)
|
|
||||||
decode: source-map-0.6.1 x 1,264 ops/sec ±0.12% (100 runs sampled)
|
|
||||||
decode: source-map-0.8.0 x 9,894 ops/sec ±0.08% (101 runs sampled)
|
|
||||||
Fastest is decode: @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Encode Memory Usage:
|
|
||||||
@jridgewell/sourcemap-codec 321026 bytes
|
|
||||||
sourcemap-codec 830832 bytes
|
|
||||||
source-map-0.6.1 586608 bytes
|
|
||||||
source-map-0.8.0 586680 bytes
|
|
||||||
Smallest memory usage is @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Encode speed:
|
|
||||||
encode: @jridgewell/sourcemap-codec x 19,876 ops/sec ±0.78% (95 runs sampled)
|
|
||||||
encode: sourcemap-codec x 6,983 ops/sec ±0.15% (100 runs sampled)
|
|
||||||
encode: source-map-0.6.1 x 5,070 ops/sec ±0.12% (102 runs sampled)
|
|
||||||
encode: source-map-0.8.0 x 5,641 ops/sec ±0.17% (100 runs sampled)
|
|
||||||
Fastest is encode: @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
|
|
||||||
react.js.map - 5726 segments
|
|
||||||
|
|
||||||
Decode Memory Usage:
|
|
||||||
@jridgewell/sourcemap-codec 734848 bytes
|
|
||||||
sourcemap-codec 954200 bytes
|
|
||||||
source-map-0.6.1 2276432 bytes
|
|
||||||
source-map-0.8.0 955488 bytes
|
|
||||||
Smallest memory usage is @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Decode speed:
|
|
||||||
decode: @jridgewell/sourcemap-codec x 5,723 ops/sec ±0.12% (98 runs sampled)
|
|
||||||
decode: sourcemap-codec x 4,555 ops/sec ±0.09% (101 runs sampled)
|
|
||||||
decode: source-map-0.6.1 x 437 ops/sec ±0.11% (93 runs sampled)
|
|
||||||
decode: source-map-0.8.0 x 3,441 ops/sec ±0.15% (100 runs sampled)
|
|
||||||
Fastest is decode: @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Encode Memory Usage:
|
|
||||||
@jridgewell/sourcemap-codec 638672 bytes
|
|
||||||
sourcemap-codec 1109840 bytes
|
|
||||||
source-map-0.6.1 1321224 bytes
|
|
||||||
source-map-0.8.0 1324448 bytes
|
|
||||||
Smallest memory usage is @jridgewell/sourcemap-codec
|
|
||||||
|
|
||||||
Encode speed:
|
|
||||||
encode: @jridgewell/sourcemap-codec x 6,801 ops/sec ±0.48% (98 runs sampled)
|
|
||||||
encode: sourcemap-codec x 2,533 ops/sec ±0.13% (101 runs sampled)
|
|
||||||
encode: source-map-0.6.1 x 2,248 ops/sec ±0.08% (100 runs sampled)
|
|
||||||
encode: source-map-0.8.0 x 2,303 ops/sec ±0.15% (100 runs sampled)
|
|
||||||
Fastest is encode: @jridgewell/sourcemap-codec
|
|
||||||
```
|
|
||||||
|
|
||||||
# License
|
|
||||||
|
|
||||||
MIT
|
|
164
node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
generated
vendored
164
node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
generated
vendored
@ -1,164 +0,0 @@
|
|||||||
const comma = ','.charCodeAt(0);
|
|
||||||
const semicolon = ';'.charCodeAt(0);
|
|
||||||
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
||||||
const intToChar = new Uint8Array(64); // 64 possible chars.
|
|
||||||
const charToInt = new Uint8Array(128); // z is 122 in ASCII
|
|
||||||
for (let i = 0; i < chars.length; i++) {
|
|
||||||
const c = chars.charCodeAt(i);
|
|
||||||
intToChar[i] = c;
|
|
||||||
charToInt[c] = i;
|
|
||||||
}
|
|
||||||
// Provide a fallback for older environments.
|
|
||||||
const td = typeof TextDecoder !== 'undefined'
|
|
||||||
? /* #__PURE__ */ new TextDecoder()
|
|
||||||
: typeof Buffer !== 'undefined'
|
|
||||||
? {
|
|
||||||
decode(buf) {
|
|
||||||
const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
||||||
return out.toString();
|
|
||||||
},
|
|
||||||
}
|
|
||||||
: {
|
|
||||||
decode(buf) {
|
|
||||||
let out = '';
|
|
||||||
for (let i = 0; i < buf.length; i++) {
|
|
||||||
out += String.fromCharCode(buf[i]);
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
function decode(mappings) {
|
|
||||||
const state = new Int32Array(5);
|
|
||||||
const decoded = [];
|
|
||||||
let index = 0;
|
|
||||||
do {
|
|
||||||
const semi = indexOf(mappings, index);
|
|
||||||
const line = [];
|
|
||||||
let sorted = true;
|
|
||||||
let lastCol = 0;
|
|
||||||
state[0] = 0;
|
|
||||||
for (let i = index; i < semi; i++) {
|
|
||||||
let seg;
|
|
||||||
i = decodeInteger(mappings, i, state, 0); // genColumn
|
|
||||||
const col = state[0];
|
|
||||||
if (col < lastCol)
|
|
||||||
sorted = false;
|
|
||||||
lastCol = col;
|
|
||||||
if (hasMoreVlq(mappings, i, semi)) {
|
|
||||||
i = decodeInteger(mappings, i, state, 1); // sourcesIndex
|
|
||||||
i = decodeInteger(mappings, i, state, 2); // sourceLine
|
|
||||||
i = decodeInteger(mappings, i, state, 3); // sourceColumn
|
|
||||||
if (hasMoreVlq(mappings, i, semi)) {
|
|
||||||
i = decodeInteger(mappings, i, state, 4); // namesIndex
|
|
||||||
seg = [col, state[1], state[2], state[3], state[4]];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
seg = [col, state[1], state[2], state[3]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
seg = [col];
|
|
||||||
}
|
|
||||||
line.push(seg);
|
|
||||||
}
|
|
||||||
if (!sorted)
|
|
||||||
sort(line);
|
|
||||||
decoded.push(line);
|
|
||||||
index = semi + 1;
|
|
||||||
} while (index <= mappings.length);
|
|
||||||
return decoded;
|
|
||||||
}
|
|
||||||
function indexOf(mappings, index) {
|
|
||||||
const idx = mappings.indexOf(';', index);
|
|
||||||
return idx === -1 ? mappings.length : idx;
|
|
||||||
}
|
|
||||||
function decodeInteger(mappings, pos, state, j) {
|
|
||||||
let value = 0;
|
|
||||||
let shift = 0;
|
|
||||||
let integer = 0;
|
|
||||||
do {
|
|
||||||
const c = mappings.charCodeAt(pos++);
|
|
||||||
integer = charToInt[c];
|
|
||||||
value |= (integer & 31) << shift;
|
|
||||||
shift += 5;
|
|
||||||
} while (integer & 32);
|
|
||||||
const shouldNegate = value & 1;
|
|
||||||
value >>>= 1;
|
|
||||||
if (shouldNegate) {
|
|
||||||
value = -0x80000000 | -value;
|
|
||||||
}
|
|
||||||
state[j] += value;
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
function hasMoreVlq(mappings, i, length) {
|
|
||||||
if (i >= length)
|
|
||||||
return false;
|
|
||||||
return mappings.charCodeAt(i) !== comma;
|
|
||||||
}
|
|
||||||
function sort(line) {
|
|
||||||
line.sort(sortComparator);
|
|
||||||
}
|
|
||||||
function sortComparator(a, b) {
|
|
||||||
return a[0] - b[0];
|
|
||||||
}
|
|
||||||
function encode(decoded) {
|
|
||||||
const state = new Int32Array(5);
|
|
||||||
const bufLength = 1024 * 16;
|
|
||||||
const subLength = bufLength - 36;
|
|
||||||
const buf = new Uint8Array(bufLength);
|
|
||||||
const sub = buf.subarray(0, subLength);
|
|
||||||
let pos = 0;
|
|
||||||
let out = '';
|
|
||||||
for (let i = 0; i < decoded.length; i++) {
|
|
||||||
const line = decoded[i];
|
|
||||||
if (i > 0) {
|
|
||||||
if (pos === bufLength) {
|
|
||||||
out += td.decode(buf);
|
|
||||||
pos = 0;
|
|
||||||
}
|
|
||||||
buf[pos++] = semicolon;
|
|
||||||
}
|
|
||||||
if (line.length === 0)
|
|
||||||
continue;
|
|
||||||
state[0] = 0;
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const segment = line[j];
|
|
||||||
// We can push up to 5 ints, each int can take at most 7 chars, and we
|
|
||||||
// may push a comma.
|
|
||||||
if (pos > subLength) {
|
|
||||||
out += td.decode(sub);
|
|
||||||
buf.copyWithin(0, subLength, pos);
|
|
||||||
pos -= subLength;
|
|
||||||
}
|
|
||||||
if (j > 0)
|
|
||||||
buf[pos++] = comma;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 0); // genColumn
|
|
||||||
if (segment.length === 1)
|
|
||||||
continue;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 1); // sourcesIndex
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 2); // sourceLine
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 3); // sourceColumn
|
|
||||||
if (segment.length === 4)
|
|
||||||
continue;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 4); // namesIndex
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out + td.decode(buf.subarray(0, pos));
|
|
||||||
}
|
|
||||||
function encodeInteger(buf, pos, state, segment, j) {
|
|
||||||
const next = segment[j];
|
|
||||||
let num = next - state[j];
|
|
||||||
state[j] = next;
|
|
||||||
num = num < 0 ? (-num << 1) | 1 : num << 1;
|
|
||||||
do {
|
|
||||||
let clamped = num & 0b011111;
|
|
||||||
num >>>= 5;
|
|
||||||
if (num > 0)
|
|
||||||
clamped |= 0b100000;
|
|
||||||
buf[pos++] = intToChar[clamped];
|
|
||||||
} while (num > 0);
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
export { decode, encode };
|
|
||||||
//# sourceMappingURL=sourcemap-codec.mjs.map
|
|
1
node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map
generated
vendored
1
node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map
generated
vendored
File diff suppressed because one or more lines are too long
175
node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js
generated
vendored
175
node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js
generated
vendored
@ -1,175 +0,0 @@
|
|||||||
(function (global, factory) {
|
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
||||||
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.sourcemapCodec = {}));
|
|
||||||
})(this, (function (exports) { 'use strict';
|
|
||||||
|
|
||||||
const comma = ','.charCodeAt(0);
|
|
||||||
const semicolon = ';'.charCodeAt(0);
|
|
||||||
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
||||||
const intToChar = new Uint8Array(64); // 64 possible chars.
|
|
||||||
const charToInt = new Uint8Array(128); // z is 122 in ASCII
|
|
||||||
for (let i = 0; i < chars.length; i++) {
|
|
||||||
const c = chars.charCodeAt(i);
|
|
||||||
intToChar[i] = c;
|
|
||||||
charToInt[c] = i;
|
|
||||||
}
|
|
||||||
// Provide a fallback for older environments.
|
|
||||||
const td = typeof TextDecoder !== 'undefined'
|
|
||||||
? /* #__PURE__ */ new TextDecoder()
|
|
||||||
: typeof Buffer !== 'undefined'
|
|
||||||
? {
|
|
||||||
decode(buf) {
|
|
||||||
const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
||||||
return out.toString();
|
|
||||||
},
|
|
||||||
}
|
|
||||||
: {
|
|
||||||
decode(buf) {
|
|
||||||
let out = '';
|
|
||||||
for (let i = 0; i < buf.length; i++) {
|
|
||||||
out += String.fromCharCode(buf[i]);
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
function decode(mappings) {
|
|
||||||
const state = new Int32Array(5);
|
|
||||||
const decoded = [];
|
|
||||||
let index = 0;
|
|
||||||
do {
|
|
||||||
const semi = indexOf(mappings, index);
|
|
||||||
const line = [];
|
|
||||||
let sorted = true;
|
|
||||||
let lastCol = 0;
|
|
||||||
state[0] = 0;
|
|
||||||
for (let i = index; i < semi; i++) {
|
|
||||||
let seg;
|
|
||||||
i = decodeInteger(mappings, i, state, 0); // genColumn
|
|
||||||
const col = state[0];
|
|
||||||
if (col < lastCol)
|
|
||||||
sorted = false;
|
|
||||||
lastCol = col;
|
|
||||||
if (hasMoreVlq(mappings, i, semi)) {
|
|
||||||
i = decodeInteger(mappings, i, state, 1); // sourcesIndex
|
|
||||||
i = decodeInteger(mappings, i, state, 2); // sourceLine
|
|
||||||
i = decodeInteger(mappings, i, state, 3); // sourceColumn
|
|
||||||
if (hasMoreVlq(mappings, i, semi)) {
|
|
||||||
i = decodeInteger(mappings, i, state, 4); // namesIndex
|
|
||||||
seg = [col, state[1], state[2], state[3], state[4]];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
seg = [col, state[1], state[2], state[3]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
seg = [col];
|
|
||||||
}
|
|
||||||
line.push(seg);
|
|
||||||
}
|
|
||||||
if (!sorted)
|
|
||||||
sort(line);
|
|
||||||
decoded.push(line);
|
|
||||||
index = semi + 1;
|
|
||||||
} while (index <= mappings.length);
|
|
||||||
return decoded;
|
|
||||||
}
|
|
||||||
function indexOf(mappings, index) {
|
|
||||||
const idx = mappings.indexOf(';', index);
|
|
||||||
return idx === -1 ? mappings.length : idx;
|
|
||||||
}
|
|
||||||
function decodeInteger(mappings, pos, state, j) {
|
|
||||||
let value = 0;
|
|
||||||
let shift = 0;
|
|
||||||
let integer = 0;
|
|
||||||
do {
|
|
||||||
const c = mappings.charCodeAt(pos++);
|
|
||||||
integer = charToInt[c];
|
|
||||||
value |= (integer & 31) << shift;
|
|
||||||
shift += 5;
|
|
||||||
} while (integer & 32);
|
|
||||||
const shouldNegate = value & 1;
|
|
||||||
value >>>= 1;
|
|
||||||
if (shouldNegate) {
|
|
||||||
value = -0x80000000 | -value;
|
|
||||||
}
|
|
||||||
state[j] += value;
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
function hasMoreVlq(mappings, i, length) {
|
|
||||||
if (i >= length)
|
|
||||||
return false;
|
|
||||||
return mappings.charCodeAt(i) !== comma;
|
|
||||||
}
|
|
||||||
function sort(line) {
|
|
||||||
line.sort(sortComparator);
|
|
||||||
}
|
|
||||||
function sortComparator(a, b) {
|
|
||||||
return a[0] - b[0];
|
|
||||||
}
|
|
||||||
function encode(decoded) {
|
|
||||||
const state = new Int32Array(5);
|
|
||||||
const bufLength = 1024 * 16;
|
|
||||||
const subLength = bufLength - 36;
|
|
||||||
const buf = new Uint8Array(bufLength);
|
|
||||||
const sub = buf.subarray(0, subLength);
|
|
||||||
let pos = 0;
|
|
||||||
let out = '';
|
|
||||||
for (let i = 0; i < decoded.length; i++) {
|
|
||||||
const line = decoded[i];
|
|
||||||
if (i > 0) {
|
|
||||||
if (pos === bufLength) {
|
|
||||||
out += td.decode(buf);
|
|
||||||
pos = 0;
|
|
||||||
}
|
|
||||||
buf[pos++] = semicolon;
|
|
||||||
}
|
|
||||||
if (line.length === 0)
|
|
||||||
continue;
|
|
||||||
state[0] = 0;
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const segment = line[j];
|
|
||||||
// We can push up to 5 ints, each int can take at most 7 chars, and we
|
|
||||||
// may push a comma.
|
|
||||||
if (pos > subLength) {
|
|
||||||
out += td.decode(sub);
|
|
||||||
buf.copyWithin(0, subLength, pos);
|
|
||||||
pos -= subLength;
|
|
||||||
}
|
|
||||||
if (j > 0)
|
|
||||||
buf[pos++] = comma;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 0); // genColumn
|
|
||||||
if (segment.length === 1)
|
|
||||||
continue;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 1); // sourcesIndex
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 2); // sourceLine
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 3); // sourceColumn
|
|
||||||
if (segment.length === 4)
|
|
||||||
continue;
|
|
||||||
pos = encodeInteger(buf, pos, state, segment, 4); // namesIndex
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out + td.decode(buf.subarray(0, pos));
|
|
||||||
}
|
|
||||||
function encodeInteger(buf, pos, state, segment, j) {
|
|
||||||
const next = segment[j];
|
|
||||||
let num = next - state[j];
|
|
||||||
state[j] = next;
|
|
||||||
num = num < 0 ? (-num << 1) | 1 : num << 1;
|
|
||||||
do {
|
|
||||||
let clamped = num & 0b011111;
|
|
||||||
num >>>= 5;
|
|
||||||
if (num > 0)
|
|
||||||
clamped |= 0b100000;
|
|
||||||
buf[pos++] = intToChar[clamped];
|
|
||||||
} while (num > 0);
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.decode = decode;
|
|
||||||
exports.encode = encode;
|
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
|
||||||
|
|
||||||
}));
|
|
||||||
//# sourceMappingURL=sourcemap-codec.umd.js.map
|
|
1
node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map
generated
vendored
1
node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map
generated
vendored
File diff suppressed because one or more lines are too long
6
node_modules/@jridgewell/sourcemap-codec/dist/types/sourcemap-codec.d.ts
generated
vendored
6
node_modules/@jridgewell/sourcemap-codec/dist/types/sourcemap-codec.d.ts
generated
vendored
@ -1,6 +0,0 @@
|
|||||||
export declare type SourceMapSegment = [number] | [number, number, number, number] | [number, number, number, number, number];
|
|
||||||
export declare type SourceMapLine = SourceMapSegment[];
|
|
||||||
export declare type SourceMapMappings = SourceMapLine[];
|
|
||||||
export declare function decode(mappings: string): SourceMapMappings;
|
|
||||||
export declare function encode(decoded: SourceMapMappings): string;
|
|
||||||
export declare function encode(decoded: Readonly<SourceMapMappings>): string;
|
|
74
node_modules/@jridgewell/sourcemap-codec/package.json
generated
vendored
74
node_modules/@jridgewell/sourcemap-codec/package.json
generated
vendored
@ -1,74 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@jridgewell/sourcemap-codec",
|
|
||||||
"version": "1.4.15",
|
|
||||||
"description": "Encode/decode sourcemap mappings",
|
|
||||||
"keywords": [
|
|
||||||
"sourcemap",
|
|
||||||
"vlq"
|
|
||||||
],
|
|
||||||
"main": "dist/sourcemap-codec.umd.js",
|
|
||||||
"module": "dist/sourcemap-codec.mjs",
|
|
||||||
"types": "dist/types/sourcemap-codec.d.ts",
|
|
||||||
"files": [
|
|
||||||
"dist"
|
|
||||||
],
|
|
||||||
"exports": {
|
|
||||||
".": [
|
|
||||||
{
|
|
||||||
"types": "./dist/types/sourcemap-codec.d.ts",
|
|
||||||
"browser": "./dist/sourcemap-codec.umd.js",
|
|
||||||
"require": "./dist/sourcemap-codec.umd.js",
|
|
||||||
"import": "./dist/sourcemap-codec.mjs"
|
|
||||||
},
|
|
||||||
"./dist/sourcemap-codec.umd.js"
|
|
||||||
],
|
|
||||||
"./package.json": "./package.json"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"benchmark": "run-s build:rollup benchmark:*",
|
|
||||||
"benchmark:install": "cd benchmark && npm install",
|
|
||||||
"benchmark:only": "node --expose-gc benchmark/index.js",
|
|
||||||
"build": "run-s -n build:*",
|
|
||||||
"build:rollup": "rollup -c rollup.config.js",
|
|
||||||
"build:ts": "tsc --project tsconfig.build.json",
|
|
||||||
"lint": "run-s -n lint:*",
|
|
||||||
"lint:prettier": "npm run test:lint:prettier -- --write",
|
|
||||||
"lint:ts": "npm run test:lint:ts -- --fix",
|
|
||||||
"prebuild": "rm -rf dist",
|
|
||||||
"prepublishOnly": "npm run preversion",
|
|
||||||
"preversion": "run-s test build",
|
|
||||||
"pretest": "run-s build:rollup",
|
|
||||||
"test": "run-s -n test:lint test:only",
|
|
||||||
"test:debug": "mocha --inspect-brk",
|
|
||||||
"test:lint": "run-s -n test:lint:*",
|
|
||||||
"test:lint:prettier": "prettier --check '{src,test}/**/*.ts'",
|
|
||||||
"test:lint:ts": "eslint '{src,test}/**/*.ts'",
|
|
||||||
"test:only": "mocha",
|
|
||||||
"test:coverage": "c8 mocha",
|
|
||||||
"test:watch": "mocha --watch"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/jridgewell/sourcemap-codec.git"
|
|
||||||
},
|
|
||||||
"author": "Rich Harris",
|
|
||||||
"license": "MIT",
|
|
||||||
"devDependencies": {
|
|
||||||
"@rollup/plugin-typescript": "8.3.0",
|
|
||||||
"@types/node": "17.0.15",
|
|
||||||
"@typescript-eslint/eslint-plugin": "5.10.0",
|
|
||||||
"@typescript-eslint/parser": "5.10.0",
|
|
||||||
"benchmark": "2.1.4",
|
|
||||||
"c8": "7.11.2",
|
|
||||||
"eslint": "8.7.0",
|
|
||||||
"eslint-config-prettier": "8.3.0",
|
|
||||||
"mocha": "9.2.0",
|
|
||||||
"npm-run-all": "4.1.5",
|
|
||||||
"prettier": "2.5.1",
|
|
||||||
"rollup": "2.64.0",
|
|
||||||
"source-map": "0.6.1",
|
|
||||||
"source-map-js": "1.0.2",
|
|
||||||
"sourcemap-codec": "1.4.8",
|
|
||||||
"typescript": "4.5.4"
|
|
||||||
}
|
|
||||||
}
|
|
19
node_modules/@jridgewell/trace-mapping/LICENSE
generated
vendored
19
node_modules/@jridgewell/trace-mapping/LICENSE
generated
vendored
@ -1,19 +0,0 @@
|
|||||||
Copyright 2022 Justin Ridgewell <justin@ridgewell.name>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
252
node_modules/@jridgewell/trace-mapping/README.md
generated
vendored
252
node_modules/@jridgewell/trace-mapping/README.md
generated
vendored
@ -1,252 +0,0 @@
|
|||||||
# @jridgewell/trace-mapping
|
|
||||||
|
|
||||||
> Trace the original position through a source map
|
|
||||||
|
|
||||||
`trace-mapping` allows you to take the line and column of an output file and trace it to the
|
|
||||||
original location in the source file through a source map.
|
|
||||||
|
|
||||||
You may already be familiar with the [`source-map`][source-map] package's `SourceMapConsumer`. This
|
|
||||||
provides the same `originalPositionFor` and `generatedPositionFor` API, without requiring WASM.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install @jridgewell/trace-mapping
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import {
|
|
||||||
TraceMap,
|
|
||||||
originalPositionFor,
|
|
||||||
generatedPositionFor,
|
|
||||||
sourceContentFor,
|
|
||||||
} from '@jridgewell/trace-mapping';
|
|
||||||
|
|
||||||
const tracer = new TraceMap({
|
|
||||||
version: 3,
|
|
||||||
sources: ['input.js'],
|
|
||||||
sourcesContent: ['content of input.js'],
|
|
||||||
names: ['foo'],
|
|
||||||
mappings: 'KAyCIA',
|
|
||||||
});
|
|
||||||
|
|
||||||
// Lines start at line 1, columns at column 0.
|
|
||||||
const traced = originalPositionFor(tracer, { line: 1, column: 5 });
|
|
||||||
assert.deepEqual(traced, {
|
|
||||||
source: 'input.js',
|
|
||||||
line: 42,
|
|
||||||
column: 4,
|
|
||||||
name: 'foo',
|
|
||||||
});
|
|
||||||
|
|
||||||
const content = sourceContentFor(tracer, traced.source);
|
|
||||||
assert.strictEqual(content, 'content for input.js');
|
|
||||||
|
|
||||||
const generated = generatedPositionFor(tracer, {
|
|
||||||
source: 'input.js',
|
|
||||||
line: 42,
|
|
||||||
column: 4,
|
|
||||||
});
|
|
||||||
assert.deepEqual(generated, {
|
|
||||||
line: 1,
|
|
||||||
column: 5,
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
We also provide a lower level API to get the actual segment that matches our line and column. Unlike
|
|
||||||
`originalPositionFor`, `traceSegment` uses a 0-base for `line`:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { traceSegment } from '@jridgewell/trace-mapping';
|
|
||||||
|
|
||||||
// line is 0-base.
|
|
||||||
const traced = traceSegment(tracer, /* line */ 0, /* column */ 5);
|
|
||||||
|
|
||||||
// Segments are [outputColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
|
|
||||||
// Again, line is 0-base and so is sourceLine
|
|
||||||
assert.deepEqual(traced, [5, 0, 41, 4, 0]);
|
|
||||||
```
|
|
||||||
|
|
||||||
### SectionedSourceMaps
|
|
||||||
|
|
||||||
The sourcemap spec defines a special `sections` field that's designed to handle concatenation of
|
|
||||||
output code with associated sourcemaps. This type of sourcemap is rarely used (no major build tool
|
|
||||||
produces it), but if you are hand coding a concatenation you may need it. We provide an `AnyMap`
|
|
||||||
helper that can receive either a regular sourcemap or a `SectionedSourceMap` and returns a
|
|
||||||
`TraceMap` instance:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { AnyMap } from '@jridgewell/trace-mapping';
|
|
||||||
const fooOutput = 'foo';
|
|
||||||
const barOutput = 'bar';
|
|
||||||
const output = [fooOutput, barOutput].join('\n');
|
|
||||||
|
|
||||||
const sectioned = new AnyMap({
|
|
||||||
version: 3,
|
|
||||||
sections: [
|
|
||||||
{
|
|
||||||
// 0-base line and column
|
|
||||||
offset: { line: 0, column: 0 },
|
|
||||||
// fooOutput's sourcemap
|
|
||||||
map: {
|
|
||||||
version: 3,
|
|
||||||
sources: ['foo.js'],
|
|
||||||
names: ['foo'],
|
|
||||||
mappings: 'AAAAA',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// barOutput's sourcemap will not affect the first line, only the second
|
|
||||||
offset: { line: 1, column: 0 },
|
|
||||||
map: {
|
|
||||||
version: 3,
|
|
||||||
sources: ['bar.js'],
|
|
||||||
names: ['bar'],
|
|
||||||
mappings: 'AAAAA',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
const traced = originalPositionFor(sectioned, {
|
|
||||||
line: 2,
|
|
||||||
column: 0,
|
|
||||||
});
|
|
||||||
|
|
||||||
assert.deepEqual(traced, {
|
|
||||||
source: 'bar.js',
|
|
||||||
line: 1,
|
|
||||||
column: 0,
|
|
||||||
name: 'bar',
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## Benchmarks
|
|
||||||
|
|
||||||
```
|
|
||||||
node v18.0.0
|
|
||||||
|
|
||||||
amp.js.map - 45120 segments
|
|
||||||
|
|
||||||
Memory Usage:
|
|
||||||
trace-mapping decoded 562400 bytes
|
|
||||||
trace-mapping encoded 5706544 bytes
|
|
||||||
source-map-js 10717664 bytes
|
|
||||||
source-map-0.6.1 17446384 bytes
|
|
||||||
source-map-0.8.0 9701757 bytes
|
|
||||||
Smallest memory usage is trace-mapping decoded
|
|
||||||
|
|
||||||
Init speed:
|
|
||||||
trace-mapping: decoded JSON input x 180 ops/sec ±0.34% (85 runs sampled)
|
|
||||||
trace-mapping: encoded JSON input x 364 ops/sec ±1.77% (89 runs sampled)
|
|
||||||
trace-mapping: decoded Object input x 3,116 ops/sec ±0.50% (96 runs sampled)
|
|
||||||
trace-mapping: encoded Object input x 410 ops/sec ±2.62% (85 runs sampled)
|
|
||||||
source-map-js: encoded Object input x 84.23 ops/sec ±0.91% (73 runs sampled)
|
|
||||||
source-map-0.6.1: encoded Object input x 37.21 ops/sec ±2.08% (51 runs sampled)
|
|
||||||
Fastest is trace-mapping: decoded Object input
|
|
||||||
|
|
||||||
Trace speed:
|
|
||||||
trace-mapping: decoded originalPositionFor x 3,952,212 ops/sec ±0.17% (98 runs sampled)
|
|
||||||
trace-mapping: encoded originalPositionFor x 3,487,468 ops/sec ±1.58% (90 runs sampled)
|
|
||||||
source-map-js: encoded originalPositionFor x 827,730 ops/sec ±0.78% (97 runs sampled)
|
|
||||||
source-map-0.6.1: encoded originalPositionFor x 748,991 ops/sec ±0.53% (94 runs sampled)
|
|
||||||
source-map-0.8.0: encoded originalPositionFor x 2,532,894 ops/sec ±0.57% (95 runs sampled)
|
|
||||||
Fastest is trace-mapping: decoded originalPositionFor
|
|
||||||
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
|
|
||||||
babel.min.js.map - 347793 segments
|
|
||||||
|
|
||||||
Memory Usage:
|
|
||||||
trace-mapping decoded 89832 bytes
|
|
||||||
trace-mapping encoded 35474640 bytes
|
|
||||||
source-map-js 51257176 bytes
|
|
||||||
source-map-0.6.1 63515664 bytes
|
|
||||||
source-map-0.8.0 42933752 bytes
|
|
||||||
Smallest memory usage is trace-mapping decoded
|
|
||||||
|
|
||||||
Init speed:
|
|
||||||
trace-mapping: decoded JSON input x 15.41 ops/sec ±8.65% (34 runs sampled)
|
|
||||||
trace-mapping: encoded JSON input x 28.20 ops/sec ±12.87% (42 runs sampled)
|
|
||||||
trace-mapping: decoded Object input x 964 ops/sec ±0.36% (99 runs sampled)
|
|
||||||
trace-mapping: encoded Object input x 31.77 ops/sec ±13.79% (45 runs sampled)
|
|
||||||
source-map-js: encoded Object input x 6.45 ops/sec ±5.16% (21 runs sampled)
|
|
||||||
source-map-0.6.1: encoded Object input x 4.07 ops/sec ±5.24% (15 runs sampled)
|
|
||||||
Fastest is trace-mapping: decoded Object input
|
|
||||||
|
|
||||||
Trace speed:
|
|
||||||
trace-mapping: decoded originalPositionFor x 7,183,038 ops/sec ±0.58% (95 runs sampled)
|
|
||||||
trace-mapping: encoded originalPositionFor x 5,192,185 ops/sec ±0.41% (100 runs sampled)
|
|
||||||
source-map-js: encoded originalPositionFor x 4,259,489 ops/sec ±0.79% (94 runs sampled)
|
|
||||||
source-map-0.6.1: encoded originalPositionFor x 3,742,629 ops/sec ±0.71% (95 runs sampled)
|
|
||||||
source-map-0.8.0: encoded originalPositionFor x 6,270,211 ops/sec ±0.64% (94 runs sampled)
|
|
||||||
Fastest is trace-mapping: decoded originalPositionFor
|
|
||||||
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
|
|
||||||
preact.js.map - 1992 segments
|
|
||||||
|
|
||||||
Memory Usage:
|
|
||||||
trace-mapping decoded 37128 bytes
|
|
||||||
trace-mapping encoded 247280 bytes
|
|
||||||
source-map-js 1143536 bytes
|
|
||||||
source-map-0.6.1 1290992 bytes
|
|
||||||
source-map-0.8.0 96544 bytes
|
|
||||||
Smallest memory usage is trace-mapping decoded
|
|
||||||
|
|
||||||
Init speed:
|
|
||||||
trace-mapping: decoded JSON input x 3,483 ops/sec ±0.30% (98 runs sampled)
|
|
||||||
trace-mapping: encoded JSON input x 6,092 ops/sec ±0.18% (97 runs sampled)
|
|
||||||
trace-mapping: decoded Object input x 249,076 ops/sec ±0.24% (98 runs sampled)
|
|
||||||
trace-mapping: encoded Object input x 14,555 ops/sec ±0.48% (100 runs sampled)
|
|
||||||
source-map-js: encoded Object input x 2,447 ops/sec ±0.36% (99 runs sampled)
|
|
||||||
source-map-0.6.1: encoded Object input x 1,201 ops/sec ±0.57% (96 runs sampled)
|
|
||||||
Fastest is trace-mapping: decoded Object input
|
|
||||||
|
|
||||||
Trace speed:
|
|
||||||
trace-mapping: decoded originalPositionFor x 7,620,192 ops/sec ±0.09% (99 runs sampled)
|
|
||||||
trace-mapping: encoded originalPositionFor x 6,872,554 ops/sec ±0.30% (97 runs sampled)
|
|
||||||
source-map-js: encoded originalPositionFor x 2,489,570 ops/sec ±0.35% (94 runs sampled)
|
|
||||||
source-map-0.6.1: encoded originalPositionFor x 1,698,633 ops/sec ±0.28% (98 runs sampled)
|
|
||||||
source-map-0.8.0: encoded originalPositionFor x 4,015,644 ops/sec ±0.22% (98 runs sampled)
|
|
||||||
Fastest is trace-mapping: decoded originalPositionFor
|
|
||||||
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
|
|
||||||
react.js.map - 5726 segments
|
|
||||||
|
|
||||||
Memory Usage:
|
|
||||||
trace-mapping decoded 16176 bytes
|
|
||||||
trace-mapping encoded 681552 bytes
|
|
||||||
source-map-js 2418352 bytes
|
|
||||||
source-map-0.6.1 2443672 bytes
|
|
||||||
source-map-0.8.0 111768 bytes
|
|
||||||
Smallest memory usage is trace-mapping decoded
|
|
||||||
|
|
||||||
Init speed:
|
|
||||||
trace-mapping: decoded JSON input x 1,720 ops/sec ±0.34% (98 runs sampled)
|
|
||||||
trace-mapping: encoded JSON input x 4,406 ops/sec ±0.35% (100 runs sampled)
|
|
||||||
trace-mapping: decoded Object input x 92,122 ops/sec ±0.10% (99 runs sampled)
|
|
||||||
trace-mapping: encoded Object input x 5,385 ops/sec ±0.37% (99 runs sampled)
|
|
||||||
source-map-js: encoded Object input x 794 ops/sec ±0.40% (98 runs sampled)
|
|
||||||
source-map-0.6.1: encoded Object input x 416 ops/sec ±0.54% (91 runs sampled)
|
|
||||||
Fastest is trace-mapping: decoded Object input
|
|
||||||
|
|
||||||
Trace speed:
|
|
||||||
trace-mapping: decoded originalPositionFor x 32,759,519 ops/sec ±0.33% (100 runs sampled)
|
|
||||||
trace-mapping: encoded originalPositionFor x 31,116,306 ops/sec ±0.33% (97 runs sampled)
|
|
||||||
source-map-js: encoded originalPositionFor x 17,458,435 ops/sec ±0.44% (97 runs sampled)
|
|
||||||
source-map-0.6.1: encoded originalPositionFor x 12,687,097 ops/sec ±0.43% (95 runs sampled)
|
|
||||||
source-map-0.8.0: encoded originalPositionFor x 23,538,275 ops/sec ±0.38% (95 runs sampled)
|
|
||||||
Fastest is trace-mapping: decoded originalPositionFor
|
|
||||||
```
|
|
||||||
|
|
||||||
[source-map]: https://www.npmjs.com/package/source-map
|
|
552
node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
generated
vendored
552
node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
generated
vendored
@ -1,552 +0,0 @@
|
|||||||
import { encode, decode } from '@jridgewell/sourcemap-codec';
|
|
||||||
import resolveUri from '@jridgewell/resolve-uri';
|
|
||||||
|
|
||||||
function resolve(input, base) {
|
|
||||||
// The base is always treated as a directory, if it's not empty.
|
|
||||||
// https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327
|
|
||||||
// https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401
|
|
||||||
if (base && !base.endsWith('/'))
|
|
||||||
base += '/';
|
|
||||||
return resolveUri(input, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes everything after the last "/", but leaves the slash.
|
|
||||||
*/
|
|
||||||
function stripFilename(path) {
|
|
||||||
if (!path)
|
|
||||||
return '';
|
|
||||||
const index = path.lastIndexOf('/');
|
|
||||||
return path.slice(0, index + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const COLUMN = 0;
|
|
||||||
const SOURCES_INDEX = 1;
|
|
||||||
const SOURCE_LINE = 2;
|
|
||||||
const SOURCE_COLUMN = 3;
|
|
||||||
const NAMES_INDEX = 4;
|
|
||||||
const REV_GENERATED_LINE = 1;
|
|
||||||
const REV_GENERATED_COLUMN = 2;
|
|
||||||
|
|
||||||
function maybeSort(mappings, owned) {
|
|
||||||
const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);
|
|
||||||
if (unsortedIndex === mappings.length)
|
|
||||||
return mappings;
|
|
||||||
// If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If
|
|
||||||
// not, we do not want to modify the consumer's input array.
|
|
||||||
if (!owned)
|
|
||||||
mappings = mappings.slice();
|
|
||||||
for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {
|
|
||||||
mappings[i] = sortSegments(mappings[i], owned);
|
|
||||||
}
|
|
||||||
return mappings;
|
|
||||||
}
|
|
||||||
function nextUnsortedSegmentLine(mappings, start) {
|
|
||||||
for (let i = start; i < mappings.length; i++) {
|
|
||||||
if (!isSorted(mappings[i]))
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return mappings.length;
|
|
||||||
}
|
|
||||||
function isSorted(line) {
|
|
||||||
for (let j = 1; j < line.length; j++) {
|
|
||||||
if (line[j][COLUMN] < line[j - 1][COLUMN]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
function sortSegments(line, owned) {
|
|
||||||
if (!owned)
|
|
||||||
line = line.slice();
|
|
||||||
return line.sort(sortComparator);
|
|
||||||
}
|
|
||||||
function sortComparator(a, b) {
|
|
||||||
return a[COLUMN] - b[COLUMN];
|
|
||||||
}
|
|
||||||
|
|
||||||
let found = false;
|
|
||||||
/**
|
|
||||||
* A binary search implementation that returns the index if a match is found.
|
|
||||||
* If no match is found, then the left-index (the index associated with the item that comes just
|
|
||||||
* before the desired index) is returned. To maintain proper sort order, a splice would happen at
|
|
||||||
* the next index:
|
|
||||||
*
|
|
||||||
* ```js
|
|
||||||
* const array = [1, 3];
|
|
||||||
* const needle = 2;
|
|
||||||
* const index = binarySearch(array, needle, (item, needle) => item - needle);
|
|
||||||
*
|
|
||||||
* assert.equal(index, 0);
|
|
||||||
* array.splice(index + 1, 0, needle);
|
|
||||||
* assert.deepEqual(array, [1, 2, 3]);
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
function binarySearch(haystack, needle, low, high) {
|
|
||||||
while (low <= high) {
|
|
||||||
const mid = low + ((high - low) >> 1);
|
|
||||||
const cmp = haystack[mid][COLUMN] - needle;
|
|
||||||
if (cmp === 0) {
|
|
||||||
found = true;
|
|
||||||
return mid;
|
|
||||||
}
|
|
||||||
if (cmp < 0) {
|
|
||||||
low = mid + 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
high = mid - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
found = false;
|
|
||||||
return low - 1;
|
|
||||||
}
|
|
||||||
function upperBound(haystack, needle, index) {
|
|
||||||
for (let i = index + 1; i < haystack.length; index = i++) {
|
|
||||||
if (haystack[i][COLUMN] !== needle)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function lowerBound(haystack, needle, index) {
|
|
||||||
for (let i = index - 1; i >= 0; index = i--) {
|
|
||||||
if (haystack[i][COLUMN] !== needle)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function memoizedState() {
|
|
||||||
return {
|
|
||||||
lastKey: -1,
|
|
||||||
lastNeedle: -1,
|
|
||||||
lastIndex: -1,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This overly complicated beast is just to record the last tested line/column and the resulting
|
|
||||||
* index, allowing us to skip a few tests if mappings are monotonically increasing.
|
|
||||||
*/
|
|
||||||
function memoizedBinarySearch(haystack, needle, state, key) {
|
|
||||||
const { lastKey, lastNeedle, lastIndex } = state;
|
|
||||||
let low = 0;
|
|
||||||
let high = haystack.length - 1;
|
|
||||||
if (key === lastKey) {
|
|
||||||
if (needle === lastNeedle) {
|
|
||||||
found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;
|
|
||||||
return lastIndex;
|
|
||||||
}
|
|
||||||
if (needle >= lastNeedle) {
|
|
||||||
// lastIndex may be -1 if the previous needle was not found.
|
|
||||||
low = lastIndex === -1 ? 0 : lastIndex;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
high = lastIndex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state.lastKey = key;
|
|
||||||
state.lastNeedle = needle;
|
|
||||||
return (state.lastIndex = binarySearch(haystack, needle, low, high));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rebuilds the original source files, with mappings that are ordered by source line/column instead
|
|
||||||
// of generated line/column.
|
|
||||||
function buildBySources(decoded, memos) {
|
|
||||||
const sources = memos.map(buildNullArray);
|
|
||||||
for (let i = 0; i < decoded.length; i++) {
|
|
||||||
const line = decoded[i];
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const seg = line[j];
|
|
||||||
if (seg.length === 1)
|
|
||||||
continue;
|
|
||||||
const sourceIndex = seg[SOURCES_INDEX];
|
|
||||||
const sourceLine = seg[SOURCE_LINE];
|
|
||||||
const sourceColumn = seg[SOURCE_COLUMN];
|
|
||||||
const originalSource = sources[sourceIndex];
|
|
||||||
const originalLine = (originalSource[sourceLine] || (originalSource[sourceLine] = []));
|
|
||||||
const memo = memos[sourceIndex];
|
|
||||||
// The binary search either found a match, or it found the left-index just before where the
|
|
||||||
// segment should go. Either way, we want to insert after that. And there may be multiple
|
|
||||||
// generated segments associated with an original location, so there may need to move several
|
|
||||||
// indexes before we find where we need to insert.
|
|
||||||
const index = upperBound(originalLine, sourceColumn, memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine));
|
|
||||||
insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sources;
|
|
||||||
}
|
|
||||||
function insert(array, index, value) {
|
|
||||||
for (let i = array.length; i > index; i--) {
|
|
||||||
array[i] = array[i - 1];
|
|
||||||
}
|
|
||||||
array[index] = value;
|
|
||||||
}
|
|
||||||
// Null arrays allow us to use ordered index keys without actually allocating contiguous memory like
|
|
||||||
// a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.
|
|
||||||
// Numeric properties on objects are magically sorted in ascending order by the engine regardless of
|
|
||||||
// the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending
|
|
||||||
// order when iterating with for-in.
|
|
||||||
function buildNullArray() {
|
|
||||||
return { __proto__: null };
|
|
||||||
}
|
|
||||||
|
|
||||||
const AnyMap = function (map, mapUrl) {
|
|
||||||
const parsed = typeof map === 'string' ? JSON.parse(map) : map;
|
|
||||||
if (!('sections' in parsed))
|
|
||||||
return new TraceMap(parsed, mapUrl);
|
|
||||||
const mappings = [];
|
|
||||||
const sources = [];
|
|
||||||
const sourcesContent = [];
|
|
||||||
const names = [];
|
|
||||||
recurse(parsed, mapUrl, mappings, sources, sourcesContent, names, 0, 0, Infinity, Infinity);
|
|
||||||
const joined = {
|
|
||||||
version: 3,
|
|
||||||
file: parsed.file,
|
|
||||||
names,
|
|
||||||
sources,
|
|
||||||
sourcesContent,
|
|
||||||
mappings,
|
|
||||||
};
|
|
||||||
return presortedDecodedMap(joined);
|
|
||||||
};
|
|
||||||
function recurse(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {
|
|
||||||
const { sections } = input;
|
|
||||||
for (let i = 0; i < sections.length; i++) {
|
|
||||||
const { map, offset } = sections[i];
|
|
||||||
let sl = stopLine;
|
|
||||||
let sc = stopColumn;
|
|
||||||
if (i + 1 < sections.length) {
|
|
||||||
const nextOffset = sections[i + 1].offset;
|
|
||||||
sl = Math.min(stopLine, lineOffset + nextOffset.line);
|
|
||||||
if (sl === stopLine) {
|
|
||||||
sc = Math.min(stopColumn, columnOffset + nextOffset.column);
|
|
||||||
}
|
|
||||||
else if (sl < stopLine) {
|
|
||||||
sc = columnOffset + nextOffset.column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addSection(map, mapUrl, mappings, sources, sourcesContent, names, lineOffset + offset.line, columnOffset + offset.column, sl, sc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function addSection(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {
|
|
||||||
if ('sections' in input)
|
|
||||||
return recurse(...arguments);
|
|
||||||
const map = new TraceMap(input, mapUrl);
|
|
||||||
const sourcesOffset = sources.length;
|
|
||||||
const namesOffset = names.length;
|
|
||||||
const decoded = decodedMappings(map);
|
|
||||||
const { resolvedSources, sourcesContent: contents } = map;
|
|
||||||
append(sources, resolvedSources);
|
|
||||||
append(names, map.names);
|
|
||||||
if (contents)
|
|
||||||
append(sourcesContent, contents);
|
|
||||||
else
|
|
||||||
for (let i = 0; i < resolvedSources.length; i++)
|
|
||||||
sourcesContent.push(null);
|
|
||||||
for (let i = 0; i < decoded.length; i++) {
|
|
||||||
const lineI = lineOffset + i;
|
|
||||||
// We can only add so many lines before we step into the range that the next section's map
|
|
||||||
// controls. When we get to the last line, then we'll start checking the segments to see if
|
|
||||||
// they've crossed into the column range. But it may not have any columns that overstep, so we
|
|
||||||
// still need to check that we don't overstep lines, too.
|
|
||||||
if (lineI > stopLine)
|
|
||||||
return;
|
|
||||||
// The out line may already exist in mappings (if we're continuing the line started by a
|
|
||||||
// previous section). Or, we may have jumped ahead several lines to start this section.
|
|
||||||
const out = getLine(mappings, lineI);
|
|
||||||
// On the 0th loop, the section's column offset shifts us forward. On all other lines (since the
|
|
||||||
// map can be multiple lines), it doesn't.
|
|
||||||
const cOffset = i === 0 ? columnOffset : 0;
|
|
||||||
const line = decoded[i];
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const seg = line[j];
|
|
||||||
const column = cOffset + seg[COLUMN];
|
|
||||||
// If this segment steps into the column range that the next section's map controls, we need
|
|
||||||
// to stop early.
|
|
||||||
if (lineI === stopLine && column >= stopColumn)
|
|
||||||
return;
|
|
||||||
if (seg.length === 1) {
|
|
||||||
out.push([column]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];
|
|
||||||
const sourceLine = seg[SOURCE_LINE];
|
|
||||||
const sourceColumn = seg[SOURCE_COLUMN];
|
|
||||||
out.push(seg.length === 4
|
|
||||||
? [column, sourcesIndex, sourceLine, sourceColumn]
|
|
||||||
: [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function append(arr, other) {
|
|
||||||
for (let i = 0; i < other.length; i++)
|
|
||||||
arr.push(other[i]);
|
|
||||||
}
|
|
||||||
function getLine(arr, index) {
|
|
||||||
for (let i = arr.length; i <= index; i++)
|
|
||||||
arr[i] = [];
|
|
||||||
return arr[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';
|
|
||||||
const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';
|
|
||||||
const LEAST_UPPER_BOUND = -1;
|
|
||||||
const GREATEST_LOWER_BOUND = 1;
|
|
||||||
/**
|
|
||||||
* Returns the encoded (VLQ string) form of the SourceMap's mappings field.
|
|
||||||
*/
|
|
||||||
let encodedMappings;
|
|
||||||
/**
|
|
||||||
* Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.
|
|
||||||
*/
|
|
||||||
let decodedMappings;
|
|
||||||
/**
|
|
||||||
* A low-level API to find the segment associated with a generated line/column (think, from a
|
|
||||||
* stack trace). Line and column here are 0-based, unlike `originalPositionFor`.
|
|
||||||
*/
|
|
||||||
let traceSegment;
|
|
||||||
/**
|
|
||||||
* A higher-level API to find the source/line/column associated with a generated line/column
|
|
||||||
* (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in
|
|
||||||
* `source-map` library.
|
|
||||||
*/
|
|
||||||
let originalPositionFor;
|
|
||||||
/**
|
|
||||||
* Finds the generated line/column position of the provided source/line/column source position.
|
|
||||||
*/
|
|
||||||
let generatedPositionFor;
|
|
||||||
/**
|
|
||||||
* Finds all generated line/column positions of the provided source/line/column source position.
|
|
||||||
*/
|
|
||||||
let allGeneratedPositionsFor;
|
|
||||||
/**
|
|
||||||
* Iterates each mapping in generated position order.
|
|
||||||
*/
|
|
||||||
let eachMapping;
|
|
||||||
/**
|
|
||||||
* Retrieves the source content for a particular source, if its found. Returns null if not.
|
|
||||||
*/
|
|
||||||
let sourceContentFor;
|
|
||||||
/**
|
|
||||||
* A helper that skips sorting of the input map's mappings array, which can be expensive for larger
|
|
||||||
* maps.
|
|
||||||
*/
|
|
||||||
let presortedDecodedMap;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
let decodedMap;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
let encodedMap;
|
|
||||||
class TraceMap {
|
|
||||||
constructor(map, mapUrl) {
|
|
||||||
const isString = typeof map === 'string';
|
|
||||||
if (!isString && map._decodedMemo)
|
|
||||||
return map;
|
|
||||||
const parsed = (isString ? JSON.parse(map) : map);
|
|
||||||
const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
|
|
||||||
this.version = version;
|
|
||||||
this.file = file;
|
|
||||||
this.names = names;
|
|
||||||
this.sourceRoot = sourceRoot;
|
|
||||||
this.sources = sources;
|
|
||||||
this.sourcesContent = sourcesContent;
|
|
||||||
const from = resolve(sourceRoot || '', stripFilename(mapUrl));
|
|
||||||
this.resolvedSources = sources.map((s) => resolve(s || '', from));
|
|
||||||
const { mappings } = parsed;
|
|
||||||
if (typeof mappings === 'string') {
|
|
||||||
this._encoded = mappings;
|
|
||||||
this._decoded = undefined;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this._encoded = undefined;
|
|
||||||
this._decoded = maybeSort(mappings, isString);
|
|
||||||
}
|
|
||||||
this._decodedMemo = memoizedState();
|
|
||||||
this._bySources = undefined;
|
|
||||||
this._bySourceMemos = undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
encodedMappings = (map) => {
|
|
||||||
var _a;
|
|
||||||
return ((_a = map._encoded) !== null && _a !== void 0 ? _a : (map._encoded = encode(map._decoded)));
|
|
||||||
};
|
|
||||||
decodedMappings = (map) => {
|
|
||||||
return (map._decoded || (map._decoded = decode(map._encoded)));
|
|
||||||
};
|
|
||||||
traceSegment = (map, line, column) => {
|
|
||||||
const decoded = decodedMappings(map);
|
|
||||||
// It's common for parent source maps to have pointers to lines that have no
|
|
||||||
// mapping (like a "//# sourceMappingURL=") at the end of the child file.
|
|
||||||
if (line >= decoded.length)
|
|
||||||
return null;
|
|
||||||
const segments = decoded[line];
|
|
||||||
const index = traceSegmentInternal(segments, map._decodedMemo, line, column, GREATEST_LOWER_BOUND);
|
|
||||||
return index === -1 ? null : segments[index];
|
|
||||||
};
|
|
||||||
originalPositionFor = (map, { line, column, bias }) => {
|
|
||||||
line--;
|
|
||||||
if (line < 0)
|
|
||||||
throw new Error(LINE_GTR_ZERO);
|
|
||||||
if (column < 0)
|
|
||||||
throw new Error(COL_GTR_EQ_ZERO);
|
|
||||||
const decoded = decodedMappings(map);
|
|
||||||
// It's common for parent source maps to have pointers to lines that have no
|
|
||||||
// mapping (like a "//# sourceMappingURL=") at the end of the child file.
|
|
||||||
if (line >= decoded.length)
|
|
||||||
return OMapping(null, null, null, null);
|
|
||||||
const segments = decoded[line];
|
|
||||||
const index = traceSegmentInternal(segments, map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
|
|
||||||
if (index === -1)
|
|
||||||
return OMapping(null, null, null, null);
|
|
||||||
const segment = segments[index];
|
|
||||||
if (segment.length === 1)
|
|
||||||
return OMapping(null, null, null, null);
|
|
||||||
const { names, resolvedSources } = map;
|
|
||||||
return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);
|
|
||||||
};
|
|
||||||
allGeneratedPositionsFor = (map, { source, line, column, bias }) => {
|
|
||||||
// SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit.
|
|
||||||
return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true);
|
|
||||||
};
|
|
||||||
generatedPositionFor = (map, { source, line, column, bias }) => {
|
|
||||||
return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false);
|
|
||||||
};
|
|
||||||
eachMapping = (map, cb) => {
|
|
||||||
const decoded = decodedMappings(map);
|
|
||||||
const { names, resolvedSources } = map;
|
|
||||||
for (let i = 0; i < decoded.length; i++) {
|
|
||||||
const line = decoded[i];
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const seg = line[j];
|
|
||||||
const generatedLine = i + 1;
|
|
||||||
const generatedColumn = seg[0];
|
|
||||||
let source = null;
|
|
||||||
let originalLine = null;
|
|
||||||
let originalColumn = null;
|
|
||||||
let name = null;
|
|
||||||
if (seg.length !== 1) {
|
|
||||||
source = resolvedSources[seg[1]];
|
|
||||||
originalLine = seg[2] + 1;
|
|
||||||
originalColumn = seg[3];
|
|
||||||
}
|
|
||||||
if (seg.length === 5)
|
|
||||||
name = names[seg[4]];
|
|
||||||
cb({
|
|
||||||
generatedLine,
|
|
||||||
generatedColumn,
|
|
||||||
source,
|
|
||||||
originalLine,
|
|
||||||
originalColumn,
|
|
||||||
name,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
sourceContentFor = (map, source) => {
|
|
||||||
const { sources, resolvedSources, sourcesContent } = map;
|
|
||||||
if (sourcesContent == null)
|
|
||||||
return null;
|
|
||||||
let index = sources.indexOf(source);
|
|
||||||
if (index === -1)
|
|
||||||
index = resolvedSources.indexOf(source);
|
|
||||||
return index === -1 ? null : sourcesContent[index];
|
|
||||||
};
|
|
||||||
presortedDecodedMap = (map, mapUrl) => {
|
|
||||||
const tracer = new TraceMap(clone(map, []), mapUrl);
|
|
||||||
tracer._decoded = map.mappings;
|
|
||||||
return tracer;
|
|
||||||
};
|
|
||||||
decodedMap = (map) => {
|
|
||||||
return clone(map, decodedMappings(map));
|
|
||||||
};
|
|
||||||
encodedMap = (map) => {
|
|
||||||
return clone(map, encodedMappings(map));
|
|
||||||
};
|
|
||||||
function generatedPosition(map, source, line, column, bias, all) {
|
|
||||||
line--;
|
|
||||||
if (line < 0)
|
|
||||||
throw new Error(LINE_GTR_ZERO);
|
|
||||||
if (column < 0)
|
|
||||||
throw new Error(COL_GTR_EQ_ZERO);
|
|
||||||
const { sources, resolvedSources } = map;
|
|
||||||
let sourceIndex = sources.indexOf(source);
|
|
||||||
if (sourceIndex === -1)
|
|
||||||
sourceIndex = resolvedSources.indexOf(source);
|
|
||||||
if (sourceIndex === -1)
|
|
||||||
return all ? [] : GMapping(null, null);
|
|
||||||
const generated = (map._bySources || (map._bySources = buildBySources(decodedMappings(map), (map._bySourceMemos = sources.map(memoizedState)))));
|
|
||||||
const segments = generated[sourceIndex][line];
|
|
||||||
if (segments == null)
|
|
||||||
return all ? [] : GMapping(null, null);
|
|
||||||
const memo = map._bySourceMemos[sourceIndex];
|
|
||||||
if (all)
|
|
||||||
return sliceGeneratedPositions(segments, memo, line, column, bias);
|
|
||||||
const index = traceSegmentInternal(segments, memo, line, column, bias);
|
|
||||||
if (index === -1)
|
|
||||||
return GMapping(null, null);
|
|
||||||
const segment = segments[index];
|
|
||||||
return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]);
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
function clone(map, mappings) {
|
|
||||||
return {
|
|
||||||
version: map.version,
|
|
||||||
file: map.file,
|
|
||||||
names: map.names,
|
|
||||||
sourceRoot: map.sourceRoot,
|
|
||||||
sources: map.sources,
|
|
||||||
sourcesContent: map.sourcesContent,
|
|
||||||
mappings,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function OMapping(source, line, column, name) {
|
|
||||||
return { source, line, column, name };
|
|
||||||
}
|
|
||||||
function GMapping(line, column) {
|
|
||||||
return { line, column };
|
|
||||||
}
|
|
||||||
function traceSegmentInternal(segments, memo, line, column, bias) {
|
|
||||||
let index = memoizedBinarySearch(segments, column, memo, line);
|
|
||||||
if (found) {
|
|
||||||
index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);
|
|
||||||
}
|
|
||||||
else if (bias === LEAST_UPPER_BOUND)
|
|
||||||
index++;
|
|
||||||
if (index === -1 || index === segments.length)
|
|
||||||
return -1;
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function sliceGeneratedPositions(segments, memo, line, column, bias) {
|
|
||||||
let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND);
|
|
||||||
// We ignored the bias when tracing the segment so that we're guarnateed to find the first (in
|
|
||||||
// insertion order) segment that matched. Even if we did respect the bias when tracing, we would
|
|
||||||
// still need to call `lowerBound()` to find the first segment, which is slower than just looking
|
|
||||||
// for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the
|
|
||||||
// binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to
|
|
||||||
// match LEAST_UPPER_BOUND.
|
|
||||||
if (!found && bias === LEAST_UPPER_BOUND)
|
|
||||||
min++;
|
|
||||||
if (min === -1 || min === segments.length)
|
|
||||||
return [];
|
|
||||||
// We may have found the segment that started at an earlier column. If this is the case, then we
|
|
||||||
// need to slice all generated segments that match _that_ column, because all such segments span
|
|
||||||
// to our desired column.
|
|
||||||
const matchedColumn = found ? column : segments[min][COLUMN];
|
|
||||||
// The binary search is not guaranteed to find the lower bound when a match wasn't found.
|
|
||||||
if (!found)
|
|
||||||
min = lowerBound(segments, matchedColumn, min);
|
|
||||||
const max = upperBound(segments, matchedColumn, min);
|
|
||||||
const result = [];
|
|
||||||
for (; min <= max; min++) {
|
|
||||||
const segment = segments[min];
|
|
||||||
result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
export { AnyMap, GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap, allGeneratedPositionsFor, decodedMap, decodedMappings, eachMapping, encodedMap, encodedMappings, generatedPositionFor, originalPositionFor, presortedDecodedMap, sourceContentFor, traceSegment };
|
|
||||||
//# sourceMappingURL=trace-mapping.mjs.map
|
|
1
node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map
generated
vendored
1
node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map
generated
vendored
File diff suppressed because one or more lines are too long
566
node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js
generated
vendored
566
node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js
generated
vendored
@ -1,566 +0,0 @@
|
|||||||
(function (global, factory) {
|
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@jridgewell/sourcemap-codec'), require('@jridgewell/resolve-uri')) :
|
|
||||||
typeof define === 'function' && define.amd ? define(['exports', '@jridgewell/sourcemap-codec', '@jridgewell/resolve-uri'], factory) :
|
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.traceMapping = {}, global.sourcemapCodec, global.resolveURI));
|
|
||||||
})(this, (function (exports, sourcemapCodec, resolveUri) { 'use strict';
|
|
||||||
|
|
||||||
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
||||||
|
|
||||||
var resolveUri__default = /*#__PURE__*/_interopDefaultLegacy(resolveUri);
|
|
||||||
|
|
||||||
function resolve(input, base) {
|
|
||||||
// The base is always treated as a directory, if it's not empty.
|
|
||||||
// https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327
|
|
||||||
// https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401
|
|
||||||
if (base && !base.endsWith('/'))
|
|
||||||
base += '/';
|
|
||||||
return resolveUri__default["default"](input, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes everything after the last "/", but leaves the slash.
|
|
||||||
*/
|
|
||||||
function stripFilename(path) {
|
|
||||||
if (!path)
|
|
||||||
return '';
|
|
||||||
const index = path.lastIndexOf('/');
|
|
||||||
return path.slice(0, index + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const COLUMN = 0;
|
|
||||||
const SOURCES_INDEX = 1;
|
|
||||||
const SOURCE_LINE = 2;
|
|
||||||
const SOURCE_COLUMN = 3;
|
|
||||||
const NAMES_INDEX = 4;
|
|
||||||
const REV_GENERATED_LINE = 1;
|
|
||||||
const REV_GENERATED_COLUMN = 2;
|
|
||||||
|
|
||||||
function maybeSort(mappings, owned) {
|
|
||||||
const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);
|
|
||||||
if (unsortedIndex === mappings.length)
|
|
||||||
return mappings;
|
|
||||||
// If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If
|
|
||||||
// not, we do not want to modify the consumer's input array.
|
|
||||||
if (!owned)
|
|
||||||
mappings = mappings.slice();
|
|
||||||
for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {
|
|
||||||
mappings[i] = sortSegments(mappings[i], owned);
|
|
||||||
}
|
|
||||||
return mappings;
|
|
||||||
}
|
|
||||||
function nextUnsortedSegmentLine(mappings, start) {
|
|
||||||
for (let i = start; i < mappings.length; i++) {
|
|
||||||
if (!isSorted(mappings[i]))
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return mappings.length;
|
|
||||||
}
|
|
||||||
function isSorted(line) {
|
|
||||||
for (let j = 1; j < line.length; j++) {
|
|
||||||
if (line[j][COLUMN] < line[j - 1][COLUMN]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
function sortSegments(line, owned) {
|
|
||||||
if (!owned)
|
|
||||||
line = line.slice();
|
|
||||||
return line.sort(sortComparator);
|
|
||||||
}
|
|
||||||
function sortComparator(a, b) {
|
|
||||||
return a[COLUMN] - b[COLUMN];
|
|
||||||
}
|
|
||||||
|
|
||||||
let found = false;
|
|
||||||
/**
|
|
||||||
* A binary search implementation that returns the index if a match is found.
|
|
||||||
* If no match is found, then the left-index (the index associated with the item that comes just
|
|
||||||
* before the desired index) is returned. To maintain proper sort order, a splice would happen at
|
|
||||||
* the next index:
|
|
||||||
*
|
|
||||||
* ```js
|
|
||||||
* const array = [1, 3];
|
|
||||||
* const needle = 2;
|
|
||||||
* const index = binarySearch(array, needle, (item, needle) => item - needle);
|
|
||||||
*
|
|
||||||
* assert.equal(index, 0);
|
|
||||||
* array.splice(index + 1, 0, needle);
|
|
||||||
* assert.deepEqual(array, [1, 2, 3]);
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
function binarySearch(haystack, needle, low, high) {
|
|
||||||
while (low <= high) {
|
|
||||||
const mid = low + ((high - low) >> 1);
|
|
||||||
const cmp = haystack[mid][COLUMN] - needle;
|
|
||||||
if (cmp === 0) {
|
|
||||||
found = true;
|
|
||||||
return mid;
|
|
||||||
}
|
|
||||||
if (cmp < 0) {
|
|
||||||
low = mid + 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
high = mid - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
found = false;
|
|
||||||
return low - 1;
|
|
||||||
}
|
|
||||||
function upperBound(haystack, needle, index) {
|
|
||||||
for (let i = index + 1; i < haystack.length; index = i++) {
|
|
||||||
if (haystack[i][COLUMN] !== needle)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function lowerBound(haystack, needle, index) {
|
|
||||||
for (let i = index - 1; i >= 0; index = i--) {
|
|
||||||
if (haystack[i][COLUMN] !== needle)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function memoizedState() {
|
|
||||||
return {
|
|
||||||
lastKey: -1,
|
|
||||||
lastNeedle: -1,
|
|
||||||
lastIndex: -1,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This overly complicated beast is just to record the last tested line/column and the resulting
|
|
||||||
* index, allowing us to skip a few tests if mappings are monotonically increasing.
|
|
||||||
*/
|
|
||||||
function memoizedBinarySearch(haystack, needle, state, key) {
|
|
||||||
const { lastKey, lastNeedle, lastIndex } = state;
|
|
||||||
let low = 0;
|
|
||||||
let high = haystack.length - 1;
|
|
||||||
if (key === lastKey) {
|
|
||||||
if (needle === lastNeedle) {
|
|
||||||
found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;
|
|
||||||
return lastIndex;
|
|
||||||
}
|
|
||||||
if (needle >= lastNeedle) {
|
|
||||||
// lastIndex may be -1 if the previous needle was not found.
|
|
||||||
low = lastIndex === -1 ? 0 : lastIndex;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
high = lastIndex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state.lastKey = key;
|
|
||||||
state.lastNeedle = needle;
|
|
||||||
return (state.lastIndex = binarySearch(haystack, needle, low, high));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rebuilds the original source files, with mappings that are ordered by source line/column instead
|
|
||||||
// of generated line/column.
|
|
||||||
function buildBySources(decoded, memos) {
|
|
||||||
const sources = memos.map(buildNullArray);
|
|
||||||
for (let i = 0; i < decoded.length; i++) {
|
|
||||||
const line = decoded[i];
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const seg = line[j];
|
|
||||||
if (seg.length === 1)
|
|
||||||
continue;
|
|
||||||
const sourceIndex = seg[SOURCES_INDEX];
|
|
||||||
const sourceLine = seg[SOURCE_LINE];
|
|
||||||
const sourceColumn = seg[SOURCE_COLUMN];
|
|
||||||
const originalSource = sources[sourceIndex];
|
|
||||||
const originalLine = (originalSource[sourceLine] || (originalSource[sourceLine] = []));
|
|
||||||
const memo = memos[sourceIndex];
|
|
||||||
// The binary search either found a match, or it found the left-index just before where the
|
|
||||||
// segment should go. Either way, we want to insert after that. And there may be multiple
|
|
||||||
// generated segments associated with an original location, so there may need to move several
|
|
||||||
// indexes before we find where we need to insert.
|
|
||||||
const index = upperBound(originalLine, sourceColumn, memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine));
|
|
||||||
insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sources;
|
|
||||||
}
|
|
||||||
function insert(array, index, value) {
|
|
||||||
for (let i = array.length; i > index; i--) {
|
|
||||||
array[i] = array[i - 1];
|
|
||||||
}
|
|
||||||
array[index] = value;
|
|
||||||
}
|
|
||||||
// Null arrays allow us to use ordered index keys without actually allocating contiguous memory like
|
|
||||||
// a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.
|
|
||||||
// Numeric properties on objects are magically sorted in ascending order by the engine regardless of
|
|
||||||
// the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending
|
|
||||||
// order when iterating with for-in.
|
|
||||||
function buildNullArray() {
|
|
||||||
return { __proto__: null };
|
|
||||||
}
|
|
||||||
|
|
||||||
const AnyMap = function (map, mapUrl) {
|
|
||||||
const parsed = typeof map === 'string' ? JSON.parse(map) : map;
|
|
||||||
if (!('sections' in parsed))
|
|
||||||
return new TraceMap(parsed, mapUrl);
|
|
||||||
const mappings = [];
|
|
||||||
const sources = [];
|
|
||||||
const sourcesContent = [];
|
|
||||||
const names = [];
|
|
||||||
recurse(parsed, mapUrl, mappings, sources, sourcesContent, names, 0, 0, Infinity, Infinity);
|
|
||||||
const joined = {
|
|
||||||
version: 3,
|
|
||||||
file: parsed.file,
|
|
||||||
names,
|
|
||||||
sources,
|
|
||||||
sourcesContent,
|
|
||||||
mappings,
|
|
||||||
};
|
|
||||||
return exports.presortedDecodedMap(joined);
|
|
||||||
};
|
|
||||||
function recurse(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {
|
|
||||||
const { sections } = input;
|
|
||||||
for (let i = 0; i < sections.length; i++) {
|
|
||||||
const { map, offset } = sections[i];
|
|
||||||
let sl = stopLine;
|
|
||||||
let sc = stopColumn;
|
|
||||||
if (i + 1 < sections.length) {
|
|
||||||
const nextOffset = sections[i + 1].offset;
|
|
||||||
sl = Math.min(stopLine, lineOffset + nextOffset.line);
|
|
||||||
if (sl === stopLine) {
|
|
||||||
sc = Math.min(stopColumn, columnOffset + nextOffset.column);
|
|
||||||
}
|
|
||||||
else if (sl < stopLine) {
|
|
||||||
sc = columnOffset + nextOffset.column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addSection(map, mapUrl, mappings, sources, sourcesContent, names, lineOffset + offset.line, columnOffset + offset.column, sl, sc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function addSection(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {
|
|
||||||
if ('sections' in input)
|
|
||||||
return recurse(...arguments);
|
|
||||||
const map = new TraceMap(input, mapUrl);
|
|
||||||
const sourcesOffset = sources.length;
|
|
||||||
const namesOffset = names.length;
|
|
||||||
const decoded = exports.decodedMappings(map);
|
|
||||||
const { resolvedSources, sourcesContent: contents } = map;
|
|
||||||
append(sources, resolvedSources);
|
|
||||||
append(names, map.names);
|
|
||||||
if (contents)
|
|
||||||
append(sourcesContent, contents);
|
|
||||||
else
|
|
||||||
for (let i = 0; i < resolvedSources.length; i++)
|
|
||||||
sourcesContent.push(null);
|
|
||||||
for (let i = 0; i < decoded.length; i++) {
|
|
||||||
const lineI = lineOffset + i;
|
|
||||||
// We can only add so many lines before we step into the range that the next section's map
|
|
||||||
// controls. When we get to the last line, then we'll start checking the segments to see if
|
|
||||||
// they've crossed into the column range. But it may not have any columns that overstep, so we
|
|
||||||
// still need to check that we don't overstep lines, too.
|
|
||||||
if (lineI > stopLine)
|
|
||||||
return;
|
|
||||||
// The out line may already exist in mappings (if we're continuing the line started by a
|
|
||||||
// previous section). Or, we may have jumped ahead several lines to start this section.
|
|
||||||
const out = getLine(mappings, lineI);
|
|
||||||
// On the 0th loop, the section's column offset shifts us forward. On all other lines (since the
|
|
||||||
// map can be multiple lines), it doesn't.
|
|
||||||
const cOffset = i === 0 ? columnOffset : 0;
|
|
||||||
const line = decoded[i];
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const seg = line[j];
|
|
||||||
const column = cOffset + seg[COLUMN];
|
|
||||||
// If this segment steps into the column range that the next section's map controls, we need
|
|
||||||
// to stop early.
|
|
||||||
if (lineI === stopLine && column >= stopColumn)
|
|
||||||
return;
|
|
||||||
if (seg.length === 1) {
|
|
||||||
out.push([column]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];
|
|
||||||
const sourceLine = seg[SOURCE_LINE];
|
|
||||||
const sourceColumn = seg[SOURCE_COLUMN];
|
|
||||||
out.push(seg.length === 4
|
|
||||||
? [column, sourcesIndex, sourceLine, sourceColumn]
|
|
||||||
: [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function append(arr, other) {
|
|
||||||
for (let i = 0; i < other.length; i++)
|
|
||||||
arr.push(other[i]);
|
|
||||||
}
|
|
||||||
function getLine(arr, index) {
|
|
||||||
for (let i = arr.length; i <= index; i++)
|
|
||||||
arr[i] = [];
|
|
||||||
return arr[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';
|
|
||||||
const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';
|
|
||||||
const LEAST_UPPER_BOUND = -1;
|
|
||||||
const GREATEST_LOWER_BOUND = 1;
|
|
||||||
/**
|
|
||||||
* Returns the encoded (VLQ string) form of the SourceMap's mappings field.
|
|
||||||
*/
|
|
||||||
exports.encodedMappings = void 0;
|
|
||||||
/**
|
|
||||||
* Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.
|
|
||||||
*/
|
|
||||||
exports.decodedMappings = void 0;
|
|
||||||
/**
|
|
||||||
* A low-level API to find the segment associated with a generated line/column (think, from a
|
|
||||||
* stack trace). Line and column here are 0-based, unlike `originalPositionFor`.
|
|
||||||
*/
|
|
||||||
exports.traceSegment = void 0;
|
|
||||||
/**
|
|
||||||
* A higher-level API to find the source/line/column associated with a generated line/column
|
|
||||||
* (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in
|
|
||||||
* `source-map` library.
|
|
||||||
*/
|
|
||||||
exports.originalPositionFor = void 0;
|
|
||||||
/**
|
|
||||||
* Finds the generated line/column position of the provided source/line/column source position.
|
|
||||||
*/
|
|
||||||
exports.generatedPositionFor = void 0;
|
|
||||||
/**
|
|
||||||
* Finds all generated line/column positions of the provided source/line/column source position.
|
|
||||||
*/
|
|
||||||
exports.allGeneratedPositionsFor = void 0;
|
|
||||||
/**
|
|
||||||
* Iterates each mapping in generated position order.
|
|
||||||
*/
|
|
||||||
exports.eachMapping = void 0;
|
|
||||||
/**
|
|
||||||
* Retrieves the source content for a particular source, if its found. Returns null if not.
|
|
||||||
*/
|
|
||||||
exports.sourceContentFor = void 0;
|
|
||||||
/**
|
|
||||||
* A helper that skips sorting of the input map's mappings array, which can be expensive for larger
|
|
||||||
* maps.
|
|
||||||
*/
|
|
||||||
exports.presortedDecodedMap = void 0;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
exports.decodedMap = void 0;
|
|
||||||
/**
|
|
||||||
* Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
|
|
||||||
* a sourcemap, or to JSON.stringify.
|
|
||||||
*/
|
|
||||||
exports.encodedMap = void 0;
|
|
||||||
class TraceMap {
|
|
||||||
constructor(map, mapUrl) {
|
|
||||||
const isString = typeof map === 'string';
|
|
||||||
if (!isString && map._decodedMemo)
|
|
||||||
return map;
|
|
||||||
const parsed = (isString ? JSON.parse(map) : map);
|
|
||||||
const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
|
|
||||||
this.version = version;
|
|
||||||
this.file = file;
|
|
||||||
this.names = names;
|
|
||||||
this.sourceRoot = sourceRoot;
|
|
||||||
this.sources = sources;
|
|
||||||
this.sourcesContent = sourcesContent;
|
|
||||||
const from = resolve(sourceRoot || '', stripFilename(mapUrl));
|
|
||||||
this.resolvedSources = sources.map((s) => resolve(s || '', from));
|
|
||||||
const { mappings } = parsed;
|
|
||||||
if (typeof mappings === 'string') {
|
|
||||||
this._encoded = mappings;
|
|
||||||
this._decoded = undefined;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this._encoded = undefined;
|
|
||||||
this._decoded = maybeSort(mappings, isString);
|
|
||||||
}
|
|
||||||
this._decodedMemo = memoizedState();
|
|
||||||
this._bySources = undefined;
|
|
||||||
this._bySourceMemos = undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(() => {
|
|
||||||
exports.encodedMappings = (map) => {
|
|
||||||
var _a;
|
|
||||||
return ((_a = map._encoded) !== null && _a !== void 0 ? _a : (map._encoded = sourcemapCodec.encode(map._decoded)));
|
|
||||||
};
|
|
||||||
exports.decodedMappings = (map) => {
|
|
||||||
return (map._decoded || (map._decoded = sourcemapCodec.decode(map._encoded)));
|
|
||||||
};
|
|
||||||
exports.traceSegment = (map, line, column) => {
|
|
||||||
const decoded = exports.decodedMappings(map);
|
|
||||||
// It's common for parent source maps to have pointers to lines that have no
|
|
||||||
// mapping (like a "//# sourceMappingURL=") at the end of the child file.
|
|
||||||
if (line >= decoded.length)
|
|
||||||
return null;
|
|
||||||
const segments = decoded[line];
|
|
||||||
const index = traceSegmentInternal(segments, map._decodedMemo, line, column, GREATEST_LOWER_BOUND);
|
|
||||||
return index === -1 ? null : segments[index];
|
|
||||||
};
|
|
||||||
exports.originalPositionFor = (map, { line, column, bias }) => {
|
|
||||||
line--;
|
|
||||||
if (line < 0)
|
|
||||||
throw new Error(LINE_GTR_ZERO);
|
|
||||||
if (column < 0)
|
|
||||||
throw new Error(COL_GTR_EQ_ZERO);
|
|
||||||
const decoded = exports.decodedMappings(map);
|
|
||||||
// It's common for parent source maps to have pointers to lines that have no
|
|
||||||
// mapping (like a "//# sourceMappingURL=") at the end of the child file.
|
|
||||||
if (line >= decoded.length)
|
|
||||||
return OMapping(null, null, null, null);
|
|
||||||
const segments = decoded[line];
|
|
||||||
const index = traceSegmentInternal(segments, map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
|
|
||||||
if (index === -1)
|
|
||||||
return OMapping(null, null, null, null);
|
|
||||||
const segment = segments[index];
|
|
||||||
if (segment.length === 1)
|
|
||||||
return OMapping(null, null, null, null);
|
|
||||||
const { names, resolvedSources } = map;
|
|
||||||
return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);
|
|
||||||
};
|
|
||||||
exports.allGeneratedPositionsFor = (map, { source, line, column, bias }) => {
|
|
||||||
// SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit.
|
|
||||||
return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true);
|
|
||||||
};
|
|
||||||
exports.generatedPositionFor = (map, { source, line, column, bias }) => {
|
|
||||||
return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false);
|
|
||||||
};
|
|
||||||
exports.eachMapping = (map, cb) => {
|
|
||||||
const decoded = exports.decodedMappings(map);
|
|
||||||
const { names, resolvedSources } = map;
|
|
||||||
for (let i = 0; i < decoded.length; i++) {
|
|
||||||
const line = decoded[i];
|
|
||||||
for (let j = 0; j < line.length; j++) {
|
|
||||||
const seg = line[j];
|
|
||||||
const generatedLine = i + 1;
|
|
||||||
const generatedColumn = seg[0];
|
|
||||||
let source = null;
|
|
||||||
let originalLine = null;
|
|
||||||
let originalColumn = null;
|
|
||||||
let name = null;
|
|
||||||
if (seg.length !== 1) {
|
|
||||||
source = resolvedSources[seg[1]];
|
|
||||||
originalLine = seg[2] + 1;
|
|
||||||
originalColumn = seg[3];
|
|
||||||
}
|
|
||||||
if (seg.length === 5)
|
|
||||||
name = names[seg[4]];
|
|
||||||
cb({
|
|
||||||
generatedLine,
|
|
||||||
generatedColumn,
|
|
||||||
source,
|
|
||||||
originalLine,
|
|
||||||
originalColumn,
|
|
||||||
name,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
exports.sourceContentFor = (map, source) => {
|
|
||||||
const { sources, resolvedSources, sourcesContent } = map;
|
|
||||||
if (sourcesContent == null)
|
|
||||||
return null;
|
|
||||||
let index = sources.indexOf(source);
|
|
||||||
if (index === -1)
|
|
||||||
index = resolvedSources.indexOf(source);
|
|
||||||
return index === -1 ? null : sourcesContent[index];
|
|
||||||
};
|
|
||||||
exports.presortedDecodedMap = (map, mapUrl) => {
|
|
||||||
const tracer = new TraceMap(clone(map, []), mapUrl);
|
|
||||||
tracer._decoded = map.mappings;
|
|
||||||
return tracer;
|
|
||||||
};
|
|
||||||
exports.decodedMap = (map) => {
|
|
||||||
return clone(map, exports.decodedMappings(map));
|
|
||||||
};
|
|
||||||
exports.encodedMap = (map) => {
|
|
||||||
return clone(map, exports.encodedMappings(map));
|
|
||||||
};
|
|
||||||
function generatedPosition(map, source, line, column, bias, all) {
|
|
||||||
line--;
|
|
||||||
if (line < 0)
|
|
||||||
throw new Error(LINE_GTR_ZERO);
|
|
||||||
if (column < 0)
|
|
||||||
throw new Error(COL_GTR_EQ_ZERO);
|
|
||||||
const { sources, resolvedSources } = map;
|
|
||||||
let sourceIndex = sources.indexOf(source);
|
|
||||||
if (sourceIndex === -1)
|
|
||||||
sourceIndex = resolvedSources.indexOf(source);
|
|
||||||
if (sourceIndex === -1)
|
|
||||||
return all ? [] : GMapping(null, null);
|
|
||||||
const generated = (map._bySources || (map._bySources = buildBySources(exports.decodedMappings(map), (map._bySourceMemos = sources.map(memoizedState)))));
|
|
||||||
const segments = generated[sourceIndex][line];
|
|
||||||
if (segments == null)
|
|
||||||
return all ? [] : GMapping(null, null);
|
|
||||||
const memo = map._bySourceMemos[sourceIndex];
|
|
||||||
if (all)
|
|
||||||
return sliceGeneratedPositions(segments, memo, line, column, bias);
|
|
||||||
const index = traceSegmentInternal(segments, memo, line, column, bias);
|
|
||||||
if (index === -1)
|
|
||||||
return GMapping(null, null);
|
|
||||||
const segment = segments[index];
|
|
||||||
return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]);
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
function clone(map, mappings) {
|
|
||||||
return {
|
|
||||||
version: map.version,
|
|
||||||
file: map.file,
|
|
||||||
names: map.names,
|
|
||||||
sourceRoot: map.sourceRoot,
|
|
||||||
sources: map.sources,
|
|
||||||
sourcesContent: map.sourcesContent,
|
|
||||||
mappings,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function OMapping(source, line, column, name) {
|
|
||||||
return { source, line, column, name };
|
|
||||||
}
|
|
||||||
function GMapping(line, column) {
|
|
||||||
return { line, column };
|
|
||||||
}
|
|
||||||
function traceSegmentInternal(segments, memo, line, column, bias) {
|
|
||||||
let index = memoizedBinarySearch(segments, column, memo, line);
|
|
||||||
if (found) {
|
|
||||||
index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);
|
|
||||||
}
|
|
||||||
else if (bias === LEAST_UPPER_BOUND)
|
|
||||||
index++;
|
|
||||||
if (index === -1 || index === segments.length)
|
|
||||||
return -1;
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
function sliceGeneratedPositions(segments, memo, line, column, bias) {
|
|
||||||
let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND);
|
|
||||||
// We ignored the bias when tracing the segment so that we're guarnateed to find the first (in
|
|
||||||
// insertion order) segment that matched. Even if we did respect the bias when tracing, we would
|
|
||||||
// still need to call `lowerBound()` to find the first segment, which is slower than just looking
|
|
||||||
// for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the
|
|
||||||
// binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to
|
|
||||||
// match LEAST_UPPER_BOUND.
|
|
||||||
if (!found && bias === LEAST_UPPER_BOUND)
|
|
||||||
min++;
|
|
||||||
if (min === -1 || min === segments.length)
|
|
||||||
return [];
|
|
||||||
// We may have found the segment that started at an earlier column. If this is the case, then we
|
|
||||||
// need to slice all generated segments that match _that_ column, because all such segments span
|
|
||||||
// to our desired column.
|
|
||||||
const matchedColumn = found ? column : segments[min][COLUMN];
|
|
||||||
// The binary search is not guaranteed to find the lower bound when a match wasn't found.
|
|
||||||
if (!found)
|
|
||||||
min = lowerBound(segments, matchedColumn, min);
|
|
||||||
const max = upperBound(segments, matchedColumn, min);
|
|
||||||
const result = [];
|
|
||||||
for (; min <= max; min++) {
|
|
||||||
const segment = segments[min];
|
|
||||||
result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.AnyMap = AnyMap;
|
|
||||||
exports.GREATEST_LOWER_BOUND = GREATEST_LOWER_BOUND;
|
|
||||||
exports.LEAST_UPPER_BOUND = LEAST_UPPER_BOUND;
|
|
||||||
exports.TraceMap = TraceMap;
|
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
|
||||||
|
|
||||||
}));
|
|
||||||
//# sourceMappingURL=trace-mapping.umd.js.map
|
|
1
node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map
generated
vendored
1
node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map
generated
vendored
File diff suppressed because one or more lines are too long
8
node_modules/@jridgewell/trace-mapping/dist/types/any-map.d.ts
generated
vendored
8
node_modules/@jridgewell/trace-mapping/dist/types/any-map.d.ts
generated
vendored
@ -1,8 +0,0 @@
|
|||||||
import { TraceMap } from './trace-mapping';
|
|
||||||
import type { SectionedSourceMapInput } from './types';
|
|
||||||
declare type AnyMap = {
|
|
||||||
new (map: SectionedSourceMapInput, mapUrl?: string | null): TraceMap;
|
|
||||||
(map: SectionedSourceMapInput, mapUrl?: string | null): TraceMap;
|
|
||||||
};
|
|
||||||
export declare const AnyMap: AnyMap;
|
|
||||||
export {};
|
|
32
node_modules/@jridgewell/trace-mapping/dist/types/binary-search.d.ts
generated
vendored
32
node_modules/@jridgewell/trace-mapping/dist/types/binary-search.d.ts
generated
vendored
@ -1,32 +0,0 @@
|
|||||||
import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment';
|
|
||||||
export declare type MemoState = {
|
|
||||||
lastKey: number;
|
|
||||||
lastNeedle: number;
|
|
||||||
lastIndex: number;
|
|
||||||
};
|
|
||||||
export declare let found: boolean;
|
|
||||||
/**
|
|
||||||
* A binary search implementation that returns the index if a match is found.
|
|
||||||
* If no match is found, then the left-index (the index associated with the item that comes just
|
|
||||||
* before the desired index) is returned. To maintain proper sort order, a splice would happen at
|
|
||||||
* the next index:
|
|
||||||
*
|
|
||||||
* ```js
|
|
||||||
* const array = [1, 3];
|
|
||||||
* const needle = 2;
|
|
||||||
* const index = binarySearch(array, needle, (item, needle) => item - needle);
|
|
||||||
*
|
|
||||||
* assert.equal(index, 0);
|
|
||||||
* array.splice(index + 1, 0, needle);
|
|
||||||
* assert.deepEqual(array, [1, 2, 3]);
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
export declare function binarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, low: number, high: number): number;
|
|
||||||
export declare function upperBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number;
|
|
||||||
export declare function lowerBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number;
|
|
||||||
export declare function memoizedState(): MemoState;
|
|
||||||
/**
|
|
||||||
* This overly complicated beast is just to record the last tested line/column and the resulting
|
|
||||||
* index, allowing us to skip a few tests if mappings are monotonically increasing.
|
|
||||||
*/
|
|
||||||
export declare function memoizedBinarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, state: MemoState, key: number): number;
|
|
7
node_modules/@jridgewell/trace-mapping/dist/types/by-source.d.ts
generated
vendored
7
node_modules/@jridgewell/trace-mapping/dist/types/by-source.d.ts
generated
vendored
@ -1,7 +0,0 @@
|
|||||||
import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment';
|
|
||||||
import type { MemoState } from './binary-search';
|
|
||||||
export declare type Source = {
|
|
||||||
__proto__: null;
|
|
||||||
[line: number]: Exclude<ReverseSegment, [number]>[];
|
|
||||||
};
|
|
||||||
export default function buildBySources(decoded: readonly SourceMapSegment[][], memos: MemoState[]): Source[];
|
|
1
node_modules/@jridgewell/trace-mapping/dist/types/resolve.d.ts
generated
vendored
1
node_modules/@jridgewell/trace-mapping/dist/types/resolve.d.ts
generated
vendored
@ -1 +0,0 @@
|
|||||||
export default function resolve(input: string, base: string | undefined): string;
|
|
2
node_modules/@jridgewell/trace-mapping/dist/types/sort.d.ts
generated
vendored
2
node_modules/@jridgewell/trace-mapping/dist/types/sort.d.ts
generated
vendored
@ -1,2 +0,0 @@
|
|||||||
import type { SourceMapSegment } from './sourcemap-segment';
|
|
||||||
export default function maybeSort(mappings: SourceMapSegment[][], owned: boolean): SourceMapSegment[][];
|
|
16
node_modules/@jridgewell/trace-mapping/dist/types/sourcemap-segment.d.ts
generated
vendored
16
node_modules/@jridgewell/trace-mapping/dist/types/sourcemap-segment.d.ts
generated
vendored
@ -1,16 +0,0 @@
|
|||||||
declare type GeneratedColumn = number;
|
|
||||||
declare type SourcesIndex = number;
|
|
||||||
declare type SourceLine = number;
|
|
||||||
declare type SourceColumn = number;
|
|
||||||
declare type NamesIndex = number;
|
|
||||||
declare type GeneratedLine = number;
|
|
||||||
export declare type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex];
|
|
||||||
export declare type ReverseSegment = [SourceColumn, GeneratedLine, GeneratedColumn];
|
|
||||||
export declare const COLUMN = 0;
|
|
||||||
export declare const SOURCES_INDEX = 1;
|
|
||||||
export declare const SOURCE_LINE = 2;
|
|
||||||
export declare const SOURCE_COLUMN = 3;
|
|
||||||
export declare const NAMES_INDEX = 4;
|
|
||||||
export declare const REV_GENERATED_LINE = 1;
|
|
||||||
export declare const REV_GENERATED_COLUMN = 2;
|
|
||||||
export {};
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user