7e431b4d by 杨炀

init

0 parents
Showing 1000 changed files with 4635 additions and 0 deletions

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

<script>
import {
h5Login
} from '@/common/login.js';
import * as api from '@/common/api.js';
import config from '@/config.js';
let loginUrl=['pages/index/login', 'pages/index/register']
let firstload = false
export default {
onLaunch: function(options) {
console.log('App Launch', options);
firstload = true
this.globalData.baseUrl_api = config.baseUrl_api;
let userName = uni.getStorageSync('userName')
if (userName) {
this.globalData.isLogin = true;
} else {
this.globalData.isLogin = false;
}
},
onShow: function() {
console.log('App Show');
},
onHide: function() {
console.log('App Hide');
}
};
</script>
<style lang="scss">
/*每个页面公共css */
@import '/common/uni.css';
@import '/common/mystyle.scss';
@import '@/static/font/iconfont.css';
</style>
\ No newline at end of file
import CryptoJS from 'crypto-js'
/**
* 使用ase加密
* @param word 需要加密的参数
* @param keyStr 加密的key
*/
const _encrypt = (word, keyStr) => {
keyStr = keyStr || '8751276152370123'
const key = CryptoJS.enc.Utf8.parse(keyStr)
const iv = CryptoJS.enc.Utf8.parse('0000000000000000')
const src = CryptoJS.enc.Utf8.parse(word)
const encrypted = CryptoJS.AES.encrypt(src, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
})
return encrypted.toString()
}
/**
* 使用ase解密
* @param word 需要解密的参数
* @param keyStr 解密的key
*/
const _decrypt = (word, keyStr) => {
keyStr = keyStr || '8751276152370123'
const key = CryptoJS.enc.Utf8.parse(keyStr)
const iv = CryptoJS.enc.Utf8.parse('0000000000000000')
const decrypt = CryptoJS.AES.decrypt(word, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
})
return CryptoJS.enc.Utf8.stringify(decrypt).toString()
}
export default {
encrypt: _encrypt,
decrypt: _decrypt
}
import request from './request.js'
import config from '@/config.js'
import * as loginServer from '@/common/login.js';
export function getMessage(params) {
return request({
url: '/common/home/getMessage',
method: 'get',
params: params
})
}
import request from './request'
import config from '@/config.js'
import aes from '@/common/aes.js'
function pcLogin(data) {
return request({
// url: '/login',
url: `${config.baseUrl_api}/loginZtx`,
method: 'post',
headers: {
isToken: false
},
params: data
}).then((res) => {
uni.setStorageSync('token', 'Bearer ' + res.data.token)
})
.then(getInfo)
}
function h5Login(userName) {
return request({
url: `/h5Login`,
method: 'post',
params: {
username: userName
}
}).then((res) => {
uni.setStorageSync('token', 'Bearer ' + res.data.token)
}).then(getInfo)
}
function h5LoginAuto() {
const userName = uni.getStorageSync('userName')
if (userName) {
return h5Login(userName)
} else {
uni.redirectTo({
url: '/pages/index/login'
})
}
}
function logout() {
return request({
url: '/logout',
method: 'post'
}).then(() => {
uni.removeStorageSync('token')
uni.removeStorageSync('userName')
})
}
function getCodeImg() {
return request({
url: `${config.baseUrl_api}/captchaImage`,
method: 'get'
})
}
// 代退图形认证的获取手机验证码
function getSmsCode(data) {
return request({
url: '/captchaSmsWithCaptchaImage',
method: 'post',
params: data
})
}
function loginByPhone(phonenumber, code) {
const data = {
phonenumber,
code
}
return request({
url: '/userLoginByPhone',
method: 'post',
params: data
}).then((res) => {
uni.setStorageSync('token', 'Bearer ' + res.data.token)
}).then(getInfo)
}
// 获取用户详细信息
function getInfo() {
return request({
url: `${config.baseUrl_api}/getInfo`,
method: 'get'
}).then(res => {
const app = getApp()
const user = res.data.user
const personInfo = res.data.personInfo
uni.setStorageSync('userName', user.userName)
uni.setStorageSync('perId', aes.encrypt(personInfo.perId))
app.globalData.deptType = user.dept.deptType
app.globalData.userInfo = user
})
}
// 团队会员用户注册接口
function groupMemberRegister(data) {
return request({
url: '/groupMemberRegister',
method: 'post',
params: data
})
}
// 获取道馆信息
function getMyOwnMemberInfo() {
return request({
url: '/member/info/getMyOwnMemberInfo',
method: 'get'
}).then(res => {
const app = getApp()
app.globalData.authenticationStatus = res.data.authenticationStatus
app.globalData.memberInfo = res.data.memberInfo
app.globalData.isExam = res.data?.dept?.isExam
})
}
//for match
function getWxUserPhone(phoneRes) {
const currUser = uni.getStorageSync('currUser');
// getNowOpenId()
const nowOpenId = uni.getStorageSync('nowOpenId');
return request({
url: `/system/wx/updateMobile?openId=${nowOpenId}`,
method: "POST",
params: {
appId: appId,
userId: currUser.id,
encryptedData: phoneRes.encryptedData,
errMsg: phoneRes.errMsg,
iv: phoneRes.iv,
rawData: phoneRes.rawData,
signature: phoneRes.signature
}
}).then((res) => {
let user = res.data;
// uni.setStorageSync('token', 'Bearer '+ user.token);
uni.setStorageSync('token', user.token);
uni.setStorageSync('currUser', user);
return user
})
}
function checkUserAuth(path) {
const app = getApp()
if (app.globalData.isLogin) {
return true
} else {
uni.navigateTo({
url: '/pages/index/binding?path=' + encodeURIComponent(path)
})
return false;
}
}
export {
pcLogin,getInfo,
getCodeImg,
getSmsCode,
h5Login,
h5LoginAuto,
loginByPhone,
groupMemberRegister,
getMyOwnMemberInfo,
logout,
getWxUserPhone,checkUserAuth
}
This diff could not be displayed because it is too large.
// import config from '@/config.js'
import {
h5LoginAuto
} from './login'
const excludeUrls = ['pages/index/login', 'pages/index/register']
// 获取Token
function getToken() {
try {
const token = uni.getStorageSync('token')
if (token) {
return token
} else {
return ''
}
} catch (e) {
console.log(e)
}
}
// 获取请求头
function getHeaders() {
const token = getToken()
const header = {
'Authorization': token,
'Content-Type': 'application/json', // 根据自己的数据类型
// "Content-Type":"application/x-www-form-urlencoded",
'Ztx-Per-Id': uni.getStorageSync('perId') || '-1'
}
return header
}
const request = function(req) {
req.method = req.method.toUpperCase()
if (!['GET', 'POST', 'PUT', 'DELETE'].includes(req.method)) {
uni.showToast({
title: `暂不支持的请求方式: ${req.method}`,
icon: 'none'
})
return
}
// if (req.method === 'GET') {
// if (!req.params) {
// req.params = {}
// }
// req.params.pageNum = req.params.pageNum || 1
// req.params.pageSize = req.params.pageSize || 50
// }
// if (req.method == 'POST' && !req.hideLoding) {
// uni.showLoading({
// title: '提交中...'
// })
// }
return new Promise((resolve, reject) => {
uni.request({
url: req.url,
method: req.method,
data: req.params,
header: getHeaders()
}).then(res => {
switch (res.statusCode) {
case 200:
const data = res.data || {}
if (!data || data.code === 0 || data.code === 200 || data.pageData?.code ===
200) {
resolve(data)
} else if (req.url.indexOf('getMemberCountInfo') > -1) {
resolve(data)
} else {
if (data.msg) {
uni.showToast({
title: data.msg,
icon: 'none',
duration: 2000
})
}
// 登录超时
if (data.code === 60002 || data.code === 60001) {
uni.redirectTo({
url: '/pages/index/login'
})
} else if (data.code === 401) {
h5LoginAuto()
.then(() => {
uni.hideLoading()
uni.redirectTo({
url: getCurrentPages()[getCurrentPages()
.length - 1].$page.fullPath
})
})
.catch(() => {
uni.showToast({
title: '服务异常,请稍后重试',
icon: 'none'
})
})
}
reject(res)
}
break
default:
reject(res)
}
}).catch(res => {
reject(res)
}).finally(() => {
// if (req.method == 'POST' && !req.hideLoding) {
// uni.hideLoading()
// }
})
})
}
export default request
\ No newline at end of file
// prod
// const baseUrl_api = 'https://research.wtwuxicenter.com/';
// staging 会员系统
// const baseUrl_api = "http://123.60.96.243/stage-api/";
// const baseUrl_api = 'https://ztx.itechtop.cn/stage-api'
// const baseUrl_api = 'https://newsystem.taekwondo.org.cn/stage-api/'
// train
const baseUrl_api = 'http://192.168.1.11:8787'
const trainUrl_api = 'http://192.168.1.25:8686'
//match
// const baseUrl_api = 'http://192.168.1.132:8081'
export default {
baseUrl_api,
trainUrl_api
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title>工作台</title>
<!--preload-links-->
<!--app-context-->
<style>
* {
box-sizing: border-box;
}
</style>
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>
import App from './App'
// #ifndef VUE3
import Vue from 'vue'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()
// #endif
// #ifdef VUE3
import {
createSSRApp
} from 'vue'
export function createApp() {
const app = createSSRApp(App)
return {
app
}
}
// #endif
{
"name" : "ztx_wx_minapp",
"appid" : "__UNI__580BCB0",
"description" : "",
"versionName" : "1.0.1",
"versionCode" : "100",
"transformPx" : false,
/* 5+App特有相关 */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* 模块配置 */
"modules" : {},
/* 应用发布信息 */
"distribute" : {
/* android打包配置 */
"android" : {
"permissions" : [],
"autoSdkPermissions" : true
},
/* ios打包配置 */
"ios" : {
"permissions" : [],
"autoSdkPermissions" : true
},
/* SDK配置 */
"sdkConfigs" : {}
}
},
/* 快应用特有相关 */
"quickapp" : {},
/* 小程序特有相关 */
"mp-weixin" : {
"appid" : "wx523ee37fff4fea9d",
"setting" : {
"urlCheck" : false,
"minified" : false,
"es6" : true
},
"usingComponents" : true,
"permission" : {},
"optimization" : {
"subPackages" : true
}
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "3"
}
<template>
<!-- 赛事 -->
<view class="bgWhite">
<!-- 搜索 -->
<view class="topSearch">
<uni-search-bar style="width: 550rpx;" @clear="onclear()" @confirm="onconfirm()" clearButton="auto" cancelButton="none" v-model="queryParam.name"></uni-search-bar>
<picker style="width: 180rpx;" @change="changeProject" :value="index" :range="projectList" range-key="name">
<view class="uni-input">{{projectName?projectName:'全部'}}
<uni-icons type="bottom" size="16"></uni-icons>
</view>
</picker>
</view>
<view class="uni-common-mt">
<uni-segmented-control :current="current" :values="items" style-type="text" :active-color="activeColor" @clickItem="onClickItem" />
</view>
<view class="content">
<view>
<view class="matchList">
<view class="matchItem" @click="goSingle(item)" v-for="(item, index) in list" :key="index">
<view class="leftImg">
<text class="matchType type2" v-if="item.type==0">独立赛</text>
<text class="matchType type1" v-if="item.type==1">联赛</text>
<image mode="aspectFit" :src="item.coverUrl"></image>
</view>
<view class="rightWen">
<view class="name">{{item.name}}</view>
<!-- 1 报名未开始 2 报名进行中 3 即将开始 4 进行中 5已经结束 -->
<text class="status s01" v-if="item.progressStatusCode==3">即将开始</text>
<text class="status s02" v-if="item.progressStatusCode==2">报名中</text>
<text class="status s03" v-if="item.progressStatusCode==4">进行中</text>
<text class="status s04" v-if="item.progressStatusCode==5">已结束</text>
<text class="status s04" v-if="item.progressStatusCode==1">报名未开始</text>
<view class="time" v-if="item.type==0">报名截止:{{item.signEndTime.substring(0, 10)}}</view>
<view class="time" v-else>比赛开始时间:{{item.beginTime.substring(0, 10)}}</view>
<view class="time" v-if="item.type==1">比赛结束时间:{{item.endTime.substring(0, 10)}}</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { reactive, toRefs, getCurrentInstance } from 'vue';
import * as match from '@/match/js/match.js';
import {onShow,onShareAppMessage,onShareTimeline} from '@dcloudio/uni-app';
import _ from 'lodash';
const app = getApp();
const { proxy } = getCurrentInstance();
const data = reactive({
// 1 报名未开始 2 报名进行中 3 即将开始 4 进行中 5已经结束
items: ['全部', '报名中', '进行中', '即将开始','已结束'],
activeColor:'#00CAA6',
queryParam: {
projectId:'',
progressStatusCode:'',
name:''
},
current: 0,
index: 0,
list: [],
projectList:[],
projectName:''
});
const { items,activeColor, queryParam, current, index,list,projectList,projectName } = toRefs(data);
onShow(option =>{
projectList.value = []
if (app.globalData.isLogin) {
getProjectList()
getList();
} else {
app.firstLoadCallback = () => {
getProjectList()
getList();
};
}
})
function getProjectList(){
match.getBaseProject().then(res=>{
projectList.value = res.rows
let obj = {
id:'',
name:'全部'
}
projectList.value.unshift(obj)
})
// projectList.value =_.cloneDeep(app.globalData.venue.projectList);
}
function getList() {
match.getMaList(queryParam.value).then(res => {
list.value = res.rows;
});
}
function changeProject(e){
console.log(e.detail.value)
index.value = e.detail.value
projectName.value = projectList.value[index.value].name
queryParam.value.projectId = projectList.value[index.value].id
getList()
}
function onclear(){
queryParam.value.name = ''
getList()
}
function onconfirm(){
console.log(queryParam.value.name)
getList()
}
function onClickItem(e) {
current.value = e.currentIndex;
if(current.value==1){
queryParam.value.progressStatusCode = '2';
}else if(current.value==2){
queryParam.value.progressStatusCode = '4';
}else if(current.value==3){
queryParam.value.progressStatusCode = '3';
}else if(current.value==4){
queryParam.value.progressStatusCode = '5';
}else {
// 全部
queryParam.value.progressStatusCode = ''
}
getList()
}
function goSingle(item) {
if(item.type==0){
let path = `/pages_match/match/single?id=${item.id}`;
uni.navigateTo({
url: path
});
} else {
// 联赛
let path = `/pages_match/match/singleLs?id=${item.id}`;
uni.navigateTo({
url: path
});
}
}
</script>
<style lang="scss" scoped>
.bgWhite {background: #fff;}
.topSearch{ display: flex; align-items: center;}
</style>
export const nationList = [
{
text: "汉族",
value: "汉族"
},
{
text: "蒙古族",
value: "蒙古族"
},
{
text: "回族",
value: "回族"
},
{
text: "藏族",
value: "藏族"
},
{
text: "维吾尔族",
value: "维吾尔族"
},
{
text: "苗族",
value: "苗族"
},
{
text: "彝族",
value: "彝族"
},
{
text: "壮族",
value: "壮族"
},
{
text: "布依族",
value: "布依族"
},
{
text: "朝鲜族",
value: "朝鲜族"
},
{
text: "满族",
value: "满族"
},
{
text: "侗族",
value: "侗族"
},
{
text: "瑶族",
value: "瑶族"
},
{
text: "白族",
value: "白族"
},
{
text: "土家族",
value: "土家族"
},
{
text: "哈尼族",
value: "哈尼族"
},
{
text: "哈萨克族",
value: "哈萨克族"
},
{
text: "傣族",
value: "傣族"
},
{
text: "黎族",
value: "黎族"
},
{
text: "傈僳族",
value: "傈僳族"
},
{
text: "佤族",
value: "佤族"
},
{
text: "畲族",
value: "畲族"
},
{
text: "高山族",
value: "高山族"
},
{
text: "拉祜族",
value: "拉祜族"
},
{
text: "水族",
value: "水族"
},
{
text: "东乡族",
value: "东乡族"
},
{
text: "纳西族",
value: "纳西族"
},
{
text: "景颇族",
value: "景颇族"
},
{
text: "柯尔克孜族",
value: "柯尔克孜族"
},
{
text: "土族",
value: "土族"
},
{
text: "达斡尔族",
value: "达斡尔族"
},
{
text: "仫佬族",
value: "仫佬族"
},
{
text: "羌族",
value: "羌族"
},
{
text: "布朗族",
value: "布朗族"
},
{
text: "撒拉族",
value: "撒拉族"
},
{
text: "毛难族",
value: "毛难族"
},
{
text: "仡佬族",
value: "仡佬族"
},
{
text: "锡伯族",
value: "锡伯族"
},
{
text: "阿昌族",
value: "阿昌族"
},
{
text: "普米族",
value: "普米族"
},
{
text: "塔吉克族",
value: "塔吉克族"
},
{
text: "怒族",
value: "怒族"
},
{
text: "乌孜别克族",
value: "乌孜别克族"
},
{
text: "俄罗斯族",
value: "俄罗斯族"
},
{
text: "鄂温克族",
value: "鄂温克族"
},
{
text: "崩龙族",
value: "崩龙族"
},
{
text: "保安族",
value: "保安族"
},
{
text: "裕固族",
value: "裕固族"
},
{
text: "京族",
value: "京族"
},
{
text: "塔塔尔族",
value: "塔塔尔族"
},
{
text: "独龙族",
value: "独龙族"
},
{
text: "鄂伦春族",
value: "鄂伦春族"
},
{
text: "赫哲族",
value: "赫哲族"
},
{
text: "门巴族",
value: "门巴族"
},
{
text: "珞巴族",
value: "珞巴族"
},
{
text: "基诺族",
value: "基诺族"
},
{
text: "其他",
value: "其他"
},
{
text: "外国血统中国人士",
value: "外国血统中国人士"
}
]
export const certificates = [
{
value: '0',
label: '居民身份证'
},
{
value: '1',
label: '护照'
},
{
value: '2',
label: '其他'
}
]
export const tagList = [{text: '运动员',value: '0'},{text: '教练',value: '1'},{text: '领队',value: '2'},{text: '其他',value: '3'}];
export const sexs = [{text: '女',value: '0'}, {text: '男',value: '1'}];
export const idcTypeList = [
{ value: '0', text: "身份证" },
{ value: '1', text: "护照" },
{ value: '2', text: "其他" },
]
export const typeList = [{text: '俱乐部',value: '0'}, {text: '事业单位',value: '1'}, {text: '道馆',value: '2'}, {text: '企业',value: '3'}, {text: '机关',value: '4'}, {text: '其他',value: '5'}];
export const comList = [{text: '国资企业(含央企和本地)',value: '0'}, {text: '外商投资企业',value: '1'}, {text: '港澳台企业',value: '2'}, {text: '民营企业',value: '3'}, {text: '商会组织',value: '4'}, {text: '其他',value: '5'}];
<template>
<view class="fixedbody">
<view class="successBox">
<view class="doneIcon">
<uni-icons type="checkbox-filled" size="100" color="#1EC886"></uni-icons>
</view>
<view v-if="chargeFlag=='0'" style="margin: 0 0 80rpx;">报名成功</view>
<view v-else style="margin: 0 0 80rpx;">
<view>支付成功</view>
<view class="ppp">订单金额<text class="orange">{{amount}}</text></view>
<view class="ppp">交易方式
<text v-if="payType=='0'">会员卡支付</text>
<text v-else-if="payType=='1'">微信支付</text>
<text v-else-if="payType=='2'">线下支付</text>
</view>
</view>
<view style="display: flex;justify-content: center;">
<button class="btn btn1" style="margin: 0 10px;" @click="download">下载凭证</button>
<button class="btn btn1" style="margin: 0 10px;" @click="goDetail">查看报项</button>
</view>
</view>
</view>
</template>
<script setup>
import { reactive, toRefs } from 'vue';
import * as match from '@/match/js/match.js';
import { onLoad } from '@dcloudio/uni-app';
import config from '@/config.js'
const data = reactive({
chargeFlag:'',
amount:'',
payType:''
})
const {chargeFlag,payType,amount } = toRefs(data);
const app = getApp();
let cptId
let groupId
let orderId
onLoad(option=>{
console.log(option)
// cptId groupId chargeFlag
cptId = option.cptId
groupId = option.groupId
chargeFlag.value = option.chargeFlag
orderId = option.orderId
// amount payType
if(option.amount){
amount.value = option.amount
}
if(option.payType){
payType.value = option.payType
}
})
function goDetail() {
// 前往报项详情
uni.redirectTo({
url: `/pages/usercenter/matchSignDetail?id=${cptId}&groupId=${groupId}&auditStatus=1}`
})
}
function download(){
match.downloadpz(cptId,groupId).then(res=>{
goWebView(res.data)
})
}
function goWebView(url) {
console.log(url)
url = url.replace("http://", "https://")
uni.showLoading({
title: '下载中'
});
uni.downloadFile({
url: url,
success: function(res) {
uni.hideLoading();
var filePath = res.tempFilePath;
uni.showLoading({
title: '正在打开'
});
uni.openDocument({
filePath: filePath,
showMenu: true,
success: function(res) {
uni.hideLoading();
},
fail: function(err) {
uni.hideLoading();
uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
}
});
},
fail: function(error) {
uni.hideLoading();
uni.showToast({
title: `下载失败`,
icon: 'none',
duration: 2000
});
}
});
}
</script>
<style lang="scss" scoped>
.successBox{text-align: center;}
.doneIcon{margin: 5vh auto;}
.ppp{ text-align: left;
font-size: 30rpx;
padding: 0 30rpx;color: #a0a0a0;
margin: 20rpx 0;
text{ float: right;color: #000;}
}
</style>
import request from '@/common/request.js'
import config from '@/config.js'
/**
* 我的培训
* @returns {*}
*/
export function getMyTrain() {
return request({
url: `${config.trainUrl_api}/webPc/mySubjects`,
method: 'get'
})
}
export function getMyOrder() {
return request({
url: `${config.trainUrl_api}/webPc/myOrders`,
method: 'get'
})
}
/**
* 报名信息
* @returns {*}
*/
export function getSignInfo(params) {
return request({
url: `${config.trainUrl_api}/webPc/details`,
method: 'get',
params
})
}
\ No newline at end of file
<template>
<view class="box">
<view class="topBg">
<view class="userInfoBox">
<view class="headImg">
<image mode="aspectFill" :src="avatarUrl"></image>
</view>
<view class="nameBox">
{{ user.nickName }}
<view>{{ user.phonenumber }}</view>
</view>
</view>
</view>
<view class="rMainBox">
<uni-list :border="false" class="myList">
<!-- <uni-list-item :border="false" title="个人信息" showArrow :to="`./myInfo`">
<template v-slot:header>
<view class="slot-box">
<image class="slot-image" src="/static/user_icon03.png" mode="widthFix"></image>
</view>
</template>
</uni-list-item>
<uni-list-item :border="false" title="参赛队信息" showArrow :to="`./teamList`">
<template v-slot:header>
<view class="slot-box">
<image class="slot-image" src="/static/user_icon06.png" mode="widthFix"></image>
</view>
</template>
</uni-list-item>
<uni-list-item :border="false" title="会员充值" showArrow :to="`./mycard/renew`">
<template v-slot:header>
<view class="slot-box">
<image class="slot-image" src="/static/user_icon01.png" mode="widthFix"></image>
</view>
</template>
</uni-list-item>
<uni-list-item :border="false" title="场地订单" showArrow :to="`./bills`">
<template v-slot:header>
<view class="slot-box">
<image class="slot-image" src="/static/user_icon02.png" mode="widthFix"></image>
</view>
</template>
</uni-list-item> -->
<uni-list-item :border="false" title="我的培训" showArrow clickable @click="goPath('/myCenter/mytrain/mytrain')">
<template v-slot:header>
<view class="slot-box">
<image class="slot-image" mode="widthFix"></image>
</view>
</template>
</uni-list-item>
<!-- <uni-list-item :border="false" title="我的赛事" showArrow :to="`./match`">
<template v-slot:header>
<view class="slot-box">
<image class="slot-image" src="/static/user_icon04.png" mode="widthFix"></image>
</view>
</template>
</uni-list-item> -->
</uni-list>
</view>
</view>
</template>
<script setup>
import * as my from '@/myCenter/center_api.js';
import * as loginServer from '@/common/login.js';
import { ref } from 'vue';
import { onLoad, onShow } from '@dcloudio/uni-app';
const user = ref({});
const app = getApp();
onShow(() => {
if (app.globalData.isLogin) {
init();
} else {
app.firstLoadCallback = () => {
init();
};
}
});
function init() {
console.log(app.globalData.isLogin)
if(app.globalData.userInfo){
const currUser = app.globalData.userInfo
user.value = currUser;
} else {
loginServer.getInfo().then(res=>{
const currUser = app.globalData.userInfo
user.value = currUser
})
}
}
function goBack() {
uni.navigateBack({});
}
// function goQcode() {
// uni.scanCode({
// onlyFromCamera: true,
// success: function(res) {
// console.log('条码类型:' + res.scanType);
// console.log('条码内容:' + res.result);
// api.scanQrCode(res.result).then(res => {
// uni.showModal({
// title: '提示',
// content: res.msg,
// success: function(res) {
// if (res.confirm) {
// console.log('确定');
// } else if (res.cancel) {
// console.log('取消');
// }
// }
// });
// });
// }
// });
// }
function building() {
uni.showToast({
title: '暂未开放,敬请期待。',
icon: 'none',
duration: 2000
});
}
function goPath(path) {
if(path)
uni.navigateTo({
url: path
});
}
</script>
<style scoped lang="scss">
.box {
width: 100vw;
overflow: hidden;
}
.rMainBox {
box-sizing: border-box;
padding: 20rpx 25rpx 0;
margin: 25rpx;
}
.userInfoBox {
height: 200rpx;
}
.nameBox {
position: absolute;
left: 180rpx;
top: 70rpx;
font-size: 30rpx;
}
.nameBox view {
color: #7b7f83;
font-size: 26rpx;
margin-top: 10rpx;
}
.goback {
position: absolute;
color: #fff;
top: 100rpx;
left: 35rpx;
}
.forAdmin {
padding: 25rpx;
box-sizing: border-box;
}
.topBg {
}
.onlyCardBottom {
position: relative;
width: 660rpx;
margin: auto;
height: 90rpx;
.bbg {
height: 90rpx;
width: 660rpx;
}
.cardBottom {
width: 660rpx;
background: transparent;
height: 90rpx;
text {
font-size: 28rpx;
color: #925921;
}
.renewBtn {
background: #874f02;
color: #fff;
}
}
}
.headImg {
border-radius: 50%;
position: relative;
top: 50rpx;
overflow: hidden;
width: 100rpx;
height: 100rpx;
border: 4px solid #ffffff;
background: #c4f9cb;
left: 40rpx;
button {
display: block;
padding: 0;
}
image {
width: 100rpx;
height: 100rpx;
display: block;
}
}
.slot-image {
width: 50rpx;
position: relative;
top: -8rpx;
height: 50rpx;
margin-right: 30rpx;
}
.myList {
}
.funcBar {
display: flex;
background: #fff;
width: 700rpx;
height: 140rpx;
justify-content: space-around;
}
.funcBar view {
display: flex;
align-items: center;
font-size: 36rpx;
}
.funcBar image {
width: 80rpx;
height: 80rpx;
}
.topbgimg {
width: 100vw;
position: absolute;
z-index: -1;
}
.reportItembox {
overflow: hidden;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.reportItem {
background: #fff;
border-radius: 15rpx;
width: 340rpx;
margin-top: 25rpx;
.t {
border-bottom: 1px solid #e5e5e5;
height: 70rpx;
line-height: 70rpx;
color: #2b3133;
font-size: 30rpx;
padding-left: 36rpx;
}
.rbody {
display: flex;
padding: 36rpx;
box-sizing: border-box;
view {
font-size: 26rpx;
color: #888;
width: 40%;
}
text {
color: #00c176;
font-weight: bold;
font-size: 36rpx;
display: block;
margin-bottom: 20rpx;
}
}
}
.changephonepop {
width: 100%;
}
.changephonepop view {
width: 100%;
margin: 0 0 30rpx;
}
.changephonepop view input {
width: 100%;
background: #f4f4f4;
font-size: 30rpx;
height: 80rpx;
padding: 0 15rpx;
box-sizing: border-box;
line-height: 80rpx;
}
.changephonepop view.ffff {
display: flex;
}
.changephonepop view button {
font-size: 24rpx;
margin-left: 10rpx;
white-space: nowrap;
width: 260rpx;
line-height: 80rpx;
background: linear-gradient(90deg, #00c176, #3ed89b);
color: #fff;
padding: 0;
border: none;
}
</style>
<template>
<view class="box">
<view class="box1">
<view class="title">
<view class="title-left">{{ porps.title }}</view>
<view class="title-icon" @click="changFN">
<uni-icons type="top" color="#95a1a6" v-if="show"></uni-icons>
<uni-icons type="bottom" color="#95a1a6" v-else></uni-icons>
</view>
</view>
<view class="conter-liner-cost">
<view class="liner-left">{{ porps.text }}&nbsp;&nbsp; 合计:</view>
<view class="liner-right">{{ porps.cost }}</view>
</view>
</view>
<view class="box2" v-show="show"><slot></slot></view>
</view>
</template>
<script setup>
import { ref } from 'vue';
const porps = defineProps({
title: String,
text: String,
cost: String
});
const show = ref(false);
function changFN() {
show.value = !show.value;
}
</script>
<style lang="scss" scoped>
.box {
margin: 0;
padding: 0 25rpx;
.box1 {
margin-bottom: 20rpx;
margin-top:20rpx;
.title {
display: flex;
justify-content: space-between;
margin-bottom: 10rpx;
.title-left {
font-size: 30rpx;
font-family: PingFang SC;
font-weight: 500;
color: #2b3133;
}
}
.conter-liner-cost {
display: flex;
.liner-left {
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 400;
color: #7b7f83;
}
.liner-right {
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 400;
color: #ff8124;
}
}
}
.box2 {
border-top: 1rpx dashed #e6e6e6;
}
}
</style>
<template>
<uni-segmented-control :current="current" styleType="text" :values="items"
activeColor="#AD181F" @clickItem="onClickItem" ></uni-segmented-control>
<view>
<view class="tItem" v-for="n in list" :key="n.id">
<view>{{n.name}}</view>
<view class="tagbox">
<uni-tag type="warning" :inverted="true" size="small" v-for="p in n.projectsStr?.split(',')" :key="p" :text="p">
</uni-tag>
</view>
<view class="pp esp">报名时间:{{ n.signTimeRange }}</view>
<view class="pp esp">培训时间:{{ n.trainTimeRange }}</view>
<view class="pp esp">培训地点:{{ n.address }}</view>
<view class="func">
<button @click="showFeeInfo(n)">去缴费</button>
<button @click="goTrainDetail(n.id)">报名信息</button>
</view>
</view>
<view class="nodata" v-if="list.length == 0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
<uni-popup ref="bankShow" type="bottom" background-color="#fff">
<view class="popupBody">
<view class="title">线下支付</view>
<view @click="copyPlat">
<view class="flexRow">
<label>单位名称</label>
<view>{{ bankInfo.name}}</view>
</view>
<view class="flexRow">
<label>开户行</label>
<view>{{bankInfo.bank}}</view>
</view>
<view class="flexRow">
<label>账户</label>
<view>{{ bankInfo.account }}</view>
</view>
</view>
<button class="btn btn-red-kx" @click="sure">确定</button>
</view>
</uni-popup>
</template>
<script setup>
import * as my from '@/myCenter/center_api.js';
import { ref } from 'vue';
import { onLoad, onShow } from '@dcloudio/uni-app';
const app = getApp();
const items = ref([
'培训', '订单'
])
const current = ref(1)
const bankShow = ref(null)
const bankInfo = ref({})
const list = ref([])
onShow(() => {
if (app.globalData.isLogin) {
init();
} else {
app.firstLoadCallback = () => {
init();
};
}
});
function init(){
my.getMyOrder().then(res=>{
list.value = res.rows
})
}
function onClickItem(e){
console.log(e)
if(e.currentIndex==0){
uni.navigateTo({
url: `/myCenter/mytrain/mytrain`
});
}
}
function goTrainDetail(id){
uni.navigateTo({
url: `/myCenter/mytrain/orderDetail?id=${id}`
});
}
function showFeeInfo(item){
bankInfo.value = JSON.parse(item.receivingInfo)
bankShow.value.open()
}
function copyPlat(){
let str = `单位名称:${bankInfo.value.name};开户行:${bankInfo.value.bank};账户:${bankInfo.value.account};`;
uni.setClipboardData({
data: str,
success: function() {
uni.showToast({
title: '已复制',
icon: 'none'
})
}
});
}
</script>
<style scoped lang="scss">
.tItem{background: #fff;border-radius: 10rpx;padding: 20rpx;width: 700rpx;
box-sizing: border-box;box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196,203,214,0.1);
margin:30rpx auto 0;
.pp{font-size: 26rpx;color: #929AA0;margin-bottom: 10rpx;}
}
.tagbox{margin: 20rpx 0;
:deep(.uni-tag){margin-right: 10rpx;}
}
.func{display: flex;justify-content: flex-end;box-sizing: border-box;
border-top: 1px dashed #e5e5e5;
padding-top: 20rpx;margin: 20rpx 0 0;
button{border: 1px solid #AD181F;
border-radius: 30rpx;height: 60rpx;line-height: 60rpx;
font-size: 30rpx;color: #AD181F;background: #fff;
margin: 0 0 0 30rpx;padding: 0 40rpx;box-sizing: border-box;
}
text{font-size: 30rpx;padding:30rpx 0 0;}
}
.flexRow {
margin: 20rpx 0 0;
align-items: center;
display: flex;
font-size: 28rpx;
label {
color: #999;width: 5em;
flex: 0 0 auto;
}
view {
margin-left: 20rpx;
}
}
.popupBody{background-color: #fff;padding: 30rpx;
.title{text-align: center;font-size: 32rpx;margin: 0 0 30rpx;}
button{margin: 30rpx 0 0;}
}
</style>
<template>
<uni-segmented-control :current="current" styleType="text" :values="items"
activeColor="#AD181F" @clickItem="onClickItem" ></uni-segmented-control>
<view>
<view class="nodata" v-if="list.length == 0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as my from '@/myCenter/center_api.js';
import { ref } from 'vue';
import { onLoad, onShow } from '@dcloudio/uni-app';
const app = getApp();
const items = ref([
'培训', '订单'
])
const current = ref(0)
const list = ref([])
onShow(() => {
if (app.globalData.isLogin) {
init();
} else {
app.firstLoadCallback = () => {
init();
};
}
});
function init(){
my.getMyTrain().then(res=>{
list.value = res.rows
})
}
function onClickItem(e){
console.log(e)
if(e.currentIndex==1){
uni.navigateTo({
url: `/myCenter/mytrain/myBill`
});
}
}
</script>
<style>
</style>
<template>
<view class="box hasfixedbottom">
<view class="box1">
<trainFold title="培训费" :cost="signInfo.trainFee" :text="signInfo.trainCount + '项'">
<view class="conter-liner" v-for="item in signInfo.trainList" :key="item.id">
<view class="liner-left">{{ item.name }}</view>
<view class="liner-right">{{ item.price }}</view>
</view>
</trainFold>
</view>
<view class="box1">
<trainFold title="考试费" :cost="signInfo.examFee" :text="signInfo.examCount + '项'">
<view class="conter-liner" v-for="item in signInfo.examList" :key="item.id">
<view class="liner-left">{{ item.name }}</view>
<view class="liner-right">{{ item.price }}</view>
</view>
</trainFold>
</view>
<view class="fixedBottom">
<view class="big-right">
合计:
<text class="text-warning">{{ signInfo.totalFee }}</text>
</view>
</view>
</view>
</template>
<script setup>
import { ref, getCurrentInstance, reactive, toRef, toRefs } from 'vue';
import { onLoad, onReady, onShareAppMessage, onShareTimeline, onPullDownRefresh } from '@dcloudio/uni-app';
import trainFold from '@/myCenter/mytrain/fold.vue';
import * as my from '@/myCenter/center_api.js';
const data = reactive({
id:'',
signInfo:{}
});
const { id,signInfo } = toRefs(data);
onLoad(option => {
id.value = option.id;
initData()
});
// 获取用户支付信息
function initData() {
my.getSignInfo({
activityId:id.value
}).then(res=>{
signInfo.value = res.data
signInfo.value.receivingInfo = params.receivingInfo
})
}
</script>
<style scoped lang="scss">
.fixedBottom{justify-content: end;padding:30rpx; align-items: baseline;
.small-left{font-size: 28rpx;color: #999;display: flex;
view{margin-right:20rpx;}
}
.big-right{ text-align: right;}
}
.box {
padding: 35rpx 25rpx;
padding-bottom: 100rpx;
.box1 {
background-color: #fff;
margin-bottom: 40rpx;
padding: 10rpx;
border-radius: 15rpx;
.text {
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 500;
color: #2b3133;
}
.conter-liner {
display: flex;
justify-content: space-between;
margin-top: 32rpx;
padding-bottom: 30rpx;
.liner-left {
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 400;
color: #7b7f83;
}
.liner-right {
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 400;
color: #ff8124;
}
}
}
.box2 {
padding: 10rpx;
.text {
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 500;
color: #2b3133;
margin-bottom: 40rpx;
}
.conter {
background-color: #fff;
border-radius: 15rpx;
padding: 25rpx 10rpx;
}
.radio {
display: flex;
justify-content: space-between;
margin-bottom: 30rpx;
.radio-cost {
display: flex;
.left {
width: 50rpx;
height: 50rpx;
.image {
width: 50rpx;
height: 50rpx;
}
}
.radio-right {
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 400;
color: #000000;
margin-left: 10rpx;
}
.vip {
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 400;
color: #4c5359;
}
}
}
}
.box3 {
display: flex;
justify-content: space-between;
border: 1rpx solid #dcdcdc;
bottom: 0;
left: 0;
width: 100%;
background-color: #fff;
.left {
display: flex;
line-height: 100rpx;
font-size: 24rpx;
font-family: PingFang SC;
font-weight: 400;
color: #7b7f83;
padding-left: 30rpx;
.cost {
font-size: 45rpx;
font-family: DIN Alternate;
font-weight: bold;
color: #ff8124;
padding-left: 10rpx;
}
}
.ToPay {
background: #ff8124;
border: 1px solid #dcdcdc;
color: #fff;
width: 214rpx;
height: 100rpx;
text-align: center;
line-height: 100rpx;
}
}
}
.dialog {
width: 95%;
background-color: #000;
border-radius: 30rpx;
padding: 50rpx 0;
margin: 0 auto;
opacity: 0.8;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
.size {
color: #fff;
text-align: center;
}
.butotn {
margin: 0 auto;
margin-top: 63rpx;
width: 268rpx;
height: 80rpx;
background: linear-gradient(270deg, #54e1b9, #00caa6);
border-radius: 40rpx;
text-align: center;
line-height: 80rpx;
color: #fff;
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 500;
}
}
</style>
../resolve/bin/resolve
\ No newline at end of file
{
"hash": "be98a237",
"browserHash": "bed6bb88",
"optimized": {
"lodash": {
"src": "../../lodash/lodash.js",
"file": "lodash.js",
"fileHash": "49acd2da",
"needsInterop": true
},
"dayjs": {
"src": "../../dayjs/dayjs.min.js",
"file": "dayjs.js",
"fileHash": "355e9e09",
"needsInterop": true
}
},
"chunks": {
"chunk-RSJERJUL": {
"file": "chunk-RSJERJUL.js"
}
}
}
\ No newline at end of file
var __getOwnPropNames = Object.getOwnPropertyNames;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
export {
__commonJS
};
//# sourceMappingURL=chunk-RSJERJUL.js.map
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
{"type":"module"}
\ No newline at end of file
{
"systemParams": "darwin-arm64-108",
"modulesFolders": [
"node_modules"
],
"flags": [],
"linkedModules": [],
"topLevelPatterns": [
"@rollup/plugin-commonjs@^22.0.0",
"crypto-js@^4.2.0",
"dayjs@^1.11.6",
"lodash@^4.17.21"
],
"lockfileEntries": {
"@rollup/plugin-commonjs@^22.0.0": "https://registry.npmmirror.com/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz#ee8ca8415cda30d383b4096aad5222435b4b69b6",
"@rollup/pluginutils@^3.1.0": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b",
"@types/estree@*": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4",
"@types/estree@0.0.39": "https://registry.npmmirror.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f",
"balanced-match@^1.0.0": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee",
"brace-expansion@^1.1.7": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd",
"commondir@^1.0.1": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b",
"concat-map@0.0.1": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b",
"crypto-js@^4.2.0": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631",
"dayjs@^1.11.6": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0",
"estree-walker@^1.0.1": "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700",
"estree-walker@^2.0.1": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac",
"fs.realpath@^1.0.0": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f",
"function-bind@^1.1.2": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c",
"glob@^7.1.6": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b",
"hasown@^2.0.0": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c",
"inflight@^1.0.4": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9",
"inherits@2": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c",
"is-core-module@^2.13.0": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384",
"is-reference@^1.2.1": "https://registry.npmmirror.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7",
"lodash@^4.17.21": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c",
"magic-string@^0.25.7": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c",
"minimatch@^3.1.1": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b",
"once@^1.3.0": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1",
"path-is-absolute@^1.0.0": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f",
"path-parse@^1.0.7": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735",
"picomatch@^2.2.2": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42",
"resolve@^1.17.0": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d",
"sourcemap-codec@^1.4.8": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4",
"supports-preserve-symlinks-flag@^1.0.0": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09",
"wrappy@1": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
},
"files": [],
"artifacts": {}
}
\ No newline at end of file
The MIT License (MIT)
Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors)
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.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
{"type":"module"}
\ No newline at end of file
../../../../resolve/bin/resolve
\ No newline at end of file
{
"name": "@rollup/plugin-commonjs",
"version": "22.0.2",
"publishConfig": {
"access": "public"
},
"description": "Convert CommonJS modules to ES2015",
"license": "MIT",
"repository": {
"url": "rollup/plugins",
"directory": "packages/commonjs"
},
"author": "Rich Harris <richard.a.harris@gmail.com>",
"homepage": "https://github.com/rollup/plugins/tree/master/packages/commonjs/#readme",
"bugs": "https://github.com/rollup/plugins/issues",
"main": "./dist/cjs/index.js",
"module": "./dist/es/index.js",
"exports": {
"require": "./dist/cjs/index.js",
"import": "./dist/es/index.js"
},
"engines": {
"node": ">= 12.0.0"
},
"scripts": {
"build": "rollup -c",
"ci:coverage": "nyc pnpm test && nyc report --reporter=text-lcov > coverage.lcov",
"ci:lint": "pnpm build && pnpm lint",
"ci:lint:commits": "commitlint --from=${CIRCLE_BRANCH} --to=${CIRCLE_SHA1}",
"ci:test": "pnpm test -- --verbose && pnpm test:ts",
"prebuild": "del-cli dist",
"prepare": "if [ ! -d 'dist' ]; then pnpm build; fi",
"prepublishOnly": "pnpm build",
"prerelease": "pnpm build",
"pretest": "pnpm build",
"release": "pnpm plugin:release --workspace-root -- --pkg $npm_package_name",
"test": "ava",
"test:ts": "tsc types/index.d.ts test/types.ts --noEmit"
},
"files": [
"dist",
"types",
"README.md",
"LICENSE"
],
"keywords": [
"rollup",
"plugin",
"npm",
"modules",
"commonjs",
"require"
],
"peerDependencies": {
"rollup": "^2.68.0"
},
"dependencies": {
"@rollup/pluginutils": "^3.1.0",
"commondir": "^1.0.1",
"estree-walker": "^2.0.1",
"glob": "^7.1.6",
"is-reference": "^1.2.1",
"magic-string": "^0.25.7",
"resolve": "^1.17.0"
},
"devDependencies": {
"@rollup/plugin-json": "^4.1.0",
"@rollup/plugin-node-resolve": "^13.1.0",
"locate-character": "^2.0.5",
"require-relative": "^0.8.7",
"rollup": "^2.68.0",
"shx": "^0.3.2",
"source-map": "^0.7.3",
"source-map-support": "^0.5.19",
"typescript": "^3.9.7"
},
"types": "types/index.d.ts",
"ava": {
"babel": {
"compileEnhancements": false
},
"files": [
"!**/fixtures/**",
"!**/helpers/**",
"!**/recipes/**",
"!**/types.ts"
]
}
}
# @rollup/pluginutils ChangeLog
## v3.1.0
_2020-06-05_
### Bugfixes
- fix: resolve relative paths starting with "./" (#180)
### Features
- feat: add native node es modules support (#419)
### Updates
- refactor: replace micromatch with picomatch. (#306)
- chore: Don't bundle micromatch (#220)
- chore: add missing typescript devDep (238b140)
- chore: Use readonly arrays, add TSDoc (#187)
- chore: Use typechecking (2ae08eb)
## v3.0.10
_2020-05-02_
### Bugfixes
- fix: resolve relative paths starting with "./" (#180)
### Updates
- refactor: replace micromatch with picomatch. (#306)
- chore: Don't bundle micromatch (#220)
- chore: add missing typescript devDep (238b140)
- chore: Use readonly arrays, add TSDoc (#187)
- chore: Use typechecking (2ae08eb)
## v3.0.9
_2020-04-12_
### Updates
- chore: support Rollup v2
## v3.0.8
_2020-02-01_
### Bugfixes
- fix: resolve relative paths starting with "./" (#180)
### Updates
- chore: add missing typescript devDep (238b140)
- chore: Use readonly arrays, add TSDoc (#187)
- chore: Use typechecking (2ae08eb)
## v3.0.7
_2020-02-01_
### Bugfixes
- fix: resolve relative paths starting with "./" (#180)
### Updates
- chore: Use readonly arrays, add TSDoc (#187)
- chore: Use typechecking (2ae08eb)
## v3.0.6
_2020-01-27_
### Bugfixes
- fix: resolve relative paths starting with "./" (#180)
## v3.0.5
_2020-01-25_
### Bugfixes
- fix: bring back named exports (#176)
## v3.0.4
_2020-01-10_
### Bugfixes
- fix: keep for(const..) out of scope (#151)
## v3.0.3
_2020-01-07_
### Bugfixes
- fix: createFilter Windows regression (#141)
### Updates
- test: fix windows path failure (0a0de65)
- chore: fix test script (5eae320)
## v3.0.2
_2020-01-04_
### Bugfixes
- fix: makeLegalIdentifier - potentially unsafe input for blacklisted identifier (#116)
### Updates
- docs: Fix documented type of createFilter's include/exclude (#123)
- chore: update minor linting correction (bcbf9d2)
## 3.0.1
- fix: Escape glob characters in folder (#84)
## 3.0.0
_2019-11-25_
- **Breaking:** Minimum compatible Rollup version is 1.20.0
- **Breaking:** Minimum supported Node version is 8.0.0
- Published as @rollup/plugins-image
## 2.8.2
_2019-09-13_
- Handle optional catch parameter in attachScopes ([#70](https://github.com/rollup/rollup-pluginutils/pulls/70))
## 2.8.1
_2019-06-04_
- Support serialization of many edge cases ([#64](https://github.com/rollup/rollup-pluginutils/issues/64))
## 2.8.0
_2019-05-30_
- Bundle updated micromatch dependency ([#60](https://github.com/rollup/rollup-pluginutils/issues/60))
## 2.7.1
_2019-05-17_
- Do not ignore files with a leading "." in createFilter ([#62](https://github.com/rollup/rollup-pluginutils/issues/62))
## 2.7.0
_2019-05-15_
- Add `resolve` option to createFilter ([#59](https://github.com/rollup/rollup-pluginutils/issues/59))
## 2.6.0
_2019-04-04_
- Add `extractAssignedNames` ([#59](https://github.com/rollup/rollup-pluginutils/issues/59))
- Provide dedicated TypeScript typings file ([#58](https://github.com/rollup/rollup-pluginutils/issues/58))
## 2.5.0
_2019-03-18_
- Generalize dataToEsm type ([#55](https://github.com/rollup/rollup-pluginutils/issues/55))
- Handle empty keys in dataToEsm ([#56](https://github.com/rollup/rollup-pluginutils/issues/56))
## 2.4.1
_2019-02-16_
- Remove unnecessary dependency
## 2.4.0
_2019-02-16_
Update dependencies to solve micromatch vulnerability ([#53](https://github.com/rollup/rollup-pluginutils/issues/53))
## 2.3.3
_2018-09-19_
- Revert micromatch update ([#43](https://github.com/rollup/rollup-pluginutils/issues/43))
## 2.3.2
_2018-09-18_
- Bumb micromatch dependency ([#36](https://github.com/rollup/rollup-pluginutils/issues/36))
- Bumb dependencies ([#41](https://github.com/rollup/rollup-pluginutils/issues/41))
- Split up tests ([#40](https://github.com/rollup/rollup-pluginutils/issues/40))
## 2.3.1
_2018-08-06_
- Fixed ObjectPattern scope in attachScopes to recognise { ...rest } syntax ([#37](https://github.com/rollup/rollup-pluginutils/issues/37))
## 2.3.0
_2018-05-21_
- Add option to not generate named exports ([#32](https://github.com/rollup/rollup-pluginutils/issues/32))
## 2.2.1
_2018-05-21_
- Support `null` serialization ([#34](https://github.com/rollup/rollup-pluginutils/issues/34))
## 2.2.0
_2018-05-11_
- Improve white-space handling in `dataToEsm` and add `prepare` script ([#31](https://github.com/rollup/rollup-pluginutils/issues/31))
## 2.1.1
_2018-05-09_
- Update dependencies
## 2.1.0
_2018-05-08_
- Add `dataToEsm` helper to create named exports from objects ([#29](https://github.com/rollup/rollup-pluginutils/issues/29))
- Support literal keys in object patterns ([#27](https://github.com/rollup/rollup-pluginutils/issues/27))
- Support function declarations without id in `attachScopes` ([#28](https://github.com/rollup/rollup-pluginutils/issues/28))
## 2.0.1
_2017-01-03_
- Don't add extension to file with trailing dot ([#14](https://github.com/rollup/rollup-pluginutils/issues/14))
## 2.0.0
_2017-01-03_
- Use `micromatch` instead of `minimatch` ([#19](https://github.com/rollup/rollup-pluginutils/issues/19))
- Allow `createFilter` to take regexes ([#5](https://github.com/rollup/rollup-pluginutils/issues/5))
## 1.5.2
_2016-08-29_
- Treat `arguments` as a reserved word ([#10](https://github.com/rollup/rollup-pluginutils/issues/10))
## 1.5.1
_2016-06-24_
- Add all declarators in a var declaration to scope, not just the first
## 1.5.0
_2016-06-07_
- Exclude IDs with null character (`\0`)
## 1.4.0
_2016-06-07_
- Workaround minimatch issue ([#6](https://github.com/rollup/rollup-pluginutils/pull/6))
- Exclude non-string IDs in `createFilter`
## 1.3.1
_2015-12-16_
- Build with Rollup directly, rather than via Gobble
## 1.3.0
_2015-12-16_
- Use correct path separator on Windows
## 1.2.0
_2015-11-02_
- Add `attachScopes` and `makeLegalIdentifier`
## 1.1.0
2015-10-24\*
- Add `addExtension` function
## 1.0.1
_2015-10-24_
- Include dist files in package
## 1.0.0
_2015-10-24_
- First release
The MIT License (MIT)
Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors)
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.
[npm]: https://img.shields.io/npm/v/@rollup/pluginutils
[npm-url]: https://www.npmjs.com/package/@rollup/pluginutils
[size]: https://packagephobia.now.sh/badge?p=@rollup/pluginutils
[size-url]: https://packagephobia.now.sh/result?p=@rollup/pluginutils
[![npm][npm]][npm-url]
[![size][size]][size-url]
[![libera manifesto](https://img.shields.io/badge/libera-manifesto-lightgrey.svg)](https://liberamanifesto.com)
# @rollup/pluginutils
A set of utility functions commonly used by 🍣 Rollup plugins.
## Requirements
This plugin requires an [LTS](https://github.com/nodejs/Release) Node version (v8.0.0+) and Rollup v1.20.0+.
## Install
Using npm:
```console
npm install @rollup/pluginutils --save-dev
```
## Usage
```js
import utils from '@rollup/pluginutils';
//...
```
## API
Available utility functions are listed below:
_Note: Parameter names immediately followed by a `?` indicate that the parameter is optional._
### addExtension
Adds an extension to a module ID if one does not exist.
Parameters: `(filename: String, ext?: String)`<br>
Returns: `String`
```js
import { addExtension } from '@rollup/pluginutils';
export default function myPlugin(options = {}) {
return {
resolveId(code, id) {
// only adds an extension if there isn't one already
id = addExtension(id); // `foo` -> `foo.js`, `foo.js -> foo.js`
id = addExtension(id, '.myext'); // `foo` -> `foo.myext`, `foo.js -> `foo.js`
}
};
}
```
### attachScopes
Attaches `Scope` objects to the relevant nodes of an AST. Each `Scope` object has a `scope.contains(name)` method that returns `true` if a given name is defined in the current scope or a parent scope.
Parameters: `(ast: Node, propertyName?: String)`<br>
Returns: `Object`
See [rollup-plugin-inject](https://github.com/rollup/rollup-plugin-inject) or [rollup-plugin-commonjs](https://github.com/rollup/rollup-plugin-commonjs) for an example of usage.
```js
import { attachScopes } from '@rollup/pluginutils';
import { walk } from 'estree-walker';
export default function myPlugin(options = {}) {
return {
transform(code) {
const ast = this.parse(code);
let scope = attachScopes(ast, 'scope');
walk(ast, {
enter(node) {
if (node.scope) scope = node.scope;
if (!scope.contains('foo')) {
// `foo` is not defined, so if we encounter it,
// we assume it's a global
}
},
leave(node) {
if (node.scope) scope = scope.parent;
}
});
}
};
}
```
### createFilter
Constructs a filter function which can be used to determine whether or not certain modules should be operated upon.
Parameters: `(include?: <minmatch>, exclude?: <minmatch>, options?: Object)`<br>
Returns: `String`
#### `include` and `exclude`
Type: `String | RegExp | Array[...String|RegExp]`<br>
A valid [`minimatch`](https://www.npmjs.com/package/minimatch) pattern, or array of patterns. If `options.include` is omitted or has zero length, filter will return `true` by default. Otherwise, an ID must match one or more of the `minimatch` patterns, and must not match any of the `options.exclude` patterns.
#### `options`
##### `resolve`
Type: `String | Boolean | null`
Optionally resolves the patterns against a directory other than `process.cwd()`. If a `String` is specified, then the value will be used as the base directory. Relative paths will be resolved against `process.cwd()` first. If `false`, then the patterns will not be resolved against any directory. This can be useful if you want to create a filter for virtual module names.
#### Usage
```js
import { createFilter } from '@rollup/pluginutils';
export default function myPlugin(options = {}) {
// assume that the myPlugin accepts options of `options.include` and `options.exclude`
var filter = createFilter(options.include, options.exclude, {
resolve: '/my/base/dir'
});
return {
transform(code, id) {
if (!filter(id)) return;
// proceed with the transformation...
}
};
}
```
### dataToEsm
Transforms objects into tree-shakable ES Module imports.
Parameters: `(data: Object)`<br>
Returns: `String`
#### `data`
Type: `Object`
An object to transform into an ES module.
#### Usage
```js
import { dataToEsm } from '@rollup/pluginutils';
const esModuleSource = dataToEsm(
{
custom: 'data',
to: ['treeshake']
},
{
compact: false,
indent: '\t',
preferConst: false,
objectShorthand: false,
namedExports: true
}
);
/*
Outputs the string ES module source:
export const custom = 'data';
export const to = ['treeshake'];
export default { custom, to };
*/
```
### extractAssignedNames
Extracts the names of all assignment targets based upon specified patterns.
Parameters: `(param: Node)`<br>
Returns: `Array[...String]`
#### `param`
Type: `Node`
An `acorn` AST Node.
#### Usage
```js
import { extractAssignedNames } from '@rollup/pluginutils';
import { walk } from 'estree-walker';
export default function myPlugin(options = {}) {
return {
transform(code) {
const ast = this.parse(code);
walk(ast, {
enter(node) {
if (node.type === 'VariableDeclarator') {
const declaredNames = extractAssignedNames(node.id);
// do something with the declared names
// e.g. for `const {x, y: z} = ... => declaredNames = ['x', 'z']
}
}
});
}
};
}
```
### makeLegalIdentifier
Constructs a bundle-safe identifier from a `String`.
Parameters: `(str: String)`<br>
Returns: `String`
#### Usage
```js
import { makeLegalIdentifier } from '@rollup/pluginutils';
makeLegalIdentifier('foo-bar'); // 'foo_bar'
makeLegalIdentifier('typeof'); // '_typeof'
```
## Meta
[CONTRIBUTING](/.github/CONTRIBUTING.md)
[LICENSE (MIT)](/LICENSE)
{"type":"module"}
\ No newline at end of file
MIT License
Copyright (c) Microsoft Corporation. All rights reserved.
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
# Installation
> `npm install --save @types/estree`
# Summary
This package contains type definitions for ESTree AST specification (https://github.com/estree/estree).
# Details
Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree
Additional Details
* Last updated: Tue, 17 Apr 2018 20:22:09 GMT
* Dependencies: none
* Global values: none
# Credits
These definitions were written by RReverser <https://github.com/RReverser>.
{
"name": "@types/estree",
"version": "0.0.39",
"description": "TypeScript definitions for ESTree AST specification",
"license": "MIT",
"contributors": [
{
"name": "RReverser",
"url": "https://github.com/RReverser",
"githubUsername": "RReverser"
}
],
"main": "",
"repository": {
"type": "git",
"url": "https://www.github.com/DefinitelyTyped/DefinitelyTyped.git"
},
"scripts": {},
"dependencies": {},
"typesPublisherContentHash": "427ba878ebb5570e15aab870f708720d146a1c4b272e4a9d9990db4d1d033170",
"typeScriptVersion": "2.0"
}
\ No newline at end of file
# changelog
## 1.0.1
* Relax node type to `BaseNode` ([#17](https://github.com/Rich-Harris/estree-walker/pull/17))
## 1.0.0
* Don't cache child keys
## 0.9.0
* Add `this.remove()` method
## 0.8.1
* Fix pkg.files
## 0.8.0
* Adopt `estree` types
## 0.7.0
* Add a `this.replace(node)` method
## 0.6.1
* Only traverse nodes that exist and have a type ([#9](https://github.com/Rich-Harris/estree-walker/pull/9))
* Only cache keys for nodes with a type ([#8](https://github.com/Rich-Harris/estree-walker/pull/8))
## 0.6.0
* Fix walker context type
* Update deps, remove unncessary Bublé transformation
## 0.5.2
* Add types to package
## 0.5.1
* Prevent context corruption when `walk()` is called during a walk
## 0.5.0
* Export `childKeys`, for manually fixing in case of malformed ASTs
## 0.4.0
* Add TypeScript typings ([#3](https://github.com/Rich-Harris/estree-walker/pull/3))
## 0.3.1
* Include `pkg.repository` ([#2](https://github.com/Rich-Harris/estree-walker/pull/2))
## 0.3.0
* More predictable ordering
## 0.2.1
* Keep `context` shape
## 0.2.0
* Add ES6 build
## 0.1.3
* npm snafu
## 0.1.2
* Pass current prop and index to `enter`/`leave` callbacks
## 0.1.1
* First release
# estree-walker
Simple utility for walking an [ESTree](https://github.com/estree/estree)-compliant AST, such as one generated by [acorn](https://github.com/marijnh/acorn).
## Installation
```bash
npm i estree-walker
```
## Usage
```js
var walk = require( 'estree-walker' ).walk;
var acorn = require( 'acorn' );
ast = acorn.parse( sourceCode, options ); // https://github.com/acornjs/acorn
walk( ast, {
enter: function ( node, parent, prop, index ) {
// some code happens
},
leave: function ( node, parent, prop, index ) {
// some code happens
}
});
```
Inside the `enter` function, calling `this.skip()` will prevent the node's children being walked, or the `leave` function (which is optional) being called.
Call `this.replace(new_node)` in either `enter` or `leave` to replace the current node with a new one.
Call `this.remove()` in either `enter` or `leave` to remove the current node.
## Why not use estraverse?
The ESTree spec is evolving to accommodate ES6/7. I've had a couple of experiences where [estraverse](https://github.com/estools/estraverse) was unable to handle an AST generated by recent versions of acorn, because it hard-codes visitor keys.
estree-walker, by contrast, simply enumerates a node's properties to find child nodes (and child lists of nodes), and is therefore resistant to spec changes. It's also much smaller. (The performance, if you're wondering, is basically identical.)
None of which should be taken as criticism of estraverse, which has more features and has been battle-tested in many more situations, and for which I'm very grateful.
## License
MIT
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.estreeWalker = {})));
}(this, (function (exports) { 'use strict';
function walk(ast, { enter, leave }) {
return visit(ast, null, enter, leave);
}
let should_skip = false;
let should_remove = false;
let replacement = null;
const context = {
skip: () => should_skip = true,
remove: () => should_remove = true,
replace: (node) => replacement = node
};
function replace(parent, prop, index, node) {
if (parent) {
if (index !== null) {
parent[prop][index] = node;
} else {
parent[prop] = node;
}
}
}
function remove(parent, prop, index) {
if (parent) {
if (index !== null) {
parent[prop].splice(index, 1);
} else {
delete parent[prop];
}
}
}
function visit(
node,
parent,
enter,
leave,
prop,
index
) {
if (node) {
if (enter) {
const _should_skip = should_skip;
const _should_remove = should_remove;
const _replacement = replacement;
should_skip = false;
should_remove = false;
replacement = null;
enter.call(context, node, parent, prop, index);
if (replacement) {
node = replacement;
replace(parent, prop, index, node);
}
if (should_remove) {
remove(parent, prop, index);
}
const skipped = should_skip;
const removed = should_remove;
should_skip = _should_skip;
should_remove = _should_remove;
replacement = _replacement;
if (skipped) return node;
if (removed) return null;
}
for (const key in node) {
const value = (node )[key];
if (typeof value !== 'object') {
continue;
}
else if (Array.isArray(value)) {
for (let j = 0, k = 0; j < value.length; j += 1, k += 1) {
if (value[j] !== null && typeof value[j].type === 'string') {
if (!visit(value[j], node, enter, leave, key, k)) {
// removed
j--;
}
}
}
}
else if (value !== null && typeof value.type === 'string') {
visit(value, node, enter, leave, key, null);
}
}
if (leave) {
const _replacement = replacement;
const _should_remove = should_remove;
replacement = null;
should_remove = false;
leave.call(context, node, parent, prop, index);
if (replacement) {
node = replacement;
replace(parent, prop, index, node);
}
if (should_remove) {
remove(parent, prop, index);
}
const removed = should_remove;
replacement = _replacement;
should_remove = _should_remove;
if (removed) return null;
}
}
return node;
}
exports.walk = walk;
Object.defineProperty(exports, '__esModule', { value: true });
})));
{"version":3,"file":"estree-walker.umd.js","sources":["../src/estree-walker.js"],"sourcesContent":["export function walk(ast, { enter, leave }) {\n\tvisit(ast, null, enter, leave);\n}\n\nlet shouldSkip = false;\nconst context = { skip: () => shouldSkip = true };\n\nexport const childKeys = {};\n\nconst toString = Object.prototype.toString;\n\nfunction isArray(thing) {\n\treturn toString.call(thing) === '[object Array]';\n}\n\nfunction visit(node, parent, enter, leave, prop, index) {\n\tif (!node) return;\n\n\tif (enter) {\n\t\tconst _shouldSkip = shouldSkip;\n\t\tshouldSkip = false;\n\t\tenter.call(context, node, parent, prop, index);\n\t\tconst skipped = shouldSkip;\n\t\tshouldSkip = _shouldSkip;\n\n\t\tif (skipped) return;\n\t}\n\n\tconst keys = childKeys[node.type] || (\n\t\tchildKeys[node.type] = Object.keys(node).filter(key => typeof node[key] === 'object')\n\t);\n\n\tfor (let i = 0; i < keys.length; i += 1) {\n\t\tconst key = keys[i];\n\t\tconst value = node[key];\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let j = 0; j < value.length; j += 1) {\n\t\t\t\tvisit(value[j], node, enter, leave, key, j);\n\t\t\t}\n\t\t}\n\n\t\telse if (value && value.type) {\n\t\t\tvisit(value, node, enter, leave, key, null);\n\t\t}\n\t}\n\n\tif (leave) {\n\t\tleave(node, parent, prop, index);\n\t}\n}\n"],"names":[],"mappings":";;;;;;CAAO,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;CAC5C,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAChC,CAAC;;CAED,IAAI,UAAU,GAAG,KAAK,CAAC;CACvB,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,MAAM,UAAU,GAAG,IAAI,EAAE,CAAC;;AAElD,AAAY,OAAC,SAAS,GAAG,EAAE,CAAC;;CAE5B,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;;CAE3C,SAAS,OAAO,CAAC,KAAK,EAAE;CACxB,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,gBAAgB,CAAC;CAClD,CAAC;;CAED,SAAS,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;CACxD,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO;;CAEnB,CAAC,IAAI,KAAK,EAAE;CACZ,EAAE,MAAM,WAAW,GAAG,UAAU,CAAC;CACjC,EAAE,UAAU,GAAG,KAAK,CAAC;CACrB,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;CACjD,EAAE,MAAM,OAAO,GAAG,UAAU,CAAC;CAC7B,EAAE,UAAU,GAAG,WAAW,CAAC;;CAE3B,EAAE,IAAI,OAAO,EAAE,OAAO;CACtB,EAAE;;CAEF,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;CAClC,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC;CACvF,EAAE,CAAC;;CAEH,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;CAC1C,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;CACtB,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;;CAE1B,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;CACtB,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;CAC7C,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;CAChD,IAAI;CACJ,GAAG;;CAEH,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE;CAChC,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;CAC/C,GAAG;CACH,EAAE;;CAEF,CAAC,IAAI,KAAK,EAAE;CACZ,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;CACnC,EAAE;CACF,CAAC;;;;;;;;;;;;;"}
\ No newline at end of file
{
"name": "estree-walker",
"description": "Traverse an ESTree-compliant AST",
"version": "1.0.1",
"author": "Rich Harris",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/Rich-Harris/estree-walker"
},
"main": "dist/estree-walker.umd.js",
"module": "src/estree-walker.js",
"types": "types/index.d.ts",
"scripts": {
"prepublishOnly": "npm run build && npm test",
"build": "tsc && rollup -c",
"test": "mocha --opts mocha.opts"
},
"devDependencies": {
"@types/estree": "0.0.39",
"mocha": "^5.2.0",
"rollup": "^0.67.3",
"rollup-plugin-sucrase": "^2.1.0",
"typescript": "^3.6.3"
},
"files": [
"src",
"dist",
"types",
"README.md"
]
}
function walk(ast, { enter, leave }) {
return visit(ast, null, enter, leave);
}
let should_skip = false;
let should_remove = false;
let replacement = null;
const context = {
skip: () => should_skip = true,
remove: () => should_remove = true,
replace: (node) => replacement = node
};
function replace(parent, prop, index, node) {
if (parent) {
if (index !== null) {
parent[prop][index] = node;
} else {
parent[prop] = node;
}
}
}
function remove(parent, prop, index) {
if (parent) {
if (index !== null) {
parent[prop].splice(index, 1);
} else {
delete parent[prop];
}
}
}
function visit(
node,
parent,
enter,
leave,
prop,
index
) {
if (node) {
if (enter) {
const _should_skip = should_skip;
const _should_remove = should_remove;
const _replacement = replacement;
should_skip = false;
should_remove = false;
replacement = null;
enter.call(context, node, parent, prop, index);
if (replacement) {
node = replacement;
replace(parent, prop, index, node);
}
if (should_remove) {
remove(parent, prop, index);
}
const skipped = should_skip;
const removed = should_remove;
should_skip = _should_skip;
should_remove = _should_remove;
replacement = _replacement;
if (skipped) return node;
if (removed) return null;
}
for (const key in node) {
const value = (node )[key];
if (typeof value !== 'object') {
continue;
}
else if (Array.isArray(value)) {
for (let j = 0, k = 0; j < value.length; j += 1, k += 1) {
if (value[j] !== null && typeof value[j].type === 'string') {
if (!visit(value[j], node, enter, leave, key, k)) {
// removed
j--;
}
}
}
}
else if (value !== null && typeof value.type === 'string') {
visit(value, node, enter, leave, key, null);
}
}
if (leave) {
const _replacement = replacement;
const _should_remove = should_remove;
replacement = null;
should_remove = false;
leave.call(context, node, parent, prop, index);
if (replacement) {
node = replacement;
replace(parent, prop, index, node);
}
if (should_remove) {
remove(parent, prop, index);
}
const removed = should_remove;
replacement = _replacement;
should_remove = _should_remove;
if (removed) return null;
}
}
return node;
}
export { walk };
import { BaseNode } from "estree";
type WalkerContext = {
skip: () => void;
remove: () => void;
replace: (node: BaseNode) => void;
};
type WalkerHandler = (
this: WalkerContext,
node: BaseNode,
parent: BaseNode,
key: string,
index: number
) => void
type Walker = {
enter?: WalkerHandler;
leave?: WalkerHandler;
}
export function walk(ast: BaseNode, { enter, leave }: Walker) {
return visit(ast, null, enter, leave);
}
let should_skip = false;
let should_remove = false;
let replacement: BaseNode = null;
const context: WalkerContext = {
skip: () => should_skip = true,
remove: () => should_remove = true,
replace: (node: BaseNode) => replacement = node
};
function replace(parent: any, prop: string, index: number, node: BaseNode) {
if (parent) {
if (index !== null) {
parent[prop][index] = node;
} else {
parent[prop] = node;
}
}
}
function remove(parent: any, prop: string, index: number) {
if (parent) {
if (index !== null) {
parent[prop].splice(index, 1);
} else {
delete parent[prop];
}
}
}
function visit(
node: BaseNode,
parent: BaseNode,
enter: WalkerHandler,
leave: WalkerHandler,
prop?: string,
index?: number
) {
if (node) {
if (enter) {
const _should_skip = should_skip;
const _should_remove = should_remove;
const _replacement = replacement;
should_skip = false;
should_remove = false;
replacement = null;
enter.call(context, node, parent, prop, index);
if (replacement) {
node = replacement;
replace(parent, prop, index, node);
}
if (should_remove) {
remove(parent, prop, index);
}
const skipped = should_skip;
const removed = should_remove;
should_skip = _should_skip;
should_remove = _should_remove;
replacement = _replacement;
if (skipped) return node;
if (removed) return null;
}
for (const key in node) {
const value = (node as any)[key];
if (typeof value !== 'object') {
continue;
}
else if (Array.isArray(value)) {
for (let j = 0, k = 0; j < value.length; j += 1, k += 1) {
if (value[j] !== null && typeof value[j].type === 'string') {
if (!visit(value[j], node, enter, leave, key, k)) {
// removed
j--;
}
}
}
}
else if (value !== null && typeof value.type === 'string') {
visit(value, node, enter, leave, key, null);
}
}
if (leave) {
const _replacement = replacement;
const _should_remove = should_remove;
replacement = null;
should_remove = false;
leave.call(context, node, parent, prop, index);
if (replacement) {
node = replacement;
replace(parent, prop, index, node);
}
if (should_remove) {
remove(parent, prop, index);
}
const removed = should_remove;
replacement = _replacement;
should_remove = _should_remove;
if (removed) return null;
}
}
return node;
}
import { BaseNode } from "estree";
declare type WalkerContext = {
skip: () => void;
remove: () => void;
replace: (node: BaseNode) => void;
};
declare type WalkerHandler = (this: WalkerContext, node: BaseNode, parent: BaseNode, key: string, index: number) => void;
declare type Walker = {
enter?: WalkerHandler;
leave?: WalkerHandler;
};
export declare function walk(ast: BaseNode, { enter, leave }: Walker): BaseNode;
export {};
{
"name": "@rollup/pluginutils",
"version": "3.1.0",
"publishConfig": {
"access": "public"
},
"description": "A set of utility functions commonly used by Rollup plugins",
"license": "MIT",
"repository": "rollup/plugins",
"author": "Rich Harris <richard.a.harris@gmail.com>",
"homepage": "https://github.com/rollup/plugins/tree/master/packages/pluginutils#readme",
"bugs": {
"url": "https://github.com/rollup/plugins/issues"
},
"main": "./dist/cjs/index.js",
"engines": {
"node": ">= 8.0.0"
},
"scripts": {
"build": "rollup -c",
"ci:coverage": "nyc pnpm run test && nyc report --reporter=text-lcov > coverage.lcov",
"ci:lint": "pnpm run build && pnpm run lint",
"ci:lint:commits": "commitlint --from=${CIRCLE_BRANCH} --to=${CIRCLE_SHA1}",
"ci:test": "pnpm run test -- --verbose",
"lint": "pnpm run lint:js && pnpm run lint:docs && pnpm run lint:package",
"lint:docs": "prettier --single-quote --write README.md",
"lint:js": "eslint --fix --cache src test types --ext .js,.ts",
"lint:package": "prettier --write package.json --plugin=prettier-plugin-package",
"prebuild": "del-cli dist",
"prepare": "pnpm run build",
"prepublishOnly": "pnpm run lint && pnpm run build",
"pretest": "pnpm run build -- --sourcemap",
"test": "ava"
},
"files": [
"dist",
"types",
"README.md",
"LICENSE"
],
"keywords": [
"rollup",
"plugin",
"utils"
],
"peerDependencies": {
"rollup": "^1.20.0||^2.0.0"
},
"dependencies": {
"@types/estree": "0.0.39",
"estree-walker": "^1.0.1",
"picomatch": "^2.2.2"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^11.0.2",
"@rollup/plugin-node-resolve": "^7.1.1",
"@rollup/plugin-typescript": "^3.0.0",
"@types/jest": "^24.9.0",
"@types/node": "^12.12.25",
"@types/picomatch": "^2.2.1",
"typescript": "^3.7.5"
},
"ava": {
"compileEnhancements": false,
"extensions": [
"ts"
],
"require": [
"ts-node/register"
],
"files": [
"!**/fixtures/**",
"!**/helpers/**",
"!**/recipes/**",
"!**/types.ts"
]
},
"exports": {
"require": "./dist/cjs/index.js",
"import": "./dist/es/index.js"
},
"module": "./dist/es/index.js",
"nyc": {
"extension": [
".js",
".ts"
]
},
"type": "commonjs",
"types": "types/index.d.ts"
}
// eslint-disable-next-line import/no-unresolved
import { BaseNode } from 'estree';
export interface AttachedScope {
parent?: AttachedScope;
isBlockScope: boolean;
declarations: { [key: string]: boolean };
addDeclaration(node: BaseNode, isBlockDeclaration: boolean, isVar: boolean): void;
contains(name: string): boolean;
}
export interface DataToEsmOptions {
compact?: boolean;
indent?: string;
namedExports?: boolean;
objectShorthand?: boolean;
preferConst?: boolean;
}
/**
* A valid `minimatch` pattern, or array of patterns.
*/
export type FilterPattern = ReadonlyArray<string | RegExp> | string | RegExp | null;
/**
* Adds an extension to a module ID if one does not exist.
*/
export function addExtension(filename: string, ext?: string): string;
/**
* Attaches `Scope` objects to the relevant nodes of an AST.
* Each `Scope` object has a `scope.contains(name)` method that returns `true`
* if a given name is defined in the current scope or a parent scope.
*/
export function attachScopes(ast: BaseNode, propertyName?: string): AttachedScope;
/**
* Constructs a filter function which can be used to determine whether or not
* certain modules should be operated upon.
* @param include If `include` is omitted or has zero length, filter will return `true` by default.
* @param exclude ID must not match any of the `exclude` patterns.
* @param options Optionally resolves the patterns against a directory other than `process.cwd()`.
* If a `string` is specified, then the value will be used as the base directory.
* Relative paths will be resolved against `process.cwd()` first.
* If `false`, then the patterns will not be resolved against any directory.
* This can be useful if you want to create a filter for virtual module names.
*/
export function createFilter(
include?: FilterPattern,
exclude?: FilterPattern,
options?: { resolve?: string | false | null }
): (id: string | unknown) => boolean;
/**
* Transforms objects into tree-shakable ES Module imports.
* @param data An object to transform into an ES module.
*/
export function dataToEsm(data: unknown, options?: DataToEsmOptions): string;
/**
* Extracts the names of all assignment targets based upon specified patterns.
* @param param An `acorn` AST Node.
*/
export function extractAssignedNames(param: BaseNode): string[];
/**
* Constructs a bundle-safe identifier from a `string`.
*/
export function makeLegalIdentifier(str: string): string;
export type AddExtension = typeof addExtension;
export type AttachScopes = typeof attachScopes;
export type CreateFilter = typeof createFilter;
export type ExtractAssignedNames = typeof extractAssignedNames;
export type MakeLegalIdentifier = typeof makeLegalIdentifier;
export type DataToEsm = typeof dataToEsm;
declare const defaultExport: {
addExtension: AddExtension;
attachScopes: AttachScopes;
createFilter: CreateFilter;
dataToEsm: DataToEsm;
extractAssignedNames: ExtractAssignedNames;
makeLegalIdentifier: MakeLegalIdentifier;
};
export default defaultExport;
MIT License
Copyright (c) Microsoft Corporation.
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
# Installation
> `npm install --save @types/estree`
# Summary
This package contains type definitions for estree (https://github.com/estree/estree).
# Details
Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree.
### Additional Details
* Last updated: Mon, 06 Nov 2023 22:41:05 GMT
* Dependencies: none
# Credits
These definitions were written by [RReverser](https://github.com/RReverser).
declare namespace ESTree {
interface FlowTypeAnnotation extends Node {}
interface FlowBaseTypeAnnotation extends FlowTypeAnnotation {}
interface FlowLiteralTypeAnnotation extends FlowTypeAnnotation, Literal {}
interface FlowDeclaration extends Declaration {}
interface AnyTypeAnnotation extends FlowBaseTypeAnnotation {}
interface ArrayTypeAnnotation extends FlowTypeAnnotation {
elementType: FlowTypeAnnotation;
}
interface BooleanLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {}
interface BooleanTypeAnnotation extends FlowBaseTypeAnnotation {}
interface ClassImplements extends Node {
id: Identifier;
typeParameters?: TypeParameterInstantiation | null;
}
interface ClassProperty {
key: Expression;
value?: Expression | null;
typeAnnotation?: TypeAnnotation | null;
computed: boolean;
static: boolean;
}
interface DeclareClass extends FlowDeclaration {
id: Identifier;
typeParameters?: TypeParameterDeclaration | null;
body: ObjectTypeAnnotation;
extends: InterfaceExtends[];
}
interface DeclareFunction extends FlowDeclaration {
id: Identifier;
}
interface DeclareModule extends FlowDeclaration {
id: Literal | Identifier;
body: BlockStatement;
}
interface DeclareVariable extends FlowDeclaration {
id: Identifier;
}
interface FunctionTypeAnnotation extends FlowTypeAnnotation {
params: FunctionTypeParam[];
returnType: FlowTypeAnnotation;
rest?: FunctionTypeParam | null;
typeParameters?: TypeParameterDeclaration | null;
}
interface FunctionTypeParam {
name: Identifier;
typeAnnotation: FlowTypeAnnotation;
optional: boolean;
}
interface GenericTypeAnnotation extends FlowTypeAnnotation {
id: Identifier | QualifiedTypeIdentifier;
typeParameters?: TypeParameterInstantiation | null;
}
interface InterfaceExtends extends Node {
id: Identifier | QualifiedTypeIdentifier;
typeParameters?: TypeParameterInstantiation | null;
}
interface InterfaceDeclaration extends FlowDeclaration {
id: Identifier;
typeParameters?: TypeParameterDeclaration | null;
extends: InterfaceExtends[];
body: ObjectTypeAnnotation;
}
interface IntersectionTypeAnnotation extends FlowTypeAnnotation {
types: FlowTypeAnnotation[];
}
interface MixedTypeAnnotation extends FlowBaseTypeAnnotation {}
interface NullableTypeAnnotation extends FlowTypeAnnotation {
typeAnnotation: TypeAnnotation;
}
interface NumberLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {}
interface NumberTypeAnnotation extends FlowBaseTypeAnnotation {}
interface StringLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {}
interface StringTypeAnnotation extends FlowBaseTypeAnnotation {}
interface TupleTypeAnnotation extends FlowTypeAnnotation {
types: FlowTypeAnnotation[];
}
interface TypeofTypeAnnotation extends FlowTypeAnnotation {
argument: FlowTypeAnnotation;
}
interface TypeAlias extends FlowDeclaration {
id: Identifier;
typeParameters?: TypeParameterDeclaration | null;
right: FlowTypeAnnotation;
}
interface TypeAnnotation extends Node {
typeAnnotation: FlowTypeAnnotation;
}
interface TypeCastExpression extends Expression {
expression: Expression;
typeAnnotation: TypeAnnotation;
}
interface TypeParameterDeclaration extends Node {
params: Identifier[];
}
interface TypeParameterInstantiation extends Node {
params: FlowTypeAnnotation[];
}
interface ObjectTypeAnnotation extends FlowTypeAnnotation {
properties: ObjectTypeProperty[];
indexers: ObjectTypeIndexer[];
callProperties: ObjectTypeCallProperty[];
}
interface ObjectTypeCallProperty extends Node {
value: FunctionTypeAnnotation;
static: boolean;
}
interface ObjectTypeIndexer extends Node {
id: Identifier;
key: FlowTypeAnnotation;
value: FlowTypeAnnotation;
static: boolean;
}
interface ObjectTypeProperty extends Node {
key: Expression;
value: FlowTypeAnnotation;
optional: boolean;
static: boolean;
}
interface QualifiedTypeIdentifier extends Node {
qualification: Identifier | QualifiedTypeIdentifier;
id: Identifier;
}
interface UnionTypeAnnotation extends FlowTypeAnnotation {
types: FlowTypeAnnotation[];
}
interface VoidTypeAnnotation extends FlowBaseTypeAnnotation {}
}
{
"name": "@types/estree",
"version": "1.0.5",
"description": "TypeScript definitions for estree",
"homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree",
"license": "MIT",
"contributors": [
{
"name": "RReverser",
"githubUsername": "RReverser",
"url": "https://github.com/RReverser"
}
],
"main": "",
"types": "index.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
"directory": "types/estree"
},
"scripts": {},
"dependencies": {},
"typesPublisherContentHash": "6f0eeaffe488ce594e73f8df619c677d752a279b51edbc744e4aebb20db4b3a7",
"typeScriptVersion": "4.5",
"nonNpm": true
}
\ No newline at end of file
tidelift: "npm/balanced-match"
patreon: juliangruber
(MIT)
Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
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.
# balanced-match
Match balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!
[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match)
[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match)
[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match)
## Example
Get the first matching pair of braces:
```js
var balanced = require('balanced-match');
console.log(balanced('{', '}', 'pre{in{nested}}post'));
console.log(balanced('{', '}', 'pre{first}between{second}post'));
console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post'));
```
The matches are:
```bash
$ node example.js
{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
{ start: 3,
end: 9,
pre: 'pre',
body: 'first',
post: 'between{second}post' }
{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
```
## API
### var m = balanced(a, b, str)
For the first non-nested matching pair of `a` and `b` in `str`, return an
object with those keys:
* **start** the index of the first match of `a`
* **end** the index of the matching `b`
* **pre** the preamble, `a` and `b` not included
* **body** the match, `a` and `b` not included
* **post** the postscript, `a` and `b` not included
If there's no match, `undefined` will be returned.
If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`.
### var r = balanced.range(a, b, str)
For the first non-nested matching pair of `a` and `b` in `str`, return an
array with indexes: `[ <a index>, <b index> ]`.
If there's no match, `undefined` will be returned.
If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`.
## Installation
With [npm](https://npmjs.org) do:
```bash
npm install balanced-match
```
## Security contact information
To report a security vulnerability, please use the
[Tidelift security contact](https://tidelift.com/security).
Tidelift will coordinate the fix and disclosure.
## License
(MIT)
Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
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.
'use strict';
module.exports = balanced;
function balanced(a, b, str) {
if (a instanceof RegExp) a = maybeMatch(a, str);
if (b instanceof RegExp) b = maybeMatch(b, str);
var r = range(a, b, str);
return r && {
start: r[0],
end: r[1],
pre: str.slice(0, r[0]),
body: str.slice(r[0] + a.length, r[1]),
post: str.slice(r[1] + b.length)
};
}
function maybeMatch(reg, str) {
var m = str.match(reg);
return m ? m[0] : null;
}
balanced.range = range;
function range(a, b, str) {
var begs, beg, left, right, result;
var ai = str.indexOf(a);
var bi = str.indexOf(b, ai + 1);
var i = ai;
if (ai >= 0 && bi > 0) {
if(a===b) {
return [ai, bi];
}
begs = [];
left = str.length;
while (i >= 0 && !result) {
if (i == ai) {
begs.push(i);
ai = str.indexOf(a, i + 1);
} else if (begs.length == 1) {
result = [ begs.pop(), bi ];
} else {
beg = begs.pop();
if (beg < left) {
left = beg;
right = bi;
}
bi = str.indexOf(b, i + 1);
}
i = ai < bi && ai >= 0 ? ai : bi;
}
if (begs.length) {
result = [ left, right ];
}
}
return result;
}
{
"name": "balanced-match",
"description": "Match balanced character pairs, like \"{\" and \"}\"",
"version": "1.0.2",
"repository": {
"type": "git",
"url": "git://github.com/juliangruber/balanced-match.git"
},
"homepage": "https://github.com/juliangruber/balanced-match",
"main": "index.js",
"scripts": {
"test": "tape test/test.js",
"bench": "matcha test/bench.js"
},
"devDependencies": {
"matcha": "^0.7.0",
"tape": "^4.6.0"
},
"keywords": [
"match",
"regexp",
"test",
"balanced",
"parse"
],
"author": {
"name": "Julian Gruber",
"email": "mail@juliangruber.com",
"url": "http://juliangruber.com"
},
"license": "MIT",
"testling": {
"files": "test/*.js",
"browsers": [
"ie/8..latest",
"firefox/20..latest",
"firefox/nightly",
"chrome/25..latest",
"chrome/canary",
"opera/12..latest",
"opera/next",
"safari/5.1..latest",
"ipad/6.0..latest",
"iphone/6.0..latest",
"android-browser/4.2..latest"
]
}
}
MIT License
Copyright (c) 2013 Julian Gruber <julian@juliangruber.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.
# brace-expansion
[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html),
as known from sh/bash, in JavaScript.
[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion)
[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)
[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/)
[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion)
## Example
```js
var expand = require('brace-expansion');
expand('file-{a,b,c}.jpg')
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
expand('-v{,,}')
// => ['-v', '-v', '-v']
expand('file{0..2}.jpg')
// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
expand('file-{a..c}.jpg')
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
expand('file{2..0}.jpg')
// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
expand('file{0..4..2}.jpg')
// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
expand('file-{a..e..2}.jpg')
// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
expand('file{00..10..5}.jpg')
// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
expand('{{A..C},{a..c}}')
// => ['A', 'B', 'C', 'a', 'b', 'c']
expand('ppp{,config,oe{,conf}}')
// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
```
## API
```js
var expand = require('brace-expansion');
```
### var expanded = expand(str)
Return an array of all possible and valid expansions of `str`. If none are
found, `[str]` is returned.
Valid expansions are:
```js
/^(.*,)+(.+)?$/
// {a,b,...}
```
A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
```js
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
// {x..y[..incr]}
```
A numeric sequence from `x` to `y` inclusive, with optional increment.
If `x` or `y` start with a leading `0`, all the numbers will be padded
to have equal length. Negative numbers and backwards iteration work too.
```js
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
// {x..y[..incr]}
```
An alphabetic sequence from `x` to `y` inclusive, with optional increment.
`x` and `y` must be exactly one character, and if given, `incr` must be a
number.
For compatibility reasons, the string `${` is not eligible for brace expansion.
## Installation
With [npm](https://npmjs.org) do:
```bash
npm install brace-expansion
```
## Contributors
- [Julian Gruber](https://github.com/juliangruber)
- [Isaac Z. Schlueter](https://github.com/isaacs)
## Sponsors
This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)!
Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)!
## License
(MIT)
Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
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.
var concatMap = require('concat-map');
var balanced = require('balanced-match');
module.exports = expandTop;
var escSlash = '\0SLASH'+Math.random()+'\0';
var escOpen = '\0OPEN'+Math.random()+'\0';
var escClose = '\0CLOSE'+Math.random()+'\0';
var escComma = '\0COMMA'+Math.random()+'\0';
var escPeriod = '\0PERIOD'+Math.random()+'\0';
function numeric(str) {
return parseInt(str, 10) == str
? parseInt(str, 10)
: str.charCodeAt(0);
}
function escapeBraces(str) {
return str.split('\\\\').join(escSlash)
.split('\\{').join(escOpen)
.split('\\}').join(escClose)
.split('\\,').join(escComma)
.split('\\.').join(escPeriod);
}
function unescapeBraces(str) {
return str.split(escSlash).join('\\')
.split(escOpen).join('{')
.split(escClose).join('}')
.split(escComma).join(',')
.split(escPeriod).join('.');
}
// Basically just str.split(","), but handling cases
// where we have nested braced sections, which should be
// treated as individual members, like {a,{b,c},d}
function parseCommaParts(str) {
if (!str)
return [''];
var parts = [];
var m = balanced('{', '}', str);
if (!m)
return str.split(',');
var pre = m.pre;
var body = m.body;
var post = m.post;
var p = pre.split(',');
p[p.length-1] += '{' + body + '}';
var postParts = parseCommaParts(post);
if (post.length) {
p[p.length-1] += postParts.shift();
p.push.apply(p, postParts);
}
parts.push.apply(parts, p);
return parts;
}
function expandTop(str) {
if (!str)
return [];
// I don't know why Bash 4.3 does this, but it does.
// Anything starting with {} will have the first two bytes preserved
// but *only* at the top level, so {},a}b will not expand to anything,
// but a{},b}c will be expanded to [a}c,abc].
// One could argue that this is a bug in Bash, but since the goal of
// this module is to match Bash's rules, we escape a leading {}
if (str.substr(0, 2) === '{}') {
str = '\\{\\}' + str.substr(2);
}
return expand(escapeBraces(str), true).map(unescapeBraces);
}
function identity(e) {
return e;
}
function embrace(str) {
return '{' + str + '}';
}
function isPadded(el) {
return /^-?0\d/.test(el);
}
function lte(i, y) {
return i <= y;
}
function gte(i, y) {
return i >= y;
}
function expand(str, isTop) {
var expansions = [];
var m = balanced('{', '}', str);
if (!m || /\$$/.test(m.pre)) return [str];
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
var isSequence = isNumericSequence || isAlphaSequence;
var isOptions = m.body.indexOf(',') >= 0;
if (!isSequence && !isOptions) {
// {a},b}
if (m.post.match(/,.*\}/)) {
str = m.pre + '{' + m.body + escClose + m.post;
return expand(str);
}
return [str];
}
var n;
if (isSequence) {
n = m.body.split(/\.\./);
} else {
n = parseCommaParts(m.body);
if (n.length === 1) {
// x{{a,b}}y ==> x{a}y x{b}y
n = expand(n[0], false).map(embrace);
if (n.length === 1) {
var post = m.post.length
? expand(m.post, false)
: [''];
return post.map(function(p) {
return m.pre + n[0] + p;
});
}
}
}
// at this point, n is the parts, and we know it's not a comma set
// with a single entry.
// no need to expand pre, since it is guaranteed to be free of brace-sets
var pre = m.pre;
var post = m.post.length
? expand(m.post, false)
: [''];
var N;
if (isSequence) {
var x = numeric(n[0]);
var y = numeric(n[1]);
var width = Math.max(n[0].length, n[1].length)
var incr = n.length == 3
? Math.abs(numeric(n[2]))
: 1;
var test = lte;
var reverse = y < x;
if (reverse) {
incr *= -1;
test = gte;
}
var pad = n.some(isPadded);
N = [];
for (var i = x; test(i, y); i += incr) {
var c;
if (isAlphaSequence) {
c = String.fromCharCode(i);
if (c === '\\')
c = '';
} else {
c = String(i);
if (pad) {
var need = width - c.length;
if (need > 0) {
var z = new Array(need + 1).join('0');
if (i < 0)
c = '-' + z + c.slice(1);
else
c = z + c;
}
}
}
N.push(c);
}
} else {
N = concatMap(n, function(el) { return expand(el, false) });
}
for (var j = 0; j < N.length; j++) {
for (var k = 0; k < post.length; k++) {
var expansion = pre + N[j] + post[k];
if (!isTop || isSequence || expansion)
expansions.push(expansion);
}
}
return expansions;
}
{
"name": "brace-expansion",
"description": "Brace expansion as known from sh/bash",
"version": "1.1.11",
"repository": {
"type": "git",
"url": "git://github.com/juliangruber/brace-expansion.git"
},
"homepage": "https://github.com/juliangruber/brace-expansion",
"main": "index.js",
"scripts": {
"test": "tape test/*.js",
"gentest": "bash test/generate.sh",
"bench": "matcha test/perf/bench.js"
},
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
},
"devDependencies": {
"matcha": "^0.7.0",
"tape": "^4.6.0"
},
"keywords": [],
"author": {
"name": "Julian Gruber",
"email": "mail@juliangruber.com",
"url": "http://juliangruber.com"
},
"license": "MIT",
"testling": {
"files": "test/*.js",
"browsers": [
"ie/8..latest",
"firefox/20..latest",
"firefox/nightly",
"chrome/25..latest",
"chrome/canary",
"opera/12..latest",
"opera/next",
"safari/5.1..latest",
"ipad/6.0..latest",
"iphone/6.0..latest",
"android-browser/4.2..latest"
]
}
}
The MIT License
Copyright (c) 2013 James Halliday (mail@substack.net)
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.
\ No newline at end of file
var commondir = require('../');
var dir = commondir(process.argv.slice(2));
console.log(dir);
var path = require('path');
module.exports = function (basedir, relfiles) {
if (relfiles) {
var files = relfiles.map(function (r) {
return path.resolve(basedir, r);
});
}
else {
var files = basedir;
}
var res = files.slice(1).reduce(function (ps, file) {
if (!file.match(/^([A-Za-z]:)?\/|\\/)) {
throw new Error('relative path without a basedir');
}
var xs = file.split(/\/+|\\+/);
for (
var i = 0;
ps[i] === xs[i] && i < Math.min(ps.length, xs.length);
i++
);
return ps.slice(0, i);
}, files[0].split(/\/+|\\+/));
// Windows correctly handles paths with forward-slashes
return res.length > 1 ? res.join('/') : '/'
};
{
"name": "commondir",
"version": "1.0.1",
"description": "compute the closest common parent for file paths",
"main": "index.js",
"dependencies": {},
"devDependencies": {
"tape": "^3.5.0"
},
"scripts": {
"test": "tape test/*.js"
},
"repository": {
"type": "git",
"url": "http://github.com/substack/node-commondir.git"
},
"keywords": [
"common",
"path",
"directory",
"file",
"parent",
"root"
],
"author": {
"name": "James Halliday",
"email": "mail@substack.net",
"url": "http://substack.net"
},
"license": "MIT",
"engine": {
"node": ">=0.4"
}
}
# commondir
compute the closest common parent directory among an array of directories
# example
``` js
var commondir = require('commondir');
var dir = commondir(process.argv.slice(2))
console.log(dir);
```
output:
```
$ node dir.js /x/y/z /x/y /x/y/w/q
/x/y
$ node ../baz ../../foo/quux ./bizzy
/foo
```
# methods
``` js
var commondir = require('commondir');
```
## commondir(absolutePaths)
Compute the closest common parent directory for an array `absolutePaths`.
## commondir(basedir, relativePaths)
Compute the closest common parent directory for an array `relativePaths` which
will be resolved for each `dir` in `relativePaths` according to:
`path.resolve(basedir, dir)`.
# install
With [npm](https://npmjs.org) do:
```
npm install commondir
```
# license
MIT
var test = require('tape');
var commondir = require('../');
test('common', function (t) {
t.equal(
commondir([ '/foo', '//foo/bar', '/foo//bar/baz' ]),
'/foo'
);
t.equal(
commondir([ '/a/b/c', '/a/b', '/a/b/c/d/e' ]),
'/a/b'
);
t.equal(
commondir([ '/x/y/z/w', '/xy/z', '/x/y/z' ]),
'/'
);
t.equal(
commondir([ 'X:\\foo', 'X:\\\\foo\\bar', 'X://foo/bar/baz' ]),
'X:/foo'
);
t.equal(
commondir([ 'X:\\a\\b\\c', 'X:\\a\\b', 'X:\\a\\b\\c\\d\\e' ]),
'X:/a/b'
);
t.equal(
commondir([ 'X:\\x\\y\\z\\w', '\\\\xy\\z', '\\x\\y\\z' ]),
'/'
);
t.throws(function () {
commondir([ '/x/y/z/w', 'qrs', '/x/y/z' ]);
});
t.end();
});
test('base', function (t) {
t.equal(
commondir('/foo/bar', [ 'baz', './quux', '../bar/bazzy' ]),
'/foo/bar'
);
t.equal(
commondir('/a/b', [ 'c', '../b/.', '../../a/b/e' ]),
'/a/b'
);
t.equal(
commondir('/a/b/c', [ '..', '../d', '../../a/z/e' ]),
'/a'
);
t.equal(
commondir('/foo/bar', [ 'baz', '.\\quux', '..\\bar\\bazzy' ]),
'/foo/bar'
);
// Tests including X:\ basedirs must wait until path.resolve supports
// Windows-style paths, starting in Node.js v0.5.X
t.end();
});
language: node_js
node_js:
- 0.4
- 0.6
This software is released under the MIT license:
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.
concat-map
==========
Concatenative mapdashery.
[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)
[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)
example
=======
``` js
var concatMap = require('concat-map');
var xs = [ 1, 2, 3, 4, 5, 6 ];
var ys = concatMap(xs, function (x) {
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
});
console.dir(ys);
```
***
```
[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
```
methods
=======
``` js
var concatMap = require('concat-map')
```
concatMap(xs, fn)
-----------------
Return an array of concatenated elements by calling `fn(x, i)` for each element
`x` and each index `i` in the array `xs`.
When `fn(x, i)` returns an array, its result will be concatenated with the
result array. If `fn(x, i)` returns anything else, that value will be pushed
onto the end of the result array.
install
=======
With [npm](http://npmjs.org) do:
```
npm install concat-map
```
license
=======
MIT
notes
=====
This module was written while sitting high above the ground in a tree.
var concatMap = require('../');
var xs = [ 1, 2, 3, 4, 5, 6 ];
var ys = concatMap(xs, function (x) {
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
});
console.dir(ys);
module.exports = function (xs, fn) {
var res = [];
for (var i = 0; i < xs.length; i++) {
var x = fn(xs[i], i);
if (isArray(x)) res.push.apply(res, x);
else res.push(x);
}
return res;
};
var isArray = Array.isArray || function (xs) {
return Object.prototype.toString.call(xs) === '[object Array]';
};
This diff could not be displayed because it is too large.
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!