From ce6a977c17f5d04bc30dc4acfeeca0bd940cdc85 Mon Sep 17 00:00:00 2001 From: msojocs Date: Sat, 6 Jul 2024 09:41:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=B5=8B=E8=AF=95=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/runner/{linux.ts => binary-linux.ts} | 18 +- test/runner/{windows.ts => binary-windows.ts} | 0 test/runner/module-linux.ts | 95 ++ test/runner/module-windows.ts | 63 + test/runner/nwjs/compiler.js | 16 + test/runner/nwjs/linux.ts | 0 test/runner/nwjs/wcc/lib/index.js | 4 + test/runner/nwjs/wcc/lib/util.js | 1134 +++++++++++++++++ test/runner/nwjs/wcc/lib/wcc.js | 94 ++ test/runner/nwjs/wcc/lib/wcsc.js | 92 ++ test/runner/nwjs/wcc/package.json | 18 + test/runner/nwjs/windows.ts | 0 test/runner/types.d.ts | 12 + test/spec/wcc/empty/version.spec.ts | 4 +- test/spec/wcc/lla/lla.spec.ts | 4 +- test/spec/wcc/llw/llw.spec.ts | 4 +- .../module/data/options-1719836862880.json | 551 ++++++++ .../module/data/options-1719836863260.json | 550 ++++++++ .../module/data/options-1719837343327.json | 550 ++++++++ .../module/data/options-1719837343936.json | 551 ++++++++ .../module/data/options-1719837362634.json | 550 ++++++++ .../module/data/options-1719837363103.json | 551 ++++++++ test/spec/wcc/module/module.spec.ts | 46 + test/spec/wcc/module/nwjs-download.sh | 16 + test/spec/wcc/raw/raw.spec.ts | 4 +- ...tdesign-miniprogram-starter-retail.spec.ts | 4 +- test/spec/wcsc/empty/version.spec.ts | 4 +- test/spec/wcsc/ll/ll.spec.ts | 4 +- test/spec/wcsc/raw/raw.spec.ts | 4 +- ...tdesign-miniprogram-starter-retail.spec.ts | 4 +- 30 files changed, 4919 insertions(+), 28 deletions(-) rename test/runner/{linux.ts => binary-linux.ts} (86%) rename test/runner/{windows.ts => binary-windows.ts} (100%) create mode 100644 test/runner/module-linux.ts create mode 100644 test/runner/module-windows.ts create mode 100644 test/runner/nwjs/compiler.js delete mode 100644 test/runner/nwjs/linux.ts create mode 100644 test/runner/nwjs/wcc/lib/index.js create mode 100644 test/runner/nwjs/wcc/lib/util.js create mode 100644 test/runner/nwjs/wcc/lib/wcc.js create mode 100644 test/runner/nwjs/wcc/lib/wcsc.js create mode 100644 test/runner/nwjs/wcc/package.json delete mode 100644 test/runner/nwjs/windows.ts create mode 100644 test/runner/types.d.ts create mode 100644 test/spec/wcc/module/data/options-1719836862880.json create mode 100644 test/spec/wcc/module/data/options-1719836863260.json create mode 100644 test/spec/wcc/module/data/options-1719837343327.json create mode 100644 test/spec/wcc/module/data/options-1719837343936.json create mode 100644 test/spec/wcc/module/data/options-1719837362634.json create mode 100644 test/spec/wcc/module/data/options-1719837363103.json create mode 100644 test/spec/wcc/module/module.spec.ts create mode 100755 test/spec/wcc/module/nwjs-download.sh diff --git a/test/runner/linux.ts b/test/runner/binary-linux.ts similarity index 86% rename from test/runner/linux.ts rename to test/runner/binary-linux.ts index 1cf6adf..15350fc 100644 --- a/test/runner/linux.ts +++ b/test/runner/binary-linux.ts @@ -6,29 +6,28 @@ const wcsc = (args: string[], projectPath: string, outputPath: string | undefine if(!fs.existsSync(projectPath)){ throw new Error('projectPath not exists.') } - const node_exec = spawn( + const binaryExec = spawn( path.resolve(__dirname, "../../build/wcsc"), args, { cwd: projectPath, env: { - WX_DEBUG_COMPILER_OUTPUT: outputPath, }, // stdio: 'inherit' } ); const spwanData: any[] = [], errData: any[] = []; - node_exec.stdout.on("data", (e) => { + binaryExec.stdout.on("data", (e) => { spwanData.push(e); // console.log(e.toString()) }); - node_exec.stderr.on("data", (e) => { + binaryExec.stderr.on("data", (e) => { errData.push(e); // console.log(e.toString()) }); return new Promise((resolve, reject) => { - node_exec.on("close", (n) => { + binaryExec.on("close", (n) => { outputPath && require('fs').writeFileSync(`${outputPath}/linux_err.js`, Buffer.concat(errData).toString()) if (0 === n) { @@ -47,29 +46,28 @@ const wcc = (args: string[], projectPath: string, outputPath: string | undefined if(!fs.existsSync(projectPath)){ throw new Error('projectPath not exists.') } - const node_exec = spawn( + const binaryExec = spawn( path.resolve(__dirname, "../../build/wcc"), args, { cwd: projectPath, env: { - WX_DEBUG_COMPILER_OUTPUT: outputPath, }, // stdio: 'inherit' } ); const spwanData: any[] = [], errData: any[] = []; - node_exec.stdout.on("data", (e) => { + binaryExec.stdout.on("data", (e) => { spwanData.push(e); // console.log(e.toString()) }); - node_exec.stderr.on("data", (e) => { + binaryExec.stderr.on("data", (e) => { errData.push(e); // console.log(e.toString()) }); return new Promise((resolve, reject) => { - node_exec.on("close", (n) => { + binaryExec.on("close", (n) => { // console.log("node n: ", n); outputPath && require('fs').writeFileSync(`${outputPath}/linux_err.js`, Buffer.concat(errData).toString()) if (0 === n) { diff --git a/test/runner/windows.ts b/test/runner/binary-windows.ts similarity index 100% rename from test/runner/windows.ts rename to test/runner/binary-windows.ts diff --git a/test/runner/module-linux.ts b/test/runner/module-linux.ts new file mode 100644 index 0000000..137bfa3 --- /dev/null +++ b/test/runner/module-linux.ts @@ -0,0 +1,95 @@ +import { spawn } from "child_process"; +import path from "path"; +import * as fs from 'fs' + +const NW_VERSION = '0.55.0' + +const wcscNative = (optionsPath: string, projectPath: string, outputPath: string | undefined = undefined): Promise => { + if(!fs.existsSync(projectPath)) + { + throw new Error('projectPath not exists.') + } + const nodeExec = spawn( + path.resolve(__dirname, `../../../cache/nwjs-sdk-v${NW_VERSION}-linux-x64/nw`), + [ 'wcsc.js', optionsPath ], + { + cwd: projectPath, + env: { + WX_DEBUG_COMPILER_OUTPUT: outputPath, + }, + // stdio: 'inherit' + } + ); + const spwanData: any[] = [], + errData: any[] = []; + nodeExec.stdout.on("data", (e) => { + spwanData.push(e); + // console.log(e.toString()) + }); + nodeExec.stderr.on("data", (e) => { + errData.push(e); + // console.log(e.toString()) + }); + return new Promise((resolve, reject) => { + nodeExec.on("close", (n) => { + outputPath && require('fs').writeFileSync(`${outputPath}/linux_err.js`, Buffer.concat(errData).toString()) + + if (0 === n) { + let result = Buffer.concat(spwanData).toString(); + // result = JSON.parse(result); + resolve(result); + } else { + // process.stderr.write(Buffer.concat(errData).toString()); + // process.stderr.write(Buffer.concat(spwanData).toString()); + reject(n); + } + }); + }); +}; +const wccNative = (optionsPath: string, projectPath: string, outputPath: string | undefined = undefined): Promise => { + if(!fs.existsSync(projectPath)){ + throw new Error('projectPath not exists.') + } + const nodeExec = spawn( + path.resolve(__dirname, `../../../cache/nwjs-sdk-v${NW_VERSION}-linux-x64/nw`), + ['wcc.js', optionsPath], + { + cwd: projectPath, + env: { + WX_DEBUG_COMPILER_OUTPUT: outputPath, + }, + // stdio: 'inherit' + } + ); + const spwanData: any[] = [], + errData: any[] = []; + nodeExec.stdout.on("data", (e) => { + spwanData.push(e); + // console.log(e.toString()) + }); + nodeExec.stderr.on("data", (e) => { + errData.push(e); + // console.log(e.toString()) + }); + return new Promise((resolve, reject) => { + nodeExec.on("close", (n) => { + // console.log("node n: ", n); + outputPath && require('fs').writeFileSync(`${outputPath}/linux_err.js`, Buffer.concat(errData).toString()) + if (0 === n) { + let result = Buffer.concat(spwanData).toString(); + // process.stdout.write(result); + // result = JSON.parse(result); + resolve(result); + } else { + process.stderr.write(Buffer.concat(errData).toString()); + // process.stderr.write(Buffer.concat(spwanData).toString()); + reject(n); + } + }); + }); +}; + +export default { + wcsc: wcscNative, + wcc: wccNative +} \ No newline at end of file diff --git a/test/runner/module-windows.ts b/test/runner/module-windows.ts new file mode 100644 index 0000000..ef3aa11 --- /dev/null +++ b/test/runner/module-windows.ts @@ -0,0 +1,63 @@ +import * as fs from 'fs' +import { request } from "http"; +import { CompilerOptions } from './types'; + +// 预先启动wine focker环境,再使用HTTP协议,最后销毁容器 +const HTTP = { + POST: (type: 'wcc' | 'wcsc', compilerOptions: CompilerOptions): Promise => { + return new Promise((resolve, reject) => { + + const postData = JSON.stringify(compilerOptions); + + const options = { + hostname: 'localhost', + port: 8083, + path: `/${type}`, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(postData), + }, + }; + + + const req = request(options, (res) => { + console.log(`STATUS: ${res.statusCode}`); + console.log(`HEADERS: ${JSON.stringify(res.headers)}`); + res.setEncoding('utf8'); + let ret = "" + res.on('data', (chunk) => { + console.log(`BODY: ${chunk}`); + ret += chunk + }); + res.on('end', () => { + console.log('No more data in response.'); + resolve(ret) + }); + }); + + req.on('error', (e) => { + console.error(`problem with request: ${e.message}`); + reject(e) + }); + + // Write data to request body + req.write(postData); + req.end(); + }) + } +} + +const wcscNative = async (optionsPath: string) => { + const options = JSON.parse(fs.readFileSync(optionsPath).toString()) + return await HTTP.POST('wcsc', options) +}; +const wccNative = async (optionsPath: string) => { + const options = JSON.parse(fs.readFileSync(optionsPath).toString()) + return await HTTP.POST('wcc', options) +}; + +export default { + wcsc: wcscNative, + wcc: wccNative +} \ No newline at end of file diff --git a/test/runner/nwjs/compiler.js b/test/runner/nwjs/compiler.js new file mode 100644 index 0000000..1cfa6af --- /dev/null +++ b/test/runner/nwjs/compiler.js @@ -0,0 +1,16 @@ +const fs = require("fs"); +const compiler = require("./wcc"); + +const args = process.argv.slice(1); +const [type, p] = args; +const optionsData = fs.readFileSync(p).toString(); +const options = JSON.parse(optionsData); + +(async () => { + const result = await compiler[type](options); + if (typeof result === "string") { + process.stdout.write(result); + } else { + process.stdout.write(JSON.stringify(result)); + } +})(); diff --git a/test/runner/nwjs/linux.ts b/test/runner/nwjs/linux.ts deleted file mode 100644 index e69de29..0000000 diff --git a/test/runner/nwjs/wcc/lib/index.js b/test/runner/nwjs/wcc/lib/index.js new file mode 100644 index 0000000..96015fe --- /dev/null +++ b/test/runner/nwjs/wcc/lib/index.js @@ -0,0 +1,4 @@ +module.exports = { + wcc: require('./wcc'), + wcsc: require('./wcsc') +} \ No newline at end of file diff --git a/test/runner/nwjs/wcc/lib/util.js b/test/runner/nwjs/wcc/lib/util.js new file mode 100644 index 0000000..c21a2c2 --- /dev/null +++ b/test/runner/nwjs/wcc/lib/util.js @@ -0,0 +1,1134 @@ +// Built by eustia. +/* eslint-disable */ + +var _ = {}; + +/* ------------------------------ has ------------------------------ */ + +var has = _.has = (function (exports) { + /* Checks if key is a direct property. + * + * |Name |Desc | + * |------|--------------------------------| + * |obj |Object to query | + * |key |Path to check | + * |return|True if key is a direct property| + */ + + /* example + * has({ one: 1 }, 'one'); // -> true + */ + + /* typescript + * export declare function has(obj: {}, key: string): boolean; + */ + var hasOwnProp = Object.prototype.hasOwnProperty; + + exports = function(obj, key) { + return hasOwnProp.call(obj, key); + }; + + return exports; +})({}); + +/* ------------------------------ isUndef ------------------------------ */ + +var isUndef = _.isUndef = (function (exports) { + /* Check if value is undefined. + * + * |Name |Desc | + * |------|--------------------------| + * |val |Value to check | + * |return|True if value is undefined| + */ + + /* example + * isUndef(void 0); // -> true + * isUndef(null); // -> false + */ + + /* typescript + * export declare function isUndef(val: any): boolean; + */ + exports = function(val) { + return val === void 0; + }; + + return exports; +})({}); + +/* ------------------------------ types ------------------------------ */ + +var types = _.types = (function (exports) { + /* Used for typescript definitions only. + */ + + /* typescript + * export declare namespace types { + * interface Collection {} + * interface List extends Collection { + * [index: number]: T; + * length: number; + * } + * interface ListIterator { + * (value: T, index: number, list: List): TResult; + * } + * interface Dictionary extends Collection { + * [index: string]: T; + * } + * interface ObjectIterator { + * (element: T, key: string, list: Dictionary): TResult; + * } + * interface MemoIterator { + * (prev: TResult, curr: T, index: number, list: List): TResult; + * } + * interface MemoObjectIterator { + * (prev: TResult, curr: T, key: string, list: Dictionary): TResult; + * } + * type Fn = (...args: any[]) => T; + * type AnyFn = Fn; + * type PlainObj = { [name: string]: T }; + * } + * export declare const types: {}; + */ + exports = {}; + + return exports; +})({}); + +/* ------------------------------ keys ------------------------------ */ + +var keys = _.keys = (function (exports) { + /* Create an array of the own enumerable property names of object. + * + * |Name |Desc | + * |------|-----------------------| + * |obj |Object to query | + * |return|Array of property names| + */ + + /* example + * keys({ a: 1 }); // -> ['a'] + */ + + /* typescript + * export declare function keys(obj: any): string[]; + */ + + /* dependencies + * has + */ + + if (Object.keys && !false) { + exports = Object.keys; + } else { + exports = function(obj) { + var ret = []; + + for (var key in obj) { + if (has(obj, key)) ret.push(key); + } + + return ret; + }; + } + + return exports; +})({}); + +/* ------------------------------ optimizeCb ------------------------------ */ + +var optimizeCb = _.optimizeCb = (function (exports) { + /* Used for function context binding. + */ + + /* typescript + * export declare function optimizeCb( + * fn: types.AnyFn, + * ctx: any, + * argCount?: number + * ): types.AnyFn; + */ + + /* dependencies + * isUndef types + */ + + exports = function(fn, ctx, argCount) { + if (isUndef(ctx)) return fn; + + switch (argCount == null ? 3 : argCount) { + case 1: + return function(val) { + return fn.call(ctx, val); + }; + + case 3: + return function(val, idx, collection) { + return fn.call(ctx, val, idx, collection); + }; + + case 4: + return function(accumulator, val, idx, collection) { + return fn.call(ctx, accumulator, val, idx, collection); + }; + } + + return function() { + return fn.apply(ctx, arguments); + }; + }; + + return exports; +})({}); + +/* ------------------------------ identity ------------------------------ */ + +var identity = _.identity = (function (exports) { + /* Return the first argument given. + * + * |Name |Desc | + * |------|-----------| + * |val |Any value | + * |return|Given value| + */ + + /* example + * identity('a'); // -> 'a' + */ + + /* typescript + * export declare function identity(val: T): T; + */ + exports = function(val) { + return val; + }; + + return exports; +})({}); + +/* ------------------------------ objToStr ------------------------------ */ + +var objToStr = _.objToStr = (function (exports) { + /* Alias of Object.prototype.toString. + * + * |Name |Desc | + * |------|------------------------------------| + * |val |Source value | + * |return|String representation of given value| + */ + + /* example + * objToStr(5); // -> '[object Number]' + */ + + /* typescript + * export declare function objToStr(val: any): string; + */ + var ObjToStr = Object.prototype.toString; + + exports = function(val) { + return ObjToStr.call(val); + }; + + return exports; +})({}); + +/* ------------------------------ isArr ------------------------------ */ + +var isArr = _.isArr = (function (exports) { + /* Check if value is an `Array` object. + * + * |Name |Desc | + * |------|----------------------------------| + * |val |Value to check | + * |return|True if value is an `Array` object| + */ + + /* example + * isArr([]); // -> true + * isArr({}); // -> false + */ + + /* typescript + * export declare function isArr(val: any): boolean; + */ + + /* dependencies + * objToStr + */ + + if (Array.isArray && !false) { + exports = Array.isArray; + } else { + exports = function(val) { + return objToStr(val) === '[object Array]'; + }; + } + + return exports; +})({}); + +/* ------------------------------ castPath ------------------------------ */ + +var castPath = _.castPath = (function (exports) { + /* Cast value into a property path array. + * + * |Name |Desc | + * |------|-------------------| + * |path |Value to inspect | + * |obj |Object to query | + * |return|Property path array| + */ + + /* example + * castPath('a.b.c'); // -> ['a', 'b', 'c'] + * castPath(['a']); // -> ['a'] + * castPath('a[0].b'); // -> ['a', '0', 'b'] + * castPath('a.b.c', { 'a.b.c': true }); // -> ['a.b.c'] + */ + + /* typescript + * export declare function castPath(path: string | string[], obj?: any): string[]; + */ + + /* dependencies + * has isArr + */ + + exports = function(str, obj) { + if (isArr(str)) return str; + if (obj && has(obj, str)) return [str]; + var ret = []; + str.replace(regPropName, function(match, number, quote, str) { + ret.push(quote ? str.replace(regEscapeChar, '$1') : number || match); + }); + return ret; + }; // Lodash _stringToPath + + var regPropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + var regEscapeChar = /\\(\\)?/g; + + return exports; +})({}); + +/* ------------------------------ isNum ------------------------------ */ + +var isNum = _.isNum = (function (exports) { + /* Check if value is classified as a Number primitive or object. + * + * |Name |Desc | + * |------|-------------------------------------| + * |val |Value to check | + * |return|True if value is correctly classified| + */ + + /* example + * isNum(5); // -> true + * isNum(5.1); // -> true + * isNum({}); // -> false + */ + + /* typescript + * export declare function isNum(val: any): boolean; + */ + + /* dependencies + * objToStr + */ + + exports = function(val) { + return objToStr(val) === '[object Number]'; + }; + + return exports; +})({}); + +/* ------------------------------ isFn ------------------------------ */ + +var isFn = _.isFn = (function (exports) { + /* Check if value is a function. + * + * |Name |Desc | + * |------|---------------------------| + * |val |Value to check | + * |return|True if value is a function| + * + * Generator function is also classified as true. + */ + + /* example + * isFn(function() {}); // -> true + * isFn(function*() {}); // -> true + * isFn(async function() {}); // -> true + */ + + /* typescript + * export declare function isFn(val: any): boolean; + */ + + /* dependencies + * objToStr + */ + + exports = function(val) { + var objStr = objToStr(val); + return ( + objStr === '[object Function]' || + objStr === '[object GeneratorFunction]' || + objStr === '[object AsyncFunction]' + ); + }; + + return exports; +})({}); + +/* ------------------------------ isArrLike ------------------------------ */ + +var isArrLike = _.isArrLike = (function (exports) { + /* Check if value is array-like. + * + * |Name |Desc | + * |------|---------------------------| + * |val |Value to check | + * |return|True if value is array like| + * + * Function returns false. + */ + + /* example + * isArrLike('test'); // -> true + * isArrLike(document.body.children); // -> true; + * isArrLike([1, 2, 3]); // -> true + */ + + /* typescript + * export declare function isArrLike(val: any): boolean; + */ + + /* dependencies + * isNum isFn + */ + + var MAX_ARR_IDX = Math.pow(2, 53) - 1; + + exports = function(val) { + if (!val) return false; + var len = val.length; + return isNum(len) && len >= 0 && len <= MAX_ARR_IDX && !isFn(val); + }; + + return exports; +})({}); + +/* ------------------------------ each ------------------------------ */ + +var each = _.each = (function (exports) { + /* Iterate over elements of collection and invokes iterator for each element. + * + * |Name |Desc | + * |--------|------------------------------| + * |obj |Collection to iterate over | + * |iterator|Function invoked per iteration| + * |ctx |Function context | + */ + + /* example + * each({ a: 1, b: 2 }, function(val, key) {}); + */ + + /* typescript + * export declare function each( + * list: types.List, + * iterator: types.ListIterator, + * ctx?: any + * ): types.List; + * export declare function each( + * object: types.Dictionary, + * iterator: types.ObjectIterator, + * ctx?: any + * ): types.Collection; + */ + + /* dependencies + * isArrLike keys optimizeCb types + */ + + exports = function(obj, iterator, ctx) { + iterator = optimizeCb(iterator, ctx); + var i, len; + + if (isArrLike(obj)) { + for (i = 0, len = obj.length; i < len; i++) { + iterator(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + + for (i = 0, len = _keys.length; i < len; i++) { + iterator(obj[_keys[i]], _keys[i], obj); + } + } + + return obj; + }; + + return exports; +})({}); + +/* ------------------------------ createAssigner ------------------------------ */ + +var createAssigner = _.createAssigner = (function (exports) { + /* Used to create extend, extendOwn and defaults. + * + * |Name |Desc | + * |--------|------------------------------| + * |keysFn |Function to get object keys | + * |defaults|No override when set to true | + * |return |Result function, extend... | + */ + + /* typescript + * export declare function createAssigner( + * keysFn: types.AnyFn, + * defaults: boolean + * ): types.AnyFn; + */ + + /* dependencies + * isUndef each types + */ + + exports = function(keysFn, defaults) { + return function(obj) { + each(arguments, function(src, idx) { + if (idx === 0) return; + var keys = keysFn(src); + each(keys, function(key) { + if (!defaults || isUndef(obj[key])) obj[key] = src[key]; + }); + }); + return obj; + }; + }; + + return exports; +})({}); + +/* ------------------------------ extendOwn ------------------------------ */ + +var extendOwn = _.extendOwn = (function (exports) { + /* Like extend, but only copies own properties over to the destination object. + * + * |Name |Desc | + * |-----------|------------------| + * |destination|Destination object| + * |...sources |Sources objects | + * |return |Destination object| + */ + + /* example + * extendOwn({ name: 'RedHood' }, { age: 24 }); // -> {name: 'RedHood', age: 24} + */ + + /* typescript + * export declare function extendOwn(destination: any, ...sources: any[]): any; + */ + + /* dependencies + * keys createAssigner + */ + + exports = createAssigner(keys); + + return exports; +})({}); + +/* ------------------------------ isBrowser ------------------------------ */ + +var isBrowser = _.isBrowser = (function (exports) { + /* Check if running in a browser. + */ + + /* example + * console.log(isBrowser); // -> true if running in a browser + */ + + /* typescript + * export declare const isBrowser: boolean; + */ + exports = + typeof window === 'object' && + typeof document === 'object' && + document.nodeType === 9; + + return exports; +})({}); + +/* ------------------------------ root ------------------------------ */ + +var root = _.root = (function (exports) { + /* Root object reference, `global` in nodeJs, `window` in browser. */ + + /* typescript + * export declare const root: any; + */ + + /* dependencies + * isBrowser + */ + + exports = isBrowser ? window : global; + + return exports; +})({}); + +/* ------------------------------ isMatch ------------------------------ */ + +var isMatch = _.isMatch = (function (exports) { + /* Check if keys and values in src are contained in obj. + * + * |Name |Desc | + * |------|----------------------------------| + * |obj |Object to inspect | + * |src |Object of property values to match| + * |return|True if object is match | + */ + + /* example + * isMatch({ a: 1, b: 2 }, { a: 1 }); // -> true + */ + + /* typescript + * export declare function isMatch(obj: any, src: any): boolean; + */ + + /* dependencies + * keys + */ + + exports = function(obj, src) { + var _keys = keys(src); + + var len = _keys.length; + if (obj == null) return !len; + obj = Object(obj); + + for (var i = 0; i < len; i++) { + var key = _keys[i]; + if (src[key] !== obj[key] || !(key in obj)) return false; + } + + return true; + }; + + return exports; +})({}); + +/* ------------------------------ isObj ------------------------------ */ + +var isObj = _.isObj = (function (exports) { + /* Check if value is the language type of Object. + * + * |Name |Desc | + * |------|--------------------------| + * |val |Value to check | + * |return|True if value is an object| + * + * [Language Spec](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types) + */ + + /* example + * isObj({}); // -> true + * isObj([]); // -> true + */ + + /* typescript + * export declare function isObj(val: any): boolean; + */ + exports = function(val) { + var type = typeof val; + return !!val && (type === 'function' || type === 'object'); + }; + + return exports; +})({}); + +/* ------------------------------ isStr ------------------------------ */ + +var isStr = _.isStr = (function (exports) { + /* Check if value is a string primitive. + * + * |Name |Desc | + * |------|-----------------------------------| + * |val |Value to check | + * |return|True if value is a string primitive| + */ + + /* example + * isStr('licia'); // -> true + */ + + /* typescript + * export declare function isStr(val: any): boolean; + */ + + /* dependencies + * objToStr + */ + + exports = function(val) { + return objToStr(val) === '[object String]'; + }; + + return exports; +})({}); + +/* ------------------------------ matcher ------------------------------ */ + +var matcher = _.matcher = (function (exports) { + /* Return a predicate function that checks if attrs are contained in an object. + * + * |Name |Desc | + * |------|----------------------------------| + * |attrs |Object of property values to match| + * |return|New predicate function | + */ + + /* example + * const filter = require('licia/filter'); + * + * const objects = [ + * { a: 1, b: 2, c: 3 }, + * { a: 4, b: 5, c: 6 } + * ]; + * filter(objects, matcher({ a: 4, c: 6 })); // -> [{a: 4, b: 5, c: 6}] + */ + + /* typescript + * export declare function matcher(attrs: any): types.AnyFn; + */ + + /* dependencies + * extendOwn isMatch types + */ + + exports = function(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; + }; + + return exports; +})({}); + +/* ------------------------------ restArgs ------------------------------ */ + +var restArgs = _.restArgs = (function (exports) { + /* This accumulates the arguments passed into an array, after a given index. + * + * |Name |Desc | + * |----------|---------------------------------------| + * |function |Function that needs rest parameters | + * |startIndex|The start index to accumulates | + * |return |Generated function with rest parameters| + */ + + /* example + * const paramArr = restArgs(function(rest) { + * return rest; + * }); + * paramArr(1, 2, 3, 4); // -> [1, 2, 3, 4] + */ + + /* typescript + * export declare function restArgs( + * fn: types.AnyFn, + * startIndex?: number + * ): types.AnyFn; + */ + + /* dependencies + * types + */ + + exports = function(fn, startIdx) { + startIdx = startIdx == null ? fn.length - 1 : +startIdx; + return function() { + var len = Math.max(arguments.length - startIdx, 0); + var rest = new Array(len); + var i; + + for (i = 0; i < len; i++) { + rest[i] = arguments[i + startIdx]; + } // Call runs faster than apply. + + switch (startIdx) { + case 0: + return fn.call(this, rest); + + case 1: + return fn.call(this, arguments[0], rest); + + case 2: + return fn.call(this, arguments[0], arguments[1], rest); + } + + var args = new Array(startIdx + 1); + + for (i = 0; i < startIdx; i++) { + args[i] = arguments[i]; + } + + args[startIdx] = rest; + return fn.apply(this, args); + }; + }; + + return exports; +})({}); + +/* ------------------------------ promisify ------------------------------ */ + +var promisify = _.promisify = (function (exports) { + /* Convert callback based functions into Promises. + * + * |Name |Desc | + * |---------------|--------------------------------------| + * |fn |Callback based function | + * |multiArgs=false|If callback has multiple success value| + * |return |Result function | + * + * If multiArgs is set to true, the resulting promise will always fulfill with an array of the callback's success values. + */ + + /* example + * const fs = require('fs'); + * + * const readFile = promisify(fs.readFile); + * readFile('test.js', 'utf-8').then(function(data) { + * // Do something with file content. + * }); + */ + + /* typescript + * export declare function promisify( + * fn: types.AnyFn, + * multiArgs?: boolean + * ): types.AnyFn; + */ + + /* dependencies + * restArgs root types + */ + + exports = function(fn, multiArgs) { + return restArgs(function(args) { + return new root.Promise(function(resolve, reject) { + args.push( + restArgs(function callback(err, values) { + if (err) return reject(err); + if (!multiArgs) return resolve(values[0]); + resolve(values); + }) + ); + fn.apply(this, args); + }); + }); + }; + + return exports; +})({}); + +/* ------------------------------ safeGet ------------------------------ */ + +var safeGet = _.safeGet = (function (exports) { + /* Get object property, don't throw undefined error. + * + * |Name |Desc | + * |------|-------------------------| + * |obj |Object to query | + * |path |Path of property to get | + * |return|Target value or undefined| + */ + + /* example + * const obj = { a: { aa: { aaa: 1 } } }; + * safeGet(obj, 'a.aa.aaa'); // -> 1 + * safeGet(obj, ['a', 'aa']); // -> {aaa: 1} + * safeGet(obj, 'a.b'); // -> undefined + */ + + /* typescript + * export declare function safeGet(obj: any, path: string | string[]): any; + */ + + /* dependencies + * isUndef castPath + */ + + exports = function(obj, path) { + path = castPath(path, obj); + var prop; + prop = path.shift(); + + while (!isUndef(prop)) { + obj = obj[prop]; + if (obj == null) return; + prop = path.shift(); + } + + return obj; + }; + + return exports; +})({}); + +/* ------------------------------ property ------------------------------ */ + +var property = _.property = (function (exports) { + /* Return a function that will itself return the key property of any passed-in object. + * + * |Name |Desc | + * |------|---------------------------| + * |path |Path of the property to get| + * |return|New accessor function | + */ + + /* example + * const obj = { a: { b: 1 } }; + * property('a')(obj); // -> {b: 1} + * property(['a', 'b'])(obj); // -> 1 + */ + + /* typescript + * export declare function property(path: string | string[]): types.AnyFn; + */ + + /* dependencies + * isArr safeGet types + */ + + exports = function(path) { + if (!isArr(path)) return shallowProperty(path); + return function(obj) { + return safeGet(obj, path); + }; + }; + + function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + } + + return exports; +})({}); + +/* ------------------------------ safeCb ------------------------------ */ + +var safeCb = _.safeCb = (function (exports) { + /* Create callback based on input value. + */ + + /* typescript + * export declare function safeCb( + * val?: any, + * ctx?: any, + * argCount?: number + * ): types.AnyFn; + */ + + /* dependencies + * isFn isObj isArr optimizeCb matcher identity types property + */ + + exports = function(val, ctx, argCount) { + if (val == null) return identity; + if (isFn(val)) return optimizeCb(val, ctx, argCount); + if (isObj(val) && !isArr(val)) return matcher(val); + return property(val); + }; + + return exports; +})({}); + +/* ------------------------------ map ------------------------------ */ + +var map = _.map = (function (exports) { + /* Create an array of values by running each element in collection through iteratee. + * + * |Name |Desc | + * |--------|------------------------------| + * |object |Collection to iterate over | + * |iterator|Function invoked per iteration| + * |context |Function context | + * |return |New mapped array | + */ + + /* example + * map([4, 8], function(n) { + * return n * n; + * }); // -> [16, 64] + */ + + /* typescript + * export declare function map( + * list: types.List, + * iterator: types.ListIterator, + * context?: any + * ): TResult[]; + * export declare function map( + * object: types.Dictionary, + * iterator: types.ObjectIterator, + * context?: any + * ): TResult[]; + */ + + /* dependencies + * safeCb keys isArrLike types + */ + + exports = function(obj, iterator, ctx) { + iterator = safeCb(iterator, ctx); + + var _keys = !isArrLike(obj) && keys(obj); + + var len = (_keys || obj).length; + var results = Array(len); + + for (var i = 0; i < len; i++) { + var curKey = _keys ? _keys[i] : i; + results[i] = iterator(obj[curKey], curKey, obj); + } + + return results; + }; + + return exports; +})({}); + +/* ------------------------------ toArr ------------------------------ */ + +var toArr = _.toArr = (function (exports) { + /* Convert value to an array. + * + * |Name |Desc | + * |------|----------------| + * |val |Value to convert| + * |return|Converted array | + */ + + /* example + * toArr({ a: 1, b: 2 }); // -> [{a: 1, b: 2}] + * toArr('abc'); // -> ['abc'] + * toArr(1); // -> [1] + * toArr(null); // -> [] + */ + + /* typescript + * export declare function toArr(val: any): any[]; + */ + + /* dependencies + * isArrLike map isArr isStr + */ + + exports = function(val) { + if (!val) return []; + if (isArr(val)) return val; + if (isArrLike(val) && !isStr(val)) return map(val); + return [val]; + }; + + return exports; +})({}); + +/* ------------------------------ fs ------------------------------ */ +_.fs = (function (exports) { + /* Promised version of node.js fs module. + */ + + /* example + * fs.readFile('test.js') + * .then(function(data) { + * // Do something + * }) + * .catch(function(err) { + * // Handle errors + * }); + */ + + /* typescript + * export declare const fs: { + * readFile(path: string, encoding: string): Promise; + * readFile(path: string): Promise; + * exists(path: string): Promise; + * unlink(path: string): Promise; + * writeFile(path: string, data: string, options?: string): Promise; + * writeFile(path: string, data: Buffer): Promise; + * readdir(path: string): Promise; + * rmdir(path: string): Promise; + * [key: string]: any; + * }; + */ + + /* dependencies + * promisify root each toArr + */ + + const fs = require('fs'); + + each( + [ + 'access', + 'appendFile', + 'chmod', + 'chown', + 'close', + 'fchmod', + 'fchown', + 'fdatasync', + 'fstat', + 'fsync', + 'ftruncate', + 'futimes', + 'link', + 'lstat', + 'mkdir', + 'mkdtemp', + 'open', + 'read', + 'readFile', + 'readdir', + 'readlink', + 'realpath', + 'rename', + 'rmdir', + 'stat', + 'symlink', + 'truncate', + 'unlink', + 'utimes', + 'write', + 'writeFile' + ], + function(method) { + exports[method] = promisify(fs[method]); + } + ); + + exports.exists = function() { + const args = toArr(arguments); + + return new root.Promise(function(resolve) { + args.push(resolve); + fs.exists.apply(null, args); + }); + }; + + return exports; +})({}); + +module.exports = _; \ No newline at end of file diff --git a/test/runner/nwjs/wcc/lib/wcc.js b/test/runner/nwjs/wcc/lib/wcc.js new file mode 100644 index 0000000..bf08e43 --- /dev/null +++ b/test/runner/nwjs/wcc/lib/wcc.js @@ -0,0 +1,94 @@ +const util = require('./util') +const path = require('path') + +let wcc + +function loadWccAddon() { + if (wcc) return + wcc = require('../build/Release/wcc.node') +} + +const fs = util.fs + +exports = async function (options) { + + loadWccAddon() + + if (!options) throw Error('options is required') + + const lazyload = !!options.lazyloadConfig + + options = Object.assign( + { + files: [], + contents: [], + replaceContent: {}, + verbose: false, + debug: false, + debugWXS: false, + showNewTree: false, + isPlugin: false, + addTestAttre: false, + independent: false, + genfuncname: '$gwx', + isCut: false, + cwd: process.cwd, + debug: false, + lazyload, + lazyloadConfig: '', + }, + options, + ) + + return new Promise(async (resolve, reject) => { + let st = Date.now() + + // 获取文件内容 + if (!options.contents.length) { + const tasks = options.files.map((file) => { + if (typeof options.replaceContent[file] === 'string') { + return options.replaceContent[file] + } + return fs.readFile(path.resolve(options.cwd, file), 'utf8') + }) + options.contents = await Promise.all(tasks) || [] + } + // console.log('wcc get files', Date.now() - st, options.contents) + let result + try { + result = wcc(options) + } catch(errmsg) { + reject(new Error(errmsg)) + return + } + + console.log('wcc get compile', Date.now() - st) + if (options.output) { + const output = path.resolve(options.cwd, options.output) + const dir = path.dirname(output) + if (lazyload) { + // lazyload 为 true时,wcc 返回值是个对象, 需要序列化一下 + result = JSON.stringify(result) + } + try { + await fs.stat(dir) + } catch (e) { + await fs.mkdir(dir, { + recursive: true, + }) + } + await fs.writeFile(output, result, 'utf8') + } + console.log('wcc get output', Date.now() - st) + resolve(result) + }) +} + +Object.defineProperty(exports, 'version', { + get() { + loadWccAddon() + return wcc.version + }, +}) + +module.exports = exports diff --git a/test/runner/nwjs/wcc/lib/wcsc.js b/test/runner/nwjs/wcc/lib/wcsc.js new file mode 100644 index 0000000..424d2a5 --- /dev/null +++ b/test/runner/nwjs/wcc/lib/wcsc.js @@ -0,0 +1,92 @@ +const util = require('./util') +const path = require('path') +const fs = util.fs + +let wcsc + +function loadWcscAddon() { + if (wcsc) return + wcsc = require('../build/Release/wcsc.node') +} + +function tranWcscResultToObject(resultStr) { + const resultArr = resultStr.split('=') + const result = {} + for (let i = 0, len = resultArr.length; i < len && resultArr[i + 1]; i += 2) { + result[resultArr[i]] = resultArr[i + 1] + } + return result +} + +exports = async function (options) { + + loadWcscAddon() + + if (!options) throw Error('options is required') + + // avoid undefined or null + if (typeof options.subPackage !== 'string') { + delete options.subPackage + } + + if (typeof options.lazyload !== 'boolean') { + delete options.lazyload + } + + options = Object.assign( + { + files: [], + contents: [], + pageCount: 0, + cwd: process.cwd, + replaceContent: {}, + debug: false, + classPrefix: '', + lazyload: false, + }, + options, + ) + + if (!options.contents.length) { + const tasks = options.files.map((file) => { + if (typeof options.replaceContent[file] === 'string') { + return options.replaceContent[file] + } + return fs.readFile(path.resolve(options.cwd, file), 'utf8') + }) + options.contents = await Promise.all(tasks) || [] + } + + let wccResult + try { + wccResult = wcsc(options) + } catch (errmsg) { + throw new Error(errmsg) + } + + const result = options.lazyload ? wccResult : tranWcscResultToObject(wccResult) + + if (options.output) { + const output = path.resolve(options.cwd, options.output) + const dir = path.dirname(output) + try { + await fs.stat(dir) + } catch (e) { + await fs.mkdir(dir, { + recursive: true, + }) + } + await fs.writeFile(output, JSON.stringify(result, null, 2), 'utf8') + } + + return result +} + +Object.defineProperty(exports, 'version', { + get() { + loadWcscAddon() + return wcsc.version + }, +}) + +module.exports = exports diff --git a/test/runner/nwjs/wcc/package.json b/test/runner/nwjs/wcc/package.json new file mode 100644 index 0000000..ffa7511 --- /dev/null +++ b/test/runner/nwjs/wcc/package.json @@ -0,0 +1,18 @@ +{ + "name": "miniprogram-wcc", + "version": "0.0.1", + "description": "WCC node C++ addon", + "main": "lib/index.js", + "scripts": { + "rebuild": "node-gyp rebuild", + "build": "node-gyp build", + "test": "node ./test/wcc/index && node ./test/wcsc/index", + "format": "prettier *.js test/*.js scripts/*.js --write" + }, + "author": "coverguo", + "license": "MIT", + "devDependencies": { + "licia": "^1.21.2", + "node-gyp": "^7.0.0" + } +} diff --git a/test/runner/nwjs/windows.ts b/test/runner/nwjs/windows.ts deleted file mode 100644 index e69de29..0000000 diff --git a/test/runner/types.d.ts b/test/runner/types.d.ts new file mode 100644 index 0000000..e5b51da --- /dev/null +++ b/test/runner/types.d.ts @@ -0,0 +1,12 @@ +export interface CompilerOptions { + files: string[] + debugWXS: boolean + debug: boolean + genfuncname: string + isCut: boolean + wxmlCompileConfig: string + wxmlCompileConfigSplit: string + replaceContent: Record + cwd: string + lazyloadConfig: string +} \ No newline at end of file diff --git a/test/spec/wcc/empty/version.spec.ts b/test/spec/wcc/empty/version.spec.ts index d8523d3..6201598 100644 --- a/test/spec/wcc/empty/version.spec.ts +++ b/test/spec/wcc/empty/version.spec.ts @@ -1,8 +1,8 @@ import assert from 'assert'; import path from 'path'; -import linux from '../../../runner/linux' -import windows from '../../../runner/windows' +import linux from '../../../runner/binary-linux' +import windows from '../../../runner/binary-windows' import * as fs from 'fs' describe("wcc - empty", function () { diff --git a/test/spec/wcc/lla/lla.spec.ts b/test/spec/wcc/lla/lla.spec.ts index 0786cda..d22045c 100644 --- a/test/spec/wcc/lla/lla.spec.ts +++ b/test/spec/wcc/lla/lla.spec.ts @@ -1,7 +1,7 @@ import assert from "assert" import path from "path" -import linux from '../../../runner/linux' -import windows from '../../../runner/windows' +import linux from '../../../runner/binary-linux' +import windows from '../../../runner/binary-windows' import * as fs from 'fs' describe("wcc - lla", function () { diff --git a/test/spec/wcc/llw/llw.spec.ts b/test/spec/wcc/llw/llw.spec.ts index c39a7bb..7c38843 100644 --- a/test/spec/wcc/llw/llw.spec.ts +++ b/test/spec/wcc/llw/llw.spec.ts @@ -1,8 +1,8 @@ import assert from 'assert'; import path from 'path'; -import linux from '../../../runner/linux' -import windows from '../../../runner/windows' +import linux from '../../../runner/binary-linux' +import windows from '../../../runner/binary-windows' import * as fs from 'fs' describe("wcc - llw", function () { diff --git a/test/spec/wcc/module/data/options-1719836862880.json b/test/spec/wcc/module/data/options-1719836862880.json new file mode 100644 index 0000000..c698cb7 --- /dev/null +++ b/test/spec/wcc/module/data/options-1719836862880.json @@ -0,0 +1,551 @@ +{ + "files": [ + "./components/filter/index.wxml", + "./components/filter-popup/index.wxml", + "./components/goods-card/index.wxml", + "./components/goods-list/index.wxml", + "./components/load-more/index.wxml", + "./components/loading-content/index.wxml", + "./components/price/index.wxml", + "./components/swipeout/index.wxml", + "./components/webp-image/index.wxml", + "./custom-tab-bar/index.wxml", + "./miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.wxml", + "./miniprogram_npm/tdesign-miniprogram/action-sheet/template/grid.wxml", + "./miniprogram_npm/tdesign-miniprogram/action-sheet/template/list.wxml", + "./miniprogram_npm/tdesign-miniprogram/avatar/avatar.wxml", + "./miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.wxml", + "./miniprogram_npm/tdesign-miniprogram/back-top/back-top.wxml", + "./miniprogram_npm/tdesign-miniprogram/badge/badge.wxml", + "./miniprogram_npm/tdesign-miniprogram/button/button.wxml", + "./miniprogram_npm/tdesign-miniprogram/calendar/calendar.wxml", + "./miniprogram_npm/tdesign-miniprogram/calendar/template.wxml", + "./miniprogram_npm/tdesign-miniprogram/cascader/cascader.wxml", + "./miniprogram_npm/tdesign-miniprogram/cell/cell.wxml", + "./miniprogram_npm/tdesign-miniprogram/cell-group/cell-group.wxml", + "./miniprogram_npm/tdesign-miniprogram/check-tag/check-tag.wxml", + "./miniprogram_npm/tdesign-miniprogram/checkbox/checkbox.wxml", + "./miniprogram_npm/tdesign-miniprogram/checkbox-group/checkbox-group.wxml", + "./miniprogram_npm/tdesign-miniprogram/collapse/collapse.wxml", + "./miniprogram_npm/tdesign-miniprogram/collapse-panel/collapse-panel.wxml", + "./miniprogram_npm/tdesign-miniprogram/common/template/badge.wxml", + "./miniprogram_npm/tdesign-miniprogram/common/template/button.wxml", + "./miniprogram_npm/tdesign-miniprogram/common/template/icon.wxml", + "./miniprogram_npm/tdesign-miniprogram/common/template/image.wxml", + "./miniprogram_npm/tdesign-miniprogram/count-down/count-down.wxml", + "./miniprogram_npm/tdesign-miniprogram/date-time-picker/date-time-picker.wxml", + "./miniprogram_npm/tdesign-miniprogram/dialog/dialog.wxml", + "./miniprogram_npm/tdesign-miniprogram/divider/divider.wxml", + "./miniprogram_npm/tdesign-miniprogram/drawer/drawer.wxml", + "./miniprogram_npm/tdesign-miniprogram/dropdown-item/dropdown-item.wxml", + "./miniprogram_npm/tdesign-miniprogram/dropdown-menu/dropdown-menu.wxml", + "./miniprogram_npm/tdesign-miniprogram/empty/empty.wxml", + "./miniprogram_npm/tdesign-miniprogram/fab/fab.wxml", + "./miniprogram_npm/tdesign-miniprogram/footer/footer.wxml", + "./miniprogram_npm/tdesign-miniprogram/grid/grid.wxml", + "./miniprogram_npm/tdesign-miniprogram/grid-item/grid-item.wxml", + "./miniprogram_npm/tdesign-miniprogram/icon/icon.wxml", + "./miniprogram_npm/tdesign-miniprogram/image/image.wxml", + "./miniprogram_npm/tdesign-miniprogram/image-viewer/image-viewer.wxml", + "./miniprogram_npm/tdesign-miniprogram/indexes/indexes.wxml", + "./miniprogram_npm/tdesign-miniprogram/indexes-anchor/indexes-anchor.wxml", + "./miniprogram_npm/tdesign-miniprogram/input/input.wxml", + "./miniprogram_npm/tdesign-miniprogram/link/link.wxml", + "./miniprogram_npm/tdesign-miniprogram/loading/loading.wxml", + "./miniprogram_npm/tdesign-miniprogram/message/message.wxml", + "./miniprogram_npm/tdesign-miniprogram/navbar/navbar.wxml", + "./miniprogram_npm/tdesign-miniprogram/notice-bar/notice-bar.wxml", + "./miniprogram_npm/tdesign-miniprogram/overlay/overlay.wxml", + "./miniprogram_npm/tdesign-miniprogram/picker/picker.wxml", + "./miniprogram_npm/tdesign-miniprogram/picker-item/picker-item.wxml", + "./miniprogram_npm/tdesign-miniprogram/popup/popup.wxml", + "./miniprogram_npm/tdesign-miniprogram/progress/progress.wxml", + "./miniprogram_npm/tdesign-miniprogram/pull-down-refresh/pull-down-refresh.wxml", + "./miniprogram_npm/tdesign-miniprogram/radio/radio.wxml", + "./miniprogram_npm/tdesign-miniprogram/radio-group/radio-group.wxml", + "./miniprogram_npm/tdesign-miniprogram/rate/rate.wxml", + "./miniprogram_npm/tdesign-miniprogram/result/result.wxml", + "./miniprogram_npm/tdesign-miniprogram/search/search.wxml", + "./miniprogram_npm/tdesign-miniprogram/side-bar/side-bar.wxml", + "./miniprogram_npm/tdesign-miniprogram/side-bar-item/side-bar-item.wxml", + "./miniprogram_npm/tdesign-miniprogram/skeleton/skeleton.wxml", + "./miniprogram_npm/tdesign-miniprogram/slider/slider.wxml", + "./miniprogram_npm/tdesign-miniprogram/step-item/step-item.wxml", + "./miniprogram_npm/tdesign-miniprogram/stepper/stepper.wxml", + "./miniprogram_npm/tdesign-miniprogram/steps/steps.wxml", + "./miniprogram_npm/tdesign-miniprogram/sticky/sticky.wxml", + "./miniprogram_npm/tdesign-miniprogram/swipe-cell/swipe-cell.wxml", + "./miniprogram_npm/tdesign-miniprogram/swiper/swiper.wxml", + "./miniprogram_npm/tdesign-miniprogram/swiper-nav/swiper-nav.wxml", + "./miniprogram_npm/tdesign-miniprogram/switch/switch.wxml", + "./miniprogram_npm/tdesign-miniprogram/tab-bar/tab-bar.wxml", + "./miniprogram_npm/tdesign-miniprogram/tab-bar-item/tab-bar-item.wxml", + "./miniprogram_npm/tdesign-miniprogram/tab-panel/tab-panel.wxml", + "./miniprogram_npm/tdesign-miniprogram/tabs/tabs.wxml", + "./miniprogram_npm/tdesign-miniprogram/tag/tag.wxml", + "./miniprogram_npm/tdesign-miniprogram/textarea/textarea.wxml", + "./miniprogram_npm/tdesign-miniprogram/toast/toast.wxml", + "./miniprogram_npm/tdesign-miniprogram/transition/transition.wxml", + "./miniprogram_npm/tdesign-miniprogram/tree-select/tree-select.wxml", + "./miniprogram_npm/tdesign-miniprogram/upload/upload.wxml", + "./pages/cart/components/cart-bar/index.wxml", + "./pages/cart/components/cart-empty/index.wxml", + "./pages/cart/components/cart-group/index.wxml", + "./pages/cart/components/goods-card/index.wxml", + "./pages/cart/components/specs-popup/index.wxml", + "./pages/cart/index.wxml", + "./pages/coupon/components/coupon-card/index.wxml", + "./pages/coupon/components/floating-button/index.wxml", + "./pages/coupon/components/ui-coupon-card/index.wxml", + "./pages/coupon/coupon-activity-goods/index.wxml", + "./pages/coupon/coupon-detail/index.wxml", + "./pages/coupon/coupon-list/index.wxml", + "./pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.wxml", + "./pages/goods/category/components/goods-category/components/c-sidebar/index.wxml", + "./pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.wxml", + "./pages/goods/category/components/goods-category/components/c-tabbar/index.wxml", + "./pages/goods/category/components/goods-category/index.wxml", + "./pages/goods/category/index.wxml", + "./pages/goods/comments/components/comments-card/components/images-videos/index.wxml", + "./pages/goods/comments/components/comments-card/components/my-video/index.wxml", + "./pages/goods/comments/components/comments-card/index.wxml", + "./pages/goods/comments/create/index.wxml", + "./pages/goods/comments/index.wxml", + "./pages/goods/details/components/buy-bar/index.wxml", + "./pages/goods/details/components/goods-specs-popup/index.wxml", + "./pages/goods/details/components/promotion-popup/index.wxml", + "./pages/goods/details/index.wxml", + "./pages/goods/list/index.wxml", + "./pages/goods/result/index.wxml", + "./pages/goods/search/index.wxml", + "./pages/home/home.wxml", + "./pages/order/after-service-detail/index.wxml", + "./pages/order/after-service-list/index.wxml", + "./pages/order/apply-service/index.wxml", + "./pages/order/components/after-service-button-bar/index.wxml", + "./pages/order/components/customer-service/index.wxml", + "./pages/order/components/goods-card/index.wxml", + "./pages/order/components/noGoods/noGoods.wxml", + "./pages/order/components/order-button-bar/index.wxml", + "./pages/order/components/order-card/index.wxml", + "./pages/order/components/order-goods-card/index.wxml", + "./pages/order/components/reason-sheet/index.wxml", + "./pages/order/components/selectCoupons/selectCoupons.wxml", + "./pages/order/components/specs-goods-card/index.wxml", + "./pages/order/delivery-detail/index.wxml", + "./pages/order/fill-tracking-no/index.wxml", + "./pages/order/invoice/index.wxml", + "./pages/order/order-confirm/components/address-card/index.wxml", + "./pages/order/order-confirm/index.wxml", + "./pages/order/order-detail/index.wxml", + "./pages/order/order-list/index.wxml", + "./pages/order/pay-result/index.wxml", + "./pages/order/receipt/index.wxml", + "./pages/promotion-detail/index.wxml", + "./pages/usercenter/address/edit/index.wxml", + "./pages/usercenter/address/list/index.wxml", + "./pages/usercenter/components/order-group/index.wxml", + "./pages/usercenter/components/t-location/index.wxml", + "./pages/usercenter/components/ui-address-item/index.wxml", + "./pages/usercenter/components/ui-select-picker/index.wxml", + "./pages/usercenter/components/user-center-card/index.wxml", + "./pages/usercenter/index.wxml", + "./pages/usercenter/name-edit/index.wxml", + "./pages/usercenter/person-info/index.wxml", + "./components/webp-image/utils.wxs", + "./miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.wxs", + "./miniprogram_npm/tdesign-miniprogram/avatar/avatar.wxs", + "./miniprogram_npm/tdesign-miniprogram/badge/badge.wxs", + "./miniprogram_npm/tdesign-miniprogram/calendar/calendar.wxs", + "./miniprogram_npm/tdesign-miniprogram/common/utils.wxs", + "./miniprogram_npm/tdesign-miniprogram/dialog/dialog.wxs", + "./miniprogram_npm/tdesign-miniprogram/dropdown-item/index.wxs", + "./miniprogram_npm/tdesign-miniprogram/empty/empty.wxs", + "./miniprogram_npm/tdesign-miniprogram/input/input.wxs", + "./miniprogram_npm/tdesign-miniprogram/message/message.wxs", + "./miniprogram_npm/tdesign-miniprogram/popup/popup.wxs", + "./miniprogram_npm/tdesign-miniprogram/progress/progress.wxs", + "./miniprogram_npm/tdesign-miniprogram/rate/rate.wxs", + "./miniprogram_npm/tdesign-miniprogram/skeleton/skeleton.wxs", + "./miniprogram_npm/tdesign-miniprogram/slider/slider.wxs", + "./miniprogram_npm/tdesign-miniprogram/swipe-cell/swipe-cell.wxs", + "./miniprogram_npm/tdesign-miniprogram/swiper/index.wxs", + "./miniprogram_npm/tdesign-miniprogram/tabs/tabs.wxs", + "./miniprogram_npm/tdesign-miniprogram/tree-select/index.wxs", + "./pages/cart/components/cart-group/index.wxs", + "./pages/cart/components/cart-group/utils.wxs", + "./pages/order/components/noGoods/noGood.wxs", + "./pages/order/components/selectCoupons/selectCoupon.wxs", + "./pages/order/order-confirm/getNotes.wxs", + "./pages/order/order-confirm/handleInvoice.wxs", + "./pages/order/order-confirm/order.wxs" + ], + "debugWXS": true, + "debug": true, + "genfuncname": "$gwx", + "isCut": true, + "wxmlCompileConfig": "114>_<2793./pages/home/home.wxml>_<279311>_<2793t-search>_<2793t-loading>_<2793t-swiper>_<2793t-swiper-nav>_<2793t-image>_<2793t-icon>_<2793t-toast>_<2793t-tabs>_<2793t-tab-panel>_<2793goods-list>_<2793load-more>_<2793./pages/usercenter/index.wxml>_<27937>_<2793t-popup>_<2793t-icon>_<2793t-cell-group>_<2793t-cell>_<2793t-user-center-card>_<2793t-order-group>_<2793t-toast>_<2793./pages/usercenter/person-info/index.wxml>_<27937>_<2793t-cell-group>_<2793t-cell>_<2793t-button>_<2793t-image>_<2793t-dialog>_<2793t-toast>_<2793t-select-picker>_<2793./pages/usercenter/address/list/index.wxml>_<27936>_<2793t-icon>_<2793t-image>_<2793t-toast>_<2793t-address-item>_<2793t-location>_<2793t-empty>_<2793./pages/usercenter/address/edit/index.wxml>_<279311>_<2793t-textarea>_<2793t-icon>_<2793t-input>_<2793t-button>_<2793t-cell-group>_<2793t-cell>_<2793t-toast>_<2793t-dialog>_<2793t-switch>_<2793t-location>_<2793t-cascader>_<2793./pages/goods/list/index.wxml>_<27937>_<2793t-input>_<2793t-empty>_<2793t-toast>_<2793goods-list>_<2793filter>_<2793filter-popup>_<2793load-more>_<2793./pages/goods/details/index.wxml>_<279313>_<2793t-image>_<2793t-tag>_<2793t-toast>_<2793t-rate>_<2793t-swiper>_<2793t-swiper-nav>_<2793t-button>_<2793t-icon>_<2793t-popup>_<2793price>_<2793buy-bar>_<2793promotion-popup>_<2793goods-specs-popup>_<2793./pages/goods/category/index.wxml>_<27931>_<2793goods-category>_<2793./pages/goods/search/index.wxml>_<27933>_<2793t-search>_<2793t-icon>_<2793t-dialog>_<2793./pages/goods/result/index.wxml>_<27939>_<2793t-search>_<2793t-input>_<2793t-empty>_<2793t-toast>_<2793goods-list>_<2793filter>_<2793filter-popup>_<2793load-more>_<2793t-icon>_<2793./pages/cart/index.wxml>_<27935>_<2793cart-group>_<2793cart-empty>_<2793cart-bar>_<2793t-toast>_<2793t-dialog>_<2793./pages/order/order-confirm/index.wxml>_<279311>_<2793t-popup>_<2793t-toast>_<2793t-icon>_<2793t-cell>_<2793t-dialog>_<2793t-textarea>_<2793price>_<2793select-coupons>_<2793no-goods>_<2793t-image>_<2793address-card>_<2793./pages/order/receipt/index.wxml>_<27936>_<2793t-cell>_<2793t-dialog>_<2793t-toast>_<2793t-icon>_<2793t-input>_<2793t-button>_<2793./pages/order/pay-result/index.wxml>_<27933>_<2793t-navbar>_<2793t-icon>_<2793price>_<2793./pages/order/order-list/index.wxml>_<279311>_<2793t-tabs>_<2793t-tab-panel>_<2793t-empty>_<2793t-toast>_<2793t-dialog>_<2793t-pull-down-refresh>_<2793load-more>_<2793order-button-bar>_<2793price>_<2793order-card>_<2793specs-goods-card>_<2793./pages/order/order-detail/index.wxml>_<279312>_<2793t-pull-down-refresh>_<2793t-button>_<2793t-cell>_<2793t-icon>_<2793t-image>_<2793t-count-down>_<2793t-toast>_<2793t-dialog>_<2793price>_<2793order-card>_<2793order-goods-card>_<2793order-button-bar>_<2793./pages/goods/comments/index.wxml>_<27933>_<2793t-tag>_<2793comments-card>_<2793t-load-more>_<2793./pages/order/apply-service/index.wxml>_<279314>_<2793wr-price>_<2793wr-order-goods-card>_<2793wr-reason-sheet>_<2793t-cell>_<2793t-icon>_<2793t-toast>_<2793t-dialog>_<2793t-button>_<2793t-cell-group>_<2793t-stepper>_<2793t-popup>_<2793t-textarea>_<2793t-input>_<2793t-upload>_<2793./pages/order/after-service-list/index.wxml>_<279310>_<2793wr-load-more>_<2793wr-after-service-button-bar>_<2793wr-price>_<2793wr-order-card>_<2793wr-goods-card>_<2793t-icon>_<2793t-toast>_<2793t-dialog>_<2793t-empty>_<2793t-pull-down-refresh>_<2793./pages/order/after-service-detail/index.wxml>_<279316>_<2793wr-loading-content>_<2793wr-price>_<2793wr-service-goods-card>_<2793t-cell>_<2793t-icon>_<2793t-cell-group>_<2793t-pull-down-refresh>_<2793t-grid>_<2793t-grid-item>_<2793t-toast>_<2793t-dialog>_<2793t-input>_<2793t-swiper>_<2793t-swiper-nav>_<2793wr-after-service-button-bar>_<2793t-image>_<2793./pages/goods/comments/create/index.wxml>_<27938>_<2793t-image>_<2793t-rate>_<2793t-textarea>_<2793t-checkbox>_<2793t-button>_<2793t-upload>_<2793t-icon>_<2793t-toast>_<2793./pages/coupon/coupon-list/index.wxml>_<27935>_<2793t-pull-down-refresh>_<2793t-tabs>_<2793t-tab-panel>_<2793t-icon>_<2793coupon-card>_<2793./pages/coupon/coupon-detail/index.wxml>_<27935>_<2793coupon-card>_<2793t-cell>_<2793t-cell-group>_<2793t-button>_<2793t-icon>_<2793./pages/coupon/coupon-activity-goods/index.wxml>_<27935>_<2793t-icon>_<2793t-popup>_<2793t-toast>_<2793goods-list>_<2793floating-button>_<2793./pages/promotion-detail/index.wxml>_<27935>_<2793t-toast>_<2793t-image>_<2793t-icon>_<2793count-down>_<2793goods-list>_<2793./pages/order/fill-tracking-no/index.wxml>_<27939>_<2793t-icon>_<2793t-cell>_<2793t-cell-group>_<2793t-textarea>_<2793t-input>_<2793t-toast>_<2793t-dialog>_<2793t-button>_<2793ui-reason-sheet>_<2793./pages/order/delivery-detail/index.wxml>_<27936>_<2793t-cell>_<2793t-cell-group>_<2793t-image>_<2793t-icon>_<2793t-steps>_<2793t-step>_<2793./pages/order/invoice/index.wxml>_<27933>_<2793t-cell>_<2793t-button>_<2793t-cell-group>_<2793./pages/usercenter/name-edit/index.wxml>_<27933>_<2793t-input>_<2793t-icon>_<2793t-button>_<2793./miniprogram_npm/tdesign-miniprogram/search/search.wxml>_<27931>_<2793t-icon>_<2793./miniprogram_npm/tdesign-miniprogram/icon/icon.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/loading/loading.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/swiper/swiper.wxml>_<27932>_<2793t-swiper-nav>_<2793t-image>_<2793./miniprogram_npm/tdesign-miniprogram/swiper-nav/swiper-nav.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/image/image.wxml>_<27932>_<2793t-loading>_<2793t-icon>_<2793./components/webp-image/index.wxml>_<27931>_<2793t-image>_<2793./miniprogram_npm/tdesign-miniprogram/toast/toast.wxml>_<27933>_<2793t-icon>_<2793t-loading>_<2793t-overlay>_<2793./miniprogram_npm/tdesign-miniprogram/overlay/overlay.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/tabs/tabs.wxml>_<27933>_<2793t-sticky>_<2793t-badge>_<2793t-icon>_<2793./miniprogram_npm/tdesign-miniprogram/sticky/sticky.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/badge/badge.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/tab-panel/tab-panel.wxml>_<27930>_<2793./components/goods-list/index.wxml>_<27931>_<2793goods-card>_<2793./components/goods-card/index.wxml>_<27933>_<2793price>_<2793t-icon>_<2793t-image>_<2793./components/price/index.wxml>_<27930>_<2793./components/load-more/index.wxml>_<27932>_<2793t-loading>_<2793t-divider>_<2793./miniprogram_npm/tdesign-miniprogram/divider/divider.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/popup/popup.wxml>_<27932>_<2793t-overlay>_<2793t-icon>_<2793./miniprogram_npm/tdesign-miniprogram/cell-group/cell-group.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/cell/cell.wxml>_<27932>_<2793t-icon>_<2793t-image>_<2793./pages/usercenter/components/user-center-card/index.wxml>_<27932>_<2793t-icon>_<2793t-avatar>_<2793./miniprogram_npm/tdesign-miniprogram/avatar/avatar.wxml>_<27933>_<2793t-icon>_<2793t-badge>_<2793t-image>_<2793./pages/usercenter/components/order-group/index.wxml>_<27934>_<2793t-cell>_<2793t-cell-group>_<2793t-badge>_<2793t-icon>_<2793./miniprogram_npm/tdesign-miniprogram/button/button.wxml>_<27932>_<2793t-icon>_<2793t-loading>_<2793./miniprogram_npm/tdesign-miniprogram/dialog/dialog.wxml>_<27933>_<2793t-popup>_<2793t-icon>_<2793t-button>_<2793./pages/usercenter/components/ui-select-picker/index.wxml>_<27931>_<2793t-popup>_<2793./pages/usercenter/components/ui-address-item/index.wxml>_<27933>_<2793t-icon>_<2793t-tag>_<2793t-swipe-cell>_<2793./miniprogram_npm/tdesign-miniprogram/tag/tag.wxml>_<27931>_<2793t-icon>_<2793./miniprogram_npm/tdesign-miniprogram/swipe-cell/swipe-cell.wxml>_<27931>_<2793t-icon>_<2793./pages/usercenter/components/t-location/index.wxml>_<27933>_<2793t-cell>_<2793t-icon>_<2793t-toast>_<2793./miniprogram_npm/tdesign-miniprogram/empty/empty.wxml>_<27932>_<2793t-icon>_<2793t-image>_<2793./miniprogram_npm/tdesign-miniprogram/textarea/textarea.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/input/input.wxml>_<27931>_<2793t-icon>_<2793./miniprogram_npm/tdesign-miniprogram/switch/switch.wxml>_<27932>_<2793t-icon>_<2793t-loading>_<2793./miniprogram_npm/tdesign-miniprogram/cascader/cascader.wxml>_<27935>_<2793t-icon>_<2793t-popup>_<2793t-tabs>_<2793t-tab-panel>_<2793t-radio-group>_<2793./miniprogram_npm/tdesign-miniprogram/radio-group/radio-group.wxml>_<27931>_<2793t-radio>_<2793./miniprogram_npm/tdesign-miniprogram/radio/radio.wxml>_<27932>_<2793t-cell>_<2793t-icon>_<2793./components/filter/index.wxml>_<27931>_<2793t-icon>_<2793./components/filter-popup/index.wxml>_<27931>_<2793t-popup>_<2793./miniprogram_npm/tdesign-miniprogram/rate/rate.wxml>_<27931>_<2793t-icon>_<2793./pages/goods/details/components/buy-bar/index.wxml>_<27931>_<2793t-icon>_<2793./pages/goods/details/components/promotion-popup/index.wxml>_<27932>_<2793t-popup>_<2793t-icon>_<2793./pages/goods/details/components/goods-specs-popup/index.wxml>_<27935>_<2793t-popup>_<2793t-icon>_<2793t-image>_<2793t-stepper>_<2793t-toast>_<2793./miniprogram_npm/tdesign-miniprogram/stepper/stepper.wxml>_<27932>_<2793t-cell>_<2793t-icon>_<2793./pages/goods/category/components/goods-category/index.wxml>_<27934>_<2793c-tabbar>_<2793c-sidebar>_<2793c-sidebar-item>_<2793t-image>_<2793./pages/goods/category/components/goods-category/components/c-tabbar/index.wxml>_<27931>_<2793c-tabbar-more>_<2793./pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.wxml>_<27930>_<2793./pages/goods/category/components/goods-category/components/c-sidebar/index.wxml>_<27930>_<2793./pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.wxml>_<27930>_<2793./pages/cart/components/cart-group/index.wxml>_<27936>_<2793t-toast>_<2793t-icon>_<2793t-stepper>_<2793swipeout>_<2793goods-card>_<2793specs-popup>_<2793./components/swipeout/index.wxml>_<27930>_<2793./pages/cart/components/goods-card/index.wxml>_<27934>_<2793price>_<2793t-tag>_<2793t-image>_<2793t-icon>_<2793./pages/cart/components/specs-popup/index.wxml>_<27932>_<2793t-popup>_<2793goods-card>_<2793./pages/cart/components/cart-empty/index.wxml>_<27931>_<2793t-image>_<2793./pages/cart/components/cart-bar/index.wxml>_<27932>_<2793price>_<2793t-icon>_<2793./pages/order/components/selectCoupons/selectCoupons.wxml>_<27935>_<2793t-popup>_<2793t-icon>_<2793t-image>_<2793wr-price>_<2793coupon-card>_<2793./pages/coupon/components/ui-coupon-card/index.wxml>_<27932>_<2793t-icon>_<2793t-image>_<2793./pages/order/components/noGoods/noGoods.wxml>_<27933>_<2793wr-order-card>_<2793wr-goods-card>_<2793wr-order-goods-card>_<2793./pages/order/components/order-card/index.wxml>_<27932>_<2793t-image>_<2793t-icon>_<2793./pages/order/components/order-goods-card/index.wxml>_<27932>_<2793t-stepper>_<2793goods-card>_<2793./pages/order/components/specs-goods-card/index.wxml>_<27931>_<2793goods-card>_<2793./pages/order/components/goods-card/index.wxml>_<27933>_<2793price>_<2793t-image>_<2793t-icon>_<2793./pages/order/order-confirm/components/address-card/index.wxml>_<27932>_<2793t-cell>_<2793t-icon>_<2793./miniprogram_npm/tdesign-miniprogram/navbar/navbar.wxml>_<27931>_<2793t-icon>_<2793./miniprogram_npm/tdesign-miniprogram/pull-down-refresh/pull-down-refresh.wxml>_<27931>_<2793t-loading>_<2793./pages/order/components/order-button-bar/index.wxml>_<27933>_<2793t-button>_<2793t-toast>_<2793t-dialog>_<2793./miniprogram_npm/tdesign-miniprogram/count-down/count-down.wxml>_<27931>_<2793t-icon>_<2793./pages/goods/comments/components/comments-card/index.wxml>_<27933>_<2793t-rate>_<2793images-videos>_<2793t-image>_<2793./pages/goods/comments/components/comments-card/components/images-videos/index.wxml>_<27932>_<2793my-video>_<2793t-image>_<2793./pages/goods/comments/components/comments-card/components/my-video/index.wxml>_<27930>_<2793./pages/order/components/reason-sheet/index.wxml>_<27935>_<2793t-icon>_<2793t-popup>_<2793t-cell>_<2793t-toast>_<2793t-button>_<2793./miniprogram_npm/tdesign-miniprogram/upload/upload.wxml>_<27935>_<2793t-grid>_<2793t-grid-item>_<2793t-popup>_<2793t-icon>_<2793t-image>_<2793./miniprogram_npm/tdesign-miniprogram/grid/grid.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/grid-item/grid-item.wxml>_<27933>_<2793t-image>_<2793t-icon>_<2793t-badge>_<2793./pages/order/components/after-service-button-bar/index.wxml>_<27931>_<2793t-button>_<2793./components/loading-content/index.wxml>_<27931>_<2793t-loading>_<2793./miniprogram_npm/tdesign-miniprogram/checkbox/checkbox.wxml>_<27932>_<2793t-cell>_<2793t-icon>_<2793./pages/coupon/components/coupon-card/index.wxml>_<27932>_<2793ui-coupon-card>_<2793t-button>_<2793./pages/coupon/components/floating-button/index.wxml>_<27931>_<2793t-icon>_<2793./miniprogram_npm/tdesign-miniprogram/steps/steps.wxml>_<27931>_<2793t-step>_<2793./miniprogram_npm/tdesign-miniprogram/step-item/step-item.wxml>_<27931>_<2793t-icon>_<2793./custom-tab-bar/index.wxml>_<27933>_<2793t-tab-bar>_<2793t-tab-bar-item>_<2793t-icon>_<2793./miniprogram_npm/tdesign-miniprogram/tab-bar/tab-bar.wxml>_<27930>_<2793./miniprogram_npm/tdesign-miniprogram/tab-bar-item/tab-bar-item.wxml>_<27932>_<2793t-icon>_<2793t-badge", + "wxmlCompileConfigSplit": ">_<2793", + "replaceContent": { + "components/filter/index.wxml": "\n\n\t\n\t\t\n\t\t\t综合\n\t\t\n\t\t\n\t\t\t价格\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t筛选\n\t\t\t\n\t\t\n\t\n\n\n\n\n", + "./components/filter/index.wxml": "\n\n\t\n\t\t\n\t\t\t综合\n\t\t\n\t\t\n\t\t\t价格\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t筛选\n\t\t\t\n\t\t\n\t\n\n\n\n\n", + "components/filter-popup/index.wxml": "\n\t\n\t\t\n\t\t\n\t\t\t重置\n\t\t\t\n\t\t\t\t确定\n\t\t\t\n\t\t\n\t\n\n\n", + "./components/filter-popup/index.wxml": "\n\t\n\t\t\n\t\t\n\t\t\t重置\n\t\t\t\n\t\t\t\t确定\n\t\t\t\n\t\t\n\t\n\n\n", + "components/goods-card/index.wxml": "\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{{ goods.title }}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{{tag}}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "./components/goods-card/index.wxml": "\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{{ goods.title }}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{{tag}}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "components/goods-list/index.wxml": "\n\t\n\t\t\n\t\n\n\n", + "./components/goods-list/index.wxml": "\n\t\n\t\t\n\t\n\n\n", + "components/load-more/index.wxml": "\n \n\n \n\n \n \n {{noMoreText}}\n \n\n \n \n 加载失败\n 刷新\n \n\n\n\n\n", + "./components/load-more/index.wxml": "\n \n\n \n\n \n \n {{noMoreText}}\n \n\n \n \n 加载失败\n 刷新\n \n\n\n\n\n", + "components/loading-content/index.wxml": "\n\t\n\t\t\n\t\n\n\n", + "./components/loading-content/index.wxml": "\n\t\n\t\t\n\t\n\n\n", + "components/price/index.wxml": "\n\tvar REGEXP = getRegExp('^\\d+(\\.\\d+)?$');\n\tfunction addUnit(value) {\n\tif (value == null) {\n\treturn '';\n\t}\n\treturn REGEXP.test('' + value) ? value + 'rpx' : value;\n\t}\n\tmodule.exports = {\n\taddUnit: addUnit\n\t};\n\n\n\t\n\t{{symbol}}\n\t\n\t\t{{pArr[0]}}\n\t\t.{{pArr[1]}}\n\t\n\n\n", + "./components/price/index.wxml": "\n\tvar REGEXP = getRegExp('^\\d+(\\.\\d+)?$');\n\tfunction addUnit(value) {\n\tif (value == null) {\n\treturn '';\n\t}\n\treturn REGEXP.test('' + value) ? value + 'rpx' : value;\n\t}\n\tmodule.exports = {\n\taddUnit: addUnit\n\t};\n\n\n\t\n\t{{symbol}}\n\t\n\t\t{{pArr[0]}}\n\t\t.{{pArr[1]}}\n\t\n\n\n", + "components/swipeout/index.wxml": "\n var THRESHOLD = 0.3;\n var MIN_DISTANCE = 10;\n var owner;\n var state;\n\n var getState = function(ownerInstance) {\n owner = ownerInstance;\n state = owner.getState();\n state.leftWidth = state.leftWidth || 0;\n state.rightWidth = state.rightWidth || 0;\n state.offset = state.offset || 0;\n state.startOffset = state.startOffset || 0;\n };\n\n var initRightWidth = function(newVal, oldVal, ownerInstance) {\n getState(ownerInstance);\n state.rightWidth = newVal;\n if (state.offset < 0) {\n swipeMove(-state.rightWidth);\n }\n };\n\n var initLeftWidth = function(newVal, oldVal, ownerInstance) {\n getState(ownerInstance);\n state.leftWidth = newVal;\n if (state.offset > 0) {\n swipeMove(state.leftWidth);\n }\n }\n\n var resetTouchStatus = function() {\n state.direction = '';\n state.deltaX = 0;\n state.deltaY = 0;\n state.offsetX = 0;\n state.offsetY = 0;\n };\n\n var touchMove = function(event) {\n var touchPoint = event.touches[0];\n state.deltaX = touchPoint.clientX - state.startX;\n state.deltaY = touchPoint.clientY - state.startY;\n state.offsetX = Math.abs(state.deltaX);\n state.offsetY = Math.abs(state.deltaY);\n state.direction = state.direction || getDirection(state.offsetX, state.offsetY);\n };\n\n var getDirection = function(x, y) {\n if (x > y && x > MIN_DISTANCE) {\n return 'horizontal';\n }\n if (y > x && y > MIN_DISTANCE) {\n return 'vertical';\n }\n return '';\n };\n\n var range = function(num, min, max) {\n return Math.min(Math.max(num, min), max);\n };\n\n var swipeMove = function(_offset = 0) {\n state.offset = range(\n _offset,\n -state.rightWidth,\n +state.leftWidth,\n );\n\n var transform = 'translate3d(' + state.offset + 'px, 0, 0)';\n var transition = state.dragging\n ? 'none'\n : 'transform .6s cubic-bezier(0.18, 0.89, 0.32, 1)';\n owner.selectComponent('#wrapper').setStyle({\n '-webkit-transform': transform,\n '-webkit-transition': transition,\n 'transform': transform,\n 'transition': transition\n });\n };\n\n var close = function() {\n swipeMove(0);\n };\n\n var onCloseChange = function(newVal, oldVal, ownerInstance) {\n getState(ownerInstance);\n if (newVal === oldVal) return;\n if (newVal) {\n close();\n }\n };\n\n var touchStart = function(event) {\n resetTouchStatus();\n state.startOffset = state.offset;\n var touchPoint = event.touches[0];\n state.startX = touchPoint.clientX;\n state.startY = touchPoint.clientY;\n owner.callMethod('closeOther');\n };\n\n var startDrag = function(event, ownerInstance) {\n getState(ownerInstance);\n touchStart(event);\n };\n\n var onDrag = function(event, ownerInstance) {\n getState(ownerInstance);\n touchMove(event);\n if (state.direction !== 'horizontal') {\n return;\n }\n state.dragging = true;\n swipeMove(state.startOffset + state.deltaX);\n };\n\n var open = function(position) {\n var _offset = position === 'left' ? +state.leftWidth : -state.rightWidth;\n owner.callMethod('open', { position: position });\n swipeMove(_offset);\n };\n\n var endDrag = function(event, ownerInstance) {\n getState(ownerInstance);\n state.dragging = false;\n // 左/右侧有可滑动区域,且当前不是已open状态,且滑动幅度超过阈值时open左/右侧(滚动到该侧的最边上)\n if (+state.rightWidth > 0 && -state.startOffset < +state.rightWidth && -state.offset > +state.rightWidth * THRESHOLD) {\n open('right');\n } else if (+state.leftWidth > 0 && state.startOffset < +state.leftWidth && state.offset > +state.leftWidth * THRESHOLD) {\n open('left');\n } else {\n // 仅在有发生侧滑的情况下自动关闭(由js控制是否异步关闭)\n if (state.startOffset !== state.offset) {\n close();\n }\n }\n };\n\n module.exports = {\n initLeftWidth: initLeftWidth,\n initRightWidth: initRightWidth,\n startDrag: startDrag,\n onDrag: onDrag,\n endDrag: endDrag,\n onCloseChange: onCloseChange\n };\n\n\n\n \n \n \n \n \n \n \n \n \n\n", + "./components/swipeout/index.wxml": "\n var THRESHOLD = 0.3;\n var MIN_DISTANCE = 10;\n var owner;\n var state;\n\n var getState = function(ownerInstance) {\n owner = ownerInstance;\n state = owner.getState();\n state.leftWidth = state.leftWidth || 0;\n state.rightWidth = state.rightWidth || 0;\n state.offset = state.offset || 0;\n state.startOffset = state.startOffset || 0;\n };\n\n var initRightWidth = function(newVal, oldVal, ownerInstance) {\n getState(ownerInstance);\n state.rightWidth = newVal;\n if (state.offset < 0) {\n swipeMove(-state.rightWidth);\n }\n };\n\n var initLeftWidth = function(newVal, oldVal, ownerInstance) {\n getState(ownerInstance);\n state.leftWidth = newVal;\n if (state.offset > 0) {\n swipeMove(state.leftWidth);\n }\n }\n\n var resetTouchStatus = function() {\n state.direction = '';\n state.deltaX = 0;\n state.deltaY = 0;\n state.offsetX = 0;\n state.offsetY = 0;\n };\n\n var touchMove = function(event) {\n var touchPoint = event.touches[0];\n state.deltaX = touchPoint.clientX - state.startX;\n state.deltaY = touchPoint.clientY - state.startY;\n state.offsetX = Math.abs(state.deltaX);\n state.offsetY = Math.abs(state.deltaY);\n state.direction = state.direction || getDirection(state.offsetX, state.offsetY);\n };\n\n var getDirection = function(x, y) {\n if (x > y && x > MIN_DISTANCE) {\n return 'horizontal';\n }\n if (y > x && y > MIN_DISTANCE) {\n return 'vertical';\n }\n return '';\n };\n\n var range = function(num, min, max) {\n return Math.min(Math.max(num, min), max);\n };\n\n var swipeMove = function(_offset = 0) {\n state.offset = range(\n _offset,\n -state.rightWidth,\n +state.leftWidth,\n );\n\n var transform = 'translate3d(' + state.offset + 'px, 0, 0)';\n var transition = state.dragging\n ? 'none'\n : 'transform .6s cubic-bezier(0.18, 0.89, 0.32, 1)';\n owner.selectComponent('#wrapper').setStyle({\n '-webkit-transform': transform,\n '-webkit-transition': transition,\n 'transform': transform,\n 'transition': transition\n });\n };\n\n var close = function() {\n swipeMove(0);\n };\n\n var onCloseChange = function(newVal, oldVal, ownerInstance) {\n getState(ownerInstance);\n if (newVal === oldVal) return;\n if (newVal) {\n close();\n }\n };\n\n var touchStart = function(event) {\n resetTouchStatus();\n state.startOffset = state.offset;\n var touchPoint = event.touches[0];\n state.startX = touchPoint.clientX;\n state.startY = touchPoint.clientY;\n owner.callMethod('closeOther');\n };\n\n var startDrag = function(event, ownerInstance) {\n getState(ownerInstance);\n touchStart(event);\n };\n\n var onDrag = function(event, ownerInstance) {\n getState(ownerInstance);\n touchMove(event);\n if (state.direction !== 'horizontal') {\n return;\n }\n state.dragging = true;\n swipeMove(state.startOffset + state.deltaX);\n };\n\n var open = function(position) {\n var _offset = position === 'left' ? +state.leftWidth : -state.rightWidth;\n owner.callMethod('open', { position: position });\n swipeMove(_offset);\n };\n\n var endDrag = function(event, ownerInstance) {\n getState(ownerInstance);\n state.dragging = false;\n // 左/右侧有可滑动区域,且当前不是已open状态,且滑动幅度超过阈值时open左/右侧(滚动到该侧的最边上)\n if (+state.rightWidth > 0 && -state.startOffset < +state.rightWidth && -state.offset > +state.rightWidth * THRESHOLD) {\n open('right');\n } else if (+state.leftWidth > 0 && state.startOffset < +state.leftWidth && state.offset > +state.leftWidth * THRESHOLD) {\n open('left');\n } else {\n // 仅在有发生侧滑的情况下自动关闭(由js控制是否异步关闭)\n if (state.startOffset !== state.offset) {\n close();\n }\n }\n };\n\n module.exports = {\n initLeftWidth: initLeftWidth,\n initRightWidth: initRightWidth,\n startDrag: startDrag,\n onDrag: onDrag,\n endDrag: endDrag,\n onCloseChange: onCloseChange\n };\n\n\n\n \n \n \n \n \n \n \n \n \n\n", + "components/webp-image/index.wxml": "\n\n", + "./components/webp-image/index.wxml": "\n\n", + "custom-tab-bar/index.wxml": "\n\t\n\t\t\n\t\t\t\n\t\t\t{{ item.text }}\n\t\t\n\t\n\n\n", + "./custom-tab-bar/index.wxml": "\n\t\n\t\t\n\t\t\t\n\t\t\t{{ item.text }}\n\t\t\n\t\n\n\n", + "miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.wxml": "\n\n\n\n\n\n \n \n {{description}}\n \n