How to use removeMe1 method in Cypress

Best JavaScript code snippet using cypress

js-api-tests.js

Source:js-api-tests.js Github

copy

Full Screen

1const { installForTests, removeRecursiveSync, writeFileAtomic } = require('./esbuild')2const { SourceMapConsumer } = require('source-map')3const assert = require('assert')4const path = require('path')5const http = require('http')6const fs = require('fs')7const vm = require('vm')8const readFileAsync = fs.promises.readFile9const writeFileAsync = fs.promises.writeFile10const mkdirAsync = fs.promises.mkdir11const repoDir = path.dirname(__dirname)12const rootTestDir = path.join(repoDir, 'scripts', '.js-api-tests')13let buildTests = {14 async errorIfEntryPointsNotArray({ esbuild }) {15 try {16 await esbuild.build({17 entryPoints: 'this is not an array',18 logLevel: 'silent',19 })20 throw new Error('Expected build failure');21 } catch (e) {22 if (!e.errors || !e.errors[0] || e.errors[0].text !== '"entryPoints" must be an array or an object') {23 throw e;24 }25 }26 },27 async errorIfBadWorkingDirectory({ esbuild }) {28 try {29 await esbuild.build({30 absWorkingDir: 'what is this? certainly not an absolute path',31 logLevel: 'silent',32 write: false,33 })34 throw new Error('Expected build failure');35 } catch (e) {36 if (e.message !== 'Build failed with 1 error:\nerror: The working directory ' +37 '"what is this? certainly not an absolute path" is not an absolute path') {38 throw e;39 }40 }41 },42 async errorIfGlob({ esbuild }) {43 try {44 await esbuild.build({45 entryPoints: ['./src/*.js'],46 logLevel: 'silent',47 write: false,48 })49 throw new Error('Expected build failure');50 } catch (e) {51 if (!e.errors || !e.errors[0] || e.errors[0].text !== 'Could not resolve "./src/*.js" ' +52 '(glob syntax must be expanded first before passing the paths to esbuild)') {53 throw e;54 }55 }56 },57 async windowsBackslashPathTest({ esbuild, testDir }) {58 let entry = path.join(testDir, 'entry.js');59 let nested = path.join(testDir, 'nested.js');60 let outfile = path.join(testDir, 'out.js');61 // On Windows, backslash and forward slash should be treated the same62 fs.writeFileSync(entry, `63 import ${JSON.stringify(nested)}64 import ${JSON.stringify(nested.split(path.sep).join('/'))}65 `);66 fs.writeFileSync(nested, `console.log('once')`);67 const result = await esbuild.build({68 entryPoints: [entry],69 outfile,70 bundle: true,71 write: false,72 minify: true,73 format: 'esm',74 })75 assert.strictEqual(result.outputFiles[0].text, 'console.log("once");\n')76 },77 async workingDirTest({ esbuild, testDir }) {78 let aDir = path.join(testDir, 'a');79 let bDir = path.join(testDir, 'b');80 let aFile = path.join(aDir, 'a-in.js');81 let bFile = path.join(bDir, 'b-in.js');82 let aOut = path.join(aDir, 'a-out.js');83 let bOut = path.join(bDir, 'b-out.js');84 fs.mkdirSync(aDir, { recursive: true });85 fs.mkdirSync(bDir, { recursive: true });86 fs.writeFileSync(aFile, 'exports.x = true');87 fs.writeFileSync(bFile, 'exports.y = true');88 await Promise.all([89 esbuild.build({90 entryPoints: [path.basename(aFile)],91 outfile: path.basename(aOut),92 absWorkingDir: aDir,93 }),94 esbuild.build({95 entryPoints: [path.basename(bFile)],96 outfile: path.basename(bOut),97 absWorkingDir: bDir,98 }),99 ]);100 assert.strictEqual(require(aOut).x, true)101 assert.strictEqual(require(bOut).y, true)102 },103 async pathResolverEACCS({ esbuild, testDir }) {104 let outerDir = path.join(testDir, 'outer');105 let innerDir = path.join(outerDir, 'inner');106 let pkgDir = path.join(testDir, 'node_modules', 'pkg');107 let entry = path.join(innerDir, 'entry.js');108 let sibling = path.join(innerDir, 'sibling.js');109 let index = path.join(pkgDir, 'index.js');110 let outfile = path.join(innerDir, 'out.js');111 fs.mkdirSync(pkgDir, { recursive: true });112 fs.mkdirSync(innerDir, { recursive: true });113 fs.writeFileSync(entry, `114 import a from "./sibling.js"115 import b from "pkg"116 export default {a, b}117 `);118 fs.writeFileSync(sibling, `export default 'sibling'`);119 fs.writeFileSync(index, `export default 'pkg'`);120 fs.chmodSync(outerDir, 0o111);121 try {122 await esbuild.build({123 entryPoints: [entry],124 bundle: true,125 outfile,126 format: 'cjs',127 });128 const result = require(outfile);129 assert.deepStrictEqual(result.default, { a: 'sibling', b: 'pkg' });130 }131 finally {132 // Restore permission when the test ends so test cleanup works133 fs.chmodSync(outerDir, 0o755);134 }135 },136 async nodePathsTest({ esbuild, testDir }) {137 let srcDir = path.join(testDir, 'src');138 let pkgDir = path.join(testDir, 'pkg');139 let outfile = path.join(testDir, 'out.js');140 let entry = path.join(srcDir, 'entry.js');141 let other = path.join(pkgDir, 'other.js');142 fs.mkdirSync(srcDir, { recursive: true });143 fs.mkdirSync(pkgDir, { recursive: true });144 fs.writeFileSync(entry, `export {x} from 'other'`);145 fs.writeFileSync(other, `export let x = 123`);146 await esbuild.build({147 entryPoints: [entry],148 outfile,149 bundle: true,150 nodePaths: [pkgDir],151 format: 'cjs',152 })153 assert.strictEqual(require(outfile).x, 123)154 },155 // A local "node_modules" path should be preferred over "NODE_PATH".156 // See: https://github.com/evanw/esbuild/issues/1117157 async nodePathsLocalPreferredTestIssue1117({ esbuild, testDir }) {158 let srcDir = path.join(testDir, 'src');159 let srcOtherDir = path.join(testDir, 'src', 'node_modules', 'other');160 let pkgDir = path.join(testDir, 'pkg');161 let outfile = path.join(testDir, 'out.js');162 let entry = path.join(srcDir, 'entry.js');163 let srcOther = path.join(srcOtherDir, 'index.js');164 let pkgOther = path.join(pkgDir, 'other.js');165 fs.mkdirSync(srcDir, { recursive: true });166 fs.mkdirSync(srcOtherDir, { recursive: true });167 fs.mkdirSync(pkgDir, { recursive: true });168 fs.writeFileSync(entry, `export {x} from 'other'`);169 fs.writeFileSync(srcOther, `export let x = 234`);170 fs.writeFileSync(pkgOther, `export let x = 123`);171 await esbuild.build({172 entryPoints: [entry],173 outfile,174 bundle: true,175 nodePaths: [pkgDir],176 format: 'cjs',177 })178 assert.strictEqual(require(outfile).x, 234)179 },180 async es6_to_cjs({ esbuild, testDir }) {181 const input = path.join(testDir, 'in.js')182 const output = path.join(testDir, 'out.js')183 await writeFileAsync(input, 'export default 123')184 const value = await esbuild.build({185 entryPoints: [input],186 bundle: true,187 outfile: output,188 format: 'cjs',189 })190 assert.strictEqual(value.outputFiles, void 0)191 const result = require(output)192 assert.strictEqual(result.default, 123)193 assert.strictEqual(result.__esModule, true)194 },195 // Test recursive directory creation196 async recursiveMkdir({ esbuild, testDir }) {197 const input = path.join(testDir, 'in.js')198 const output = path.join(testDir, 'a/b/c/d/out.js')199 await writeFileAsync(input, 'export default 123')200 await esbuild.build({201 entryPoints: [input],202 bundle: true,203 outfile: output,204 format: 'cjs',205 })206 const result = require(output)207 assert.strictEqual(result.default, 123)208 assert.strictEqual(result.__esModule, true)209 },210 async outExtensionJS({ esbuild, testDir }) {211 const input = path.join(testDir, 'in.js')212 const output = path.join(testDir, 'in.mjs')213 await writeFileAsync(input, 'console.log("test")')214 await esbuild.build({215 entryPoints: [input],216 outdir: testDir,217 outExtension: { '.js': '.mjs' },218 })219 const mjs = await readFileAsync(output, 'utf8')220 assert.strictEqual(mjs, 'console.log("test");\n')221 },222 async outExtensionCSS({ esbuild, testDir }) {223 const input = path.join(testDir, 'in.css')224 const output = path.join(testDir, 'in.notcss')225 await writeFileAsync(input, 'body {}')226 await esbuild.build({227 entryPoints: [input],228 outdir: testDir,229 outExtension: { '.css': '.notcss' },230 })231 const notcss = await readFileAsync(output, 'utf8')232 assert.strictEqual(notcss, 'body {\n}\n')233 },234 async sourceMap({ esbuild, testDir }) {235 const input = path.join(testDir, 'in.js')236 const output = path.join(testDir, 'out.js')237 const content = 'exports.foo = 123'238 await writeFileAsync(input, content)239 await esbuild.build({240 entryPoints: [input],241 outfile: output,242 sourcemap: true,243 })244 const result = require(output)245 assert.strictEqual(result.foo, 123)246 const outputFile = await readFileAsync(output, 'utf8')247 const match = /\/\/# sourceMappingURL=(.*)/.exec(outputFile)248 assert.strictEqual(match[1], 'out.js.map')249 const resultMap = await readFileAsync(output + '.map', 'utf8')250 const json = JSON.parse(resultMap)251 assert.strictEqual(json.version, 3)252 assert.strictEqual(json.sources[0], path.basename(input))253 assert.strictEqual(json.sourcesContent[0], content)254 },255 async sourceMapExternal({ esbuild, testDir }) {256 const input = path.join(testDir, 'in.js')257 const output = path.join(testDir, 'out.js')258 const content = 'exports.foo = 123'259 await writeFileAsync(input, content)260 await esbuild.build({261 entryPoints: [input],262 outfile: output,263 sourcemap: 'external',264 })265 const result = require(output)266 assert.strictEqual(result.foo, 123)267 const outputFile = await readFileAsync(output, 'utf8')268 const match = /\/\/# sourceMappingURL=(.*)/.exec(outputFile)269 assert.strictEqual(match, null)270 const resultMap = await readFileAsync(output + '.map', 'utf8')271 const json = JSON.parse(resultMap)272 assert.strictEqual(json.version, 3)273 assert.strictEqual(json.sources[0], path.basename(input))274 assert.strictEqual(json.sourcesContent[0], content)275 },276 async sourceMapInline({ esbuild, testDir }) {277 const input = path.join(testDir, 'in.js')278 const output = path.join(testDir, 'out.js')279 const content = 'exports.foo = 123'280 await writeFileAsync(input, content)281 await esbuild.build({282 entryPoints: [input],283 outfile: output,284 sourcemap: 'inline',285 })286 const result = require(output)287 assert.strictEqual(result.foo, 123)288 const outputFile = await readFileAsync(output, 'utf8')289 const match = /\/\/# sourceMappingURL=data:application\/json;base64,(.*)/.exec(outputFile)290 const json = JSON.parse(Buffer.from(match[1], 'base64').toString())291 assert.strictEqual(json.version, 3)292 assert.strictEqual(json.sources[0], path.basename(input))293 assert.strictEqual(json.sourcesContent[0], content)294 },295 async sourceMapBoth({ esbuild, testDir }) {296 const input = path.join(testDir, 'in.js')297 const output = path.join(testDir, 'out.js')298 const content = 'exports.foo = 123'299 await writeFileAsync(input, content)300 await esbuild.build({301 entryPoints: [input],302 outfile: output,303 sourcemap: 'both',304 })305 const result = require(output)306 assert.strictEqual(result.foo, 123)307 const outputFile = await readFileAsync(output, 'utf8')308 const match = /\/\/# sourceMappingURL=data:application\/json;base64,(.*)/.exec(outputFile)309 const json = JSON.parse(Buffer.from(match[1], 'base64').toString())310 assert.strictEqual(json.version, 3)311 assert.strictEqual(json.sources[0], path.basename(input))312 assert.strictEqual(json.sourcesContent[0], content)313 const outputFileMap = await readFileAsync(output + '.map', 'utf8')314 assert.strictEqual(Buffer.from(match[1], 'base64').toString(), outputFileMap)315 },316 async sourceMapIncludeSourcesContent({ esbuild, testDir }) {317 const input = path.join(testDir, 'in.js')318 const output = path.join(testDir, 'out.js')319 const content = 'exports.foo = 123'320 await writeFileAsync(input, content)321 await esbuild.build({322 entryPoints: [input],323 outfile: output,324 sourcemap: true,325 sourcesContent: true,326 })327 const result = require(output)328 assert.strictEqual(result.foo, 123)329 const outputFile = await readFileAsync(output, 'utf8')330 const match = /\/\/# sourceMappingURL=(.*)/.exec(outputFile)331 assert.strictEqual(match[1], 'out.js.map')332 const resultMap = await readFileAsync(output + '.map', 'utf8')333 const json = JSON.parse(resultMap)334 assert.strictEqual(json.version, 3)335 assert.strictEqual(json.sources[0], path.basename(input))336 assert.strictEqual(json.sourcesContent[0], content)337 },338 async sourceMapExcludeSourcesContent({ esbuild, testDir }) {339 const input = path.join(testDir, 'in.js')340 const output = path.join(testDir, 'out.js')341 const content = 'exports.foo = 123'342 await writeFileAsync(input, content)343 await esbuild.build({344 entryPoints: [input],345 outfile: output,346 sourcemap: true,347 sourcesContent: false,348 })349 const result = require(output)350 assert.strictEqual(result.foo, 123)351 const outputFile = await readFileAsync(output, 'utf8')352 const match = /\/\/# sourceMappingURL=(.*)/.exec(outputFile)353 assert.strictEqual(match[1], 'out.js.map')354 const resultMap = await readFileAsync(output + '.map', 'utf8')355 const json = JSON.parse(resultMap)356 assert.strictEqual(json.version, 3)357 assert.strictEqual(json.sources[0], path.basename(input))358 assert.strictEqual(json.sourcesContent, void 0)359 },360 async sourceMapSourceRoot({ esbuild, testDir }) {361 const input = path.join(testDir, 'in.js')362 const output = path.join(testDir, 'out.js')363 const content = 'exports.foo = 123'364 await writeFileAsync(input, content)365 await esbuild.build({366 entryPoints: [input],367 outfile: output,368 sourcemap: true,369 sourceRoot: 'https://example.com/'370 })371 const result = require(output)372 assert.strictEqual(result.foo, 123)373 const outputFile = await readFileAsync(output, 'utf8')374 const match = /\/\/# sourceMappingURL=(.*)/.exec(outputFile)375 assert.strictEqual(match[1], 'out.js.map')376 const resultMap = await readFileAsync(output + '.map', 'utf8')377 const json = JSON.parse(resultMap)378 assert.strictEqual(json.version, 3)379 assert.strictEqual(json.sources[0], path.basename(input))380 assert.strictEqual(json.sourceRoot, 'https://example.com/')381 },382 async sourceMapWithDisabledFile({ esbuild, testDir }) {383 const input = path.join(testDir, 'in.js')384 const disabled = path.join(testDir, 'disabled.js')385 const packageJSON = path.join(testDir, 'package.json')386 const output = path.join(testDir, 'out.js')387 const content = 'exports.foo = require("./disabled")'388 await writeFileAsync(input, content)389 await writeFileAsync(disabled, 'module.exports = 123')390 await writeFileAsync(packageJSON, `{"browser": {"./disabled.js": false}}`)391 await esbuild.build({392 entryPoints: [input],393 outfile: output,394 sourcemap: true,395 bundle: true,396 })397 const result = require(output)398 assert.strictEqual(result.foo, void 0)399 const resultMap = await readFileAsync(output + '.map', 'utf8')400 const json = JSON.parse(resultMap)401 assert.strictEqual(json.version, 3)402 assert.strictEqual(json.sources[0], 'disabled')403 assert.strictEqual(json.sources[1], path.basename(input))404 assert.strictEqual(json.sourcesContent[0], '')405 assert.strictEqual(json.sourcesContent[1], content)406 },407 async sourceMapWithDisabledModule({ esbuild, testDir }) {408 const input = path.join(testDir, 'in.js')409 const disabled = path.join(testDir, 'node_modules', 'disabled', 'index.js')410 const packageJSON = path.join(testDir, 'package.json')411 const output = path.join(testDir, 'out.js')412 const content = 'exports.foo = require("disabled")'413 await mkdirAsync(path.dirname(disabled), { recursive: true })414 await writeFileAsync(input, content)415 await writeFileAsync(disabled, 'module.exports = 123')416 await writeFileAsync(packageJSON, `{"browser": {"disabled": false}}`)417 await esbuild.build({418 entryPoints: [input],419 outfile: output,420 sourcemap: true,421 bundle: true,422 })423 const result = require(output)424 assert.strictEqual(result.foo, void 0)425 const resultMap = await readFileAsync(output + '.map', 'utf8')426 const json = JSON.parse(resultMap)427 assert.strictEqual(json.version, 3)428 assert.strictEqual(json.sources[0], path.relative(testDir, disabled).split(path.sep).join('/'))429 assert.strictEqual(json.sources[1], path.basename(input))430 assert.strictEqual(json.sourcesContent[0], '')431 assert.strictEqual(json.sourcesContent[1], content)432 },433 async resolveExtensionOrder({ esbuild, testDir }) {434 const input = path.join(testDir, 'in.js');435 const inputBare = path.join(testDir, 'module.js')436 const inputSomething = path.join(testDir, 'module.something.js')437 const output = path.join(testDir, 'out.js')438 await writeFileAsync(input, 'exports.result = require("./module").foo')439 await writeFileAsync(inputBare, 'exports.foo = 321')440 await writeFileAsync(inputSomething, 'exports.foo = 123')441 await esbuild.build({442 entryPoints: [input],443 outfile: output,444 format: 'cjs',445 bundle: true,446 resolveExtensions: ['.something.js', '.js'],447 })448 assert.strictEqual(require(output).result, 123)449 },450 async defineObject({ esbuild, testDir }) {451 const input = path.join(testDir, 'in.js');452 const output = path.join(testDir, 'out.js')453 await writeFileAsync(input, 'export default {abc, xyz}')454 await esbuild.build({455 entryPoints: [input],456 outfile: output,457 format: 'cjs',458 bundle: true,459 define: {460 abc: '["a", "b", "c"]',461 xyz: '{"x": 1, "y": 2, "z": 3}',462 },463 })464 assert.deepStrictEqual(require(output).default, {465 abc: ['a', 'b', 'c'],466 xyz: { x: 1, y: 2, z: 3 },467 })468 },469 async inject({ esbuild, testDir }) {470 const input = path.join(testDir, 'in.js');471 const inject = path.join(testDir, 'inject.js')472 const output = path.join(testDir, 'out.js')473 await writeFileAsync(input, 'export default foo * 10 + 4')474 await writeFileAsync(inject, 'export let foo = 123')475 await esbuild.build({476 entryPoints: [input],477 outfile: output,478 format: 'cjs',479 bundle: true,480 inject: [inject],481 })482 assert.strictEqual(require(output).default, 1234)483 },484 async mainFields({ esbuild, testDir }) {485 const input = path.join(testDir, 'in.js')486 const output = path.join(testDir, 'out.js')487 const mainFieldsDir = path.join(testDir, 'node_modules', 'main-fields-test')488 const mainFieldsA = path.join(mainFieldsDir, 'a.js')489 const mainFieldsB = path.join(mainFieldsDir, 'b.js')490 const mainFieldsPackage = path.join(mainFieldsDir, 'package.json')491 await mkdirAsync(mainFieldsDir, { recursive: true })492 await writeFileAsync(input, 'export * from "main-fields-test"')493 await writeFileAsync(mainFieldsA, 'export let foo = "a"')494 await writeFileAsync(mainFieldsB, 'export let foo = "b"')495 await writeFileAsync(mainFieldsPackage, '{ "a": "./a.js", "b": "./b.js", "c": "./c.js" }')496 await esbuild.build({497 entryPoints: [input],498 outfile: output,499 bundle: true,500 format: 'cjs',501 mainFields: ['c', 'b', 'a'],502 })503 const result = require(output)504 assert.strictEqual(result.foo, 'b')505 },506 async requireAbsolutePath({ esbuild, testDir }) {507 const input = path.join(testDir, 'in.js')508 const dependency = path.join(testDir, 'dep.js')509 const output = path.join(testDir, 'out.js')510 await writeFileAsync(input, `import value from ${JSON.stringify(dependency)}; export default value`)511 await writeFileAsync(dependency, `export default 123`)512 const value = await esbuild.build({513 entryPoints: [input],514 bundle: true,515 outfile: output,516 format: 'cjs',517 })518 assert.strictEqual(value.outputFiles, void 0)519 const result = require(output)520 assert.strictEqual(result.default, 123)521 assert.strictEqual(result.__esModule, true)522 },523 async fileLoader({ esbuild, testDir }) {524 const input = path.join(testDir, 'in.js')525 const data = path.join(testDir, 'data.bin')526 const output = path.join(testDir, 'out.js')527 await writeFileAsync(input, `export {default as value} from ${JSON.stringify(data)}`)528 await writeFileAsync(data, `stuff`)529 const value = await esbuild.build({530 entryPoints: [input],531 bundle: true,532 outfile: output,533 format: 'cjs',534 loader: { '.bin': 'file' },535 })536 assert.strictEqual(value.outputFiles, void 0)537 const result = require(output)538 assert.strictEqual(result.value, './data-BYATPJRB.bin')539 assert.strictEqual(result.__esModule, true)540 },541 async splittingPublicPath({ esbuild, testDir }) {542 const input1 = path.join(testDir, 'a', 'in1.js')543 const input2 = path.join(testDir, 'b', 'in2.js')544 const shared = path.join(testDir, 'c', 'shared.js')545 const outdir = path.join(testDir, 'out')546 await mkdirAsync(path.dirname(input1), { recursive: true })547 await mkdirAsync(path.dirname(input2), { recursive: true })548 await mkdirAsync(path.dirname(shared), { recursive: true })549 await writeFileAsync(input1, `export {default as input1} from ${JSON.stringify(shared)}`)550 await writeFileAsync(input2, `export {default as input2} from ${JSON.stringify(shared)}`)551 await writeFileAsync(shared, `export default function foo() { return 123 }`)552 const value = await esbuild.build({553 entryPoints: [input1, input2],554 bundle: true,555 outdir,556 format: 'esm',557 splitting: true,558 publicPath: 'https://www.example.com/assets',559 write: false,560 })561 assert.deepStrictEqual(value.outputFiles.length, 3)562 assert.deepStrictEqual(value.outputFiles[0].path, path.join(outdir, 'a', 'in1.js'))563 assert.deepStrictEqual(value.outputFiles[1].path, path.join(outdir, 'b', 'in2.js'))564 assert.deepStrictEqual(value.outputFiles[2].path, path.join(outdir, 'chunk-22JQAFLY.js'))565 assert.deepStrictEqual(value.outputFiles[0].text, `import {566 foo567} from "https://www.example.com/assets/chunk-22JQAFLY.js";568export {569 foo as input1570};571`)572 assert.deepStrictEqual(value.outputFiles[1].text, `import {573 foo574} from "https://www.example.com/assets/chunk-22JQAFLY.js";575export {576 foo as input2577};578`)579 assert.deepStrictEqual(value.outputFiles[2].text, `// scripts/.js-api-tests/splittingPublicPath/c/shared.js580function foo() {581 return 123;582}583export {584 foo585};586`)587 },588 async fileLoaderPublicPath({ esbuild, testDir }) {589 const input = path.join(testDir, 'in.js')590 const data = path.join(testDir, 'data.bin')591 const output = path.join(testDir, 'out.js')592 await writeFileAsync(input, `export {default as value} from ${JSON.stringify(data)}`)593 await writeFileAsync(data, `stuff`)594 const value = await esbuild.build({595 entryPoints: [input],596 bundle: true,597 outfile: output,598 format: 'cjs',599 loader: { '.bin': 'file' },600 publicPath: 'https://www.example.com/assets',601 })602 assert.strictEqual(value.outputFiles, void 0)603 const result = require(output)604 assert.strictEqual(result.value, 'https://www.example.com/assets/data-BYATPJRB.bin')605 assert.strictEqual(result.__esModule, true)606 },607 async fileLoaderCSS({ esbuild, testDir }) {608 const input = path.join(testDir, 'in.css')609 const data = path.join(testDir, 'data.bin')610 const output = path.join(testDir, 'out.css')611 await writeFileAsync(input, `body { background: url(${JSON.stringify(data)}) }`)612 await writeFileAsync(data, `stuff`)613 const value = await esbuild.build({614 entryPoints: [input],615 bundle: true,616 outfile: output,617 loader: { '.bin': 'file' },618 publicPath: 'https://www.example.com/assets',619 })620 assert.strictEqual(value.outputFiles, void 0)621 assert.strictEqual(await readFileAsync(output, 'utf8'), `/* scripts/.js-api-tests/fileLoaderCSS/in.css */622body {623 background: url(https://www.example.com/assets/data-BYATPJRB.bin);624}625`)626 },627 async fileLoaderWithAssetPath({ esbuild, testDir }) {628 const input = path.join(testDir, 'in.js')629 const data = path.join(testDir, 'data.bin')630 const outdir = path.join(testDir, 'out')631 await writeFileAsync(input, `export {default as value} from ${JSON.stringify(data)}`)632 await writeFileAsync(data, `stuff`)633 const value = await esbuild.build({634 entryPoints: [input],635 bundle: true,636 outdir,637 format: 'cjs',638 loader: { '.bin': 'file' },639 assetNames: 'assets/name=[name]/hash=[hash]',640 })641 assert.strictEqual(value.outputFiles, void 0)642 const result = require(path.join(outdir, path.basename(input)))643 assert.strictEqual(result.value, './assets/name=data/hash=BYATPJRB.bin')644 assert.strictEqual(result.__esModule, true)645 const stuff = fs.readFileSync(path.join(outdir, result.value), 'utf8')646 assert.strictEqual(stuff, 'stuff')647 },648 async fileLoaderWithAssetPathAndPublicPath({ esbuild, testDir }) {649 const input = path.join(testDir, 'in.js')650 const data = path.join(testDir, 'data.bin')651 const outdir = path.join(testDir, 'out')652 await writeFileAsync(input, `export {default as value} from ${JSON.stringify(data)}`)653 await writeFileAsync(data, `stuff`)654 const value = await esbuild.build({655 entryPoints: [input],656 bundle: true,657 outdir,658 format: 'cjs',659 loader: { '.bin': 'file' },660 assetNames: 'assets/name=[name]/hash=[hash]',661 publicPath: 'https://www.example.com',662 })663 assert.strictEqual(value.outputFiles, void 0)664 const result = require(path.join(outdir, path.basename(input)))665 assert.strictEqual(result.value, 'https://www.example.com/assets/name=data/hash=BYATPJRB.bin')666 assert.strictEqual(result.__esModule, true)667 const stuff = fs.readFileSync(path.join(outdir, 'assets', 'name=data', 'hash=BYATPJRB.bin'), 'utf8')668 assert.strictEqual(stuff, 'stuff')669 },670 async fileLoaderBinaryVsText({ esbuild, testDir }) {671 const input = path.join(testDir, 'in.js')672 const valid = path.join(testDir, 'valid.bin')673 const invalid = path.join(testDir, 'invalid.bin')674 const output = path.join(testDir, 'out.js')675 await writeFileAsync(input, `676 import valid from ${JSON.stringify(valid)}677 import invalid from ${JSON.stringify(invalid)}678 console.log(valid, invalid)679 `)680 await writeFileAsync(valid, Buffer.from([0xCF, 0x80]))681 await writeFileAsync(invalid, Buffer.from([0x80, 0xCF]))682 const value = await esbuild.build({683 entryPoints: [input],684 bundle: true,685 outfile: output,686 format: 'cjs',687 loader: { '.bin': 'file' },688 write: false,689 })690 assert.strictEqual(value.outputFiles.length, 3)691 // Valid UTF-8 should decode correctly692 assert.deepEqual(value.outputFiles[0].contents, new Uint8Array([207, 128]))693 assert.strictEqual(value.outputFiles[0].text, 'π')694 // Invalid UTF-8 should be preserved as bytes but should be replaced by the U+FFFD replacement character when decoded695 assert.deepEqual(value.outputFiles[1].contents, new Uint8Array([128, 207]))696 assert.strictEqual(value.outputFiles[1].text, '\uFFFD\uFFFD')697 },698 async metafile({ esbuild, testDir }) {699 const entry = path.join(testDir, 'entry.js')700 const imported = path.join(testDir, 'imported.js')701 const text = path.join(testDir, 'text.txt')702 const css = path.join(testDir, 'example.css')703 const outputJS = path.join(testDir, 'out.js')704 const outputCSS = path.join(testDir, 'out.css')705 await writeFileAsync(entry, `706 import x from "./imported"707 const y = require("./text.txt")708 import * as z from "./example.css"709 console.log(x, y, z)710 `)711 await writeFileAsync(imported, 'export default 123')712 await writeFileAsync(text, 'some text')713 await writeFileAsync(css, 'body { some: css; }')714 const result = await esbuild.build({715 entryPoints: [entry],716 bundle: true,717 outfile: outputJS,718 metafile: true,719 sourcemap: true,720 loader: { '.txt': 'file' },721 })722 const json = result.metafile723 assert.strictEqual(Object.keys(json.inputs).length, 4)724 assert.strictEqual(Object.keys(json.outputs).length, 5)725 const cwd = process.cwd()726 const makePath = absPath => path.relative(cwd, absPath).split(path.sep).join('/')727 // Check inputs728 assert.deepStrictEqual(json.inputs[makePath(entry)].bytes, 144)729 assert.deepStrictEqual(json.inputs[makePath(entry)].imports, [730 { path: makePath(imported), kind: 'import-statement' },731 { path: makePath(css), kind: 'import-statement' },732 { path: makePath(text), kind: 'require-call' },733 ])734 assert.deepStrictEqual(json.inputs[makePath(imported)].bytes, 18)735 assert.deepStrictEqual(json.inputs[makePath(imported)].imports, [])736 assert.deepStrictEqual(json.inputs[makePath(text)].bytes, 9)737 assert.deepStrictEqual(json.inputs[makePath(text)].imports, [])738 assert.deepStrictEqual(json.inputs[makePath(css)].bytes, 19)739 assert.deepStrictEqual(json.inputs[makePath(css)].imports, [])740 // Check outputs741 assert.strictEqual(typeof json.outputs[makePath(outputJS)].bytes, 'number')742 assert.strictEqual(typeof json.outputs[makePath(outputCSS)].bytes, 'number')743 assert.strictEqual(typeof json.outputs[makePath(outputJS) + '.map'].bytes, 'number')744 assert.strictEqual(typeof json.outputs[makePath(outputCSS) + '.map'].bytes, 'number')745 assert.strictEqual(json.outputs[makePath(outputJS)].entryPoint, makePath(entry))746 assert.strictEqual(json.outputs[makePath(outputCSS)].entryPoint, undefined) // This is deliberately undefined747 assert.deepStrictEqual(json.outputs[makePath(outputJS) + '.map'].imports, [])748 assert.deepStrictEqual(json.outputs[makePath(outputJS) + '.map'].exports, [])749 assert.deepStrictEqual(json.outputs[makePath(outputJS) + '.map'].inputs, {})750 assert.deepStrictEqual(json.outputs[makePath(outputCSS) + '.map'].imports, [])751 assert.deepStrictEqual(json.outputs[makePath(outputCSS) + '.map'].exports, [])752 assert.deepStrictEqual(json.outputs[makePath(outputCSS) + '.map'].inputs, {})753 // Check inputs for main output754 const outputInputs = json.outputs[makePath(outputJS)].inputs755 assert.strictEqual(Object.keys(outputInputs).length, 4)756 assert.strictEqual(typeof outputInputs[makePath(entry)].bytesInOutput, 'number')757 assert.strictEqual(typeof outputInputs[makePath(imported)].bytesInOutput, 'number')758 assert.strictEqual(typeof outputInputs[makePath(text)].bytesInOutput, 'number')759 assert.strictEqual(typeof outputInputs[makePath(css)].bytesInOutput, 'number')760 },761 async metafileSplitting({ esbuild, testDir }) {762 const entry1 = path.join(testDir, 'entry1.js')763 const entry2 = path.join(testDir, 'entry2.js')764 const imported = path.join(testDir, 'imported.js')765 const outdir = path.join(testDir, 'out')766 await writeFileAsync(entry1, `767 import x, {f1} from "./${path.basename(imported)}"768 console.log(1, x, f1())769 export {x}770 `)771 await writeFileAsync(entry2, `772 import x, {f2} from "./${path.basename(imported)}"773 console.log('entry 2', x, f2())774 export {x as y}775 `)776 await writeFileAsync(imported, `777 export default 123778 export function f1() {}779 export function f2() {}780 console.log('shared')781 `)782 const result = await esbuild.build({783 entryPoints: [entry1, entry2],784 bundle: true,785 outdir,786 metafile: true,787 splitting: true,788 format: 'esm',789 })790 const json = result.metafile791 assert.strictEqual(Object.keys(json.inputs).length, 3)792 assert.strictEqual(Object.keys(json.outputs).length, 3)793 const cwd = process.cwd()794 const makeOutPath = basename => path.relative(cwd, path.join(outdir, basename)).split(path.sep).join('/')795 const makeInPath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')796 // Check metafile797 const inEntry1 = makeInPath(entry1);798 const inEntry2 = makeInPath(entry2);799 const inImported = makeInPath(imported);800 const chunk = 'chunk-YNV25ITT.js';801 const outEntry1 = makeOutPath(path.basename(entry1));802 const outEntry2 = makeOutPath(path.basename(entry2));803 const outChunk = makeOutPath(chunk);804 assert.deepStrictEqual(json.inputs[inEntry1], { bytes: 94, imports: [{ path: inImported, kind: 'import-statement' }] })805 assert.deepStrictEqual(json.inputs[inEntry2], { bytes: 107, imports: [{ path: inImported, kind: 'import-statement' }] })806 assert.deepStrictEqual(json.inputs[inImported], { bytes: 118, imports: [] })807 assert.deepStrictEqual(json.outputs[outEntry1].imports, [{ path: makeOutPath(chunk), kind: 'import-statement' }])808 assert.deepStrictEqual(json.outputs[outEntry2].imports, [{ path: makeOutPath(chunk), kind: 'import-statement' }])809 assert.deepStrictEqual(json.outputs[outChunk].imports, [])810 assert.deepStrictEqual(json.outputs[outEntry1].exports, ['x'])811 assert.deepStrictEqual(json.outputs[outEntry2].exports, ['y'])812 assert.deepStrictEqual(json.outputs[outChunk].exports, ['f1', 'f2', 'imported_default'])813 assert.deepStrictEqual(json.outputs[outEntry1].inputs, { [inEntry1]: { bytesInOutput: 40 } })814 assert.deepStrictEqual(json.outputs[outEntry2].inputs, { [inEntry2]: { bytesInOutput: 48 } })815 assert.deepStrictEqual(json.outputs[outChunk].inputs, { [inImported]: { bytesInOutput: 87 } })816 },817 async metafileSplittingPublicPath({ esbuild, testDir }) {818 const entry1 = path.join(testDir, 'entry1.js')819 const entry2 = path.join(testDir, 'entry2.js')820 const imported = path.join(testDir, 'imported.js')821 const outdir = path.join(testDir, 'out')822 await writeFileAsync(entry1, `823 import x, {f1} from "./${path.basename(imported)}"824 console.log(1, x, f1())825 export {x}826 `)827 await writeFileAsync(entry2, `828 import x, {f2} from "./${path.basename(imported)}"829 console.log('entry 2', x, f2())830 export {x as y}831 `)832 await writeFileAsync(imported, `833 export default 123834 export function f1() {}835 export function f2() {}836 console.log('shared')837 `)838 const result = await esbuild.build({839 entryPoints: [entry1, entry2],840 bundle: true,841 outdir,842 metafile: true,843 splitting: true,844 format: 'esm',845 publicPath: 'public',846 })847 const json = result.metafile848 assert.strictEqual(Object.keys(json.inputs).length, 3)849 assert.strictEqual(Object.keys(json.outputs).length, 3)850 const cwd = process.cwd()851 const makeOutPath = basename => path.relative(cwd, path.join(outdir, basename)).split(path.sep).join('/')852 const makeInPath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')853 // Check metafile854 const inEntry1 = makeInPath(entry1);855 const inEntry2 = makeInPath(entry2);856 const inImported = makeInPath(imported);857 const chunk = 'chunk-MDV3DDWZ.js';858 const outEntry1 = makeOutPath(path.basename(entry1));859 const outEntry2 = makeOutPath(path.basename(entry2));860 const outChunk = makeOutPath(chunk);861 assert.deepStrictEqual(json.inputs[inEntry1], { bytes: 94, imports: [{ path: inImported, kind: 'import-statement' }] })862 assert.deepStrictEqual(json.inputs[inEntry2], { bytes: 107, imports: [{ path: inImported, kind: 'import-statement' }] })863 assert.deepStrictEqual(json.inputs[inImported], { bytes: 118, imports: [] })864 assert.deepStrictEqual(json.outputs[outEntry1].imports, [{ path: makeOutPath(chunk), kind: 'import-statement' }])865 assert.deepStrictEqual(json.outputs[outEntry2].imports, [{ path: makeOutPath(chunk), kind: 'import-statement' }])866 assert.deepStrictEqual(json.outputs[outChunk].imports, [])867 assert.deepStrictEqual(json.outputs[outEntry1].exports, ['x'])868 assert.deepStrictEqual(json.outputs[outEntry2].exports, ['y'])869 assert.deepStrictEqual(json.outputs[outChunk].exports, ['f1', 'f2', 'imported_default'])870 assert.deepStrictEqual(json.outputs[outEntry1].inputs, { [inEntry1]: { bytesInOutput: 40 } })871 assert.deepStrictEqual(json.outputs[outEntry2].inputs, { [inEntry2]: { bytesInOutput: 48 } })872 assert.deepStrictEqual(json.outputs[outChunk].inputs, { [inImported]: { bytesInOutput: 87 } })873 },874 async metafileSplittingDoubleDynamicImport({ esbuild, testDir }) {875 const entry = path.join(testDir, 'entry.js')876 const importDir = path.join(testDir, 'import-dir')877 const import1 = path.join(importDir, 'import1.js')878 const import2 = path.join(importDir, 'import2.js')879 const shared = path.join(testDir, 'shared.js')880 const outdir = path.join(testDir, 'out')881 const makeImportPath = (importing, imported) => JSON.stringify('./' + path.relative(path.dirname(importing), imported).split(path.sep).join('/'))882 await mkdirAsync(importDir)883 await writeFileAsync(entry, `884 import ${makeImportPath(entry, shared)}885 import(${makeImportPath(entry, import1)})886 import(${makeImportPath(entry, import2)})887 `)888 await writeFileAsync(import1, `889 import ${makeImportPath(import1, shared)}890 `)891 await writeFileAsync(import2, `892 import ${makeImportPath(import2, shared)}893 `)894 await writeFileAsync(shared, `895 console.log('side effect')896 `)897 const result = await esbuild.build({898 entryPoints: [entry],899 bundle: true,900 outdir,901 metafile: true,902 splitting: true,903 format: 'esm',904 })905 const json = result.metafile906 assert.strictEqual(Object.keys(json.inputs).length, 4)907 assert.strictEqual(Object.keys(json.outputs).length, 4)908 const cwd = process.cwd()909 const makeOutPath = basename => path.relative(cwd, path.join(outdir, basename)).split(path.sep).join('/')910 const makeInPath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')911 // Check metafile912 const inEntry = makeInPath(entry);913 const inImport1 = makeInPath(import1);914 const inImport2 = makeInPath(import2);915 const inShared = makeInPath(shared);916 const chunk = 'chunk-3GRHLZ7X.js';917 const outEntry = makeOutPath(path.relative(testDir, entry));918 const outImport1 = makeOutPath('import1-SELM3ZIG.js');919 const outImport2 = makeOutPath('import2-3GSTEHBF.js');920 const outChunk = makeOutPath(chunk);921 assert.deepStrictEqual(json.inputs[inEntry], {922 bytes: 112,923 imports: [924 { path: inShared, kind: 'import-statement' },925 { path: inImport1, kind: 'dynamic-import' },926 { path: inImport2, kind: 'dynamic-import' },927 ]928 })929 assert.deepStrictEqual(json.inputs[inImport1], {930 bytes: 35,931 imports: [932 { path: inShared, kind: 'import-statement' },933 ]934 })935 assert.deepStrictEqual(json.inputs[inImport2], {936 bytes: 35,937 imports: [938 { path: inShared, kind: 'import-statement' },939 ]940 })941 assert.deepStrictEqual(json.inputs[inShared], { bytes: 38, imports: [] })942 assert.deepStrictEqual(Object.keys(json.outputs), [943 outEntry,944 outImport1,945 outImport2,946 outChunk,947 ])948 assert.deepStrictEqual(json.outputs[outEntry].imports, [949 { path: outImport1, kind: 'dynamic-import' },950 { path: outImport2, kind: 'dynamic-import' },951 { path: outChunk, kind: 'import-statement' },952 ])953 assert.deepStrictEqual(json.outputs[outImport1].imports, [{ path: outChunk, kind: 'import-statement' }])954 assert.deepStrictEqual(json.outputs[outImport2].imports, [{ path: outChunk, kind: 'import-statement' }])955 assert.deepStrictEqual(json.outputs[outChunk].imports, [])956 assert.deepStrictEqual(json.outputs[outEntry].exports, [])957 assert.deepStrictEqual(json.outputs[outImport1].exports, [])958 assert.deepStrictEqual(json.outputs[outImport2].exports, [])959 assert.deepStrictEqual(json.outputs[outChunk].exports, [])960 assert.deepStrictEqual(json.outputs[outEntry].inputs, { [inEntry]: { bytesInOutput: 74 } })961 assert.deepStrictEqual(json.outputs[outImport1].inputs, { [inImport1]: { bytesInOutput: 0 } })962 assert.deepStrictEqual(json.outputs[outImport2].inputs, { [inImport2]: { bytesInOutput: 0 } })963 assert.deepStrictEqual(json.outputs[outChunk].inputs, { [inShared]: { bytesInOutput: 28 } })964 },965 async metafileCJSInFormatIIFE({ esbuild, testDir }) {966 const entry = path.join(testDir, 'entry.js')967 const outfile = path.join(testDir, 'out.js')968 await writeFileAsync(entry, `module.exports = {}`)969 const result = await esbuild.build({970 entryPoints: [entry],971 outfile,972 metafile: true,973 format: 'iife',974 })975 const cwd = process.cwd()976 const makePath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')977 const json = result.metafile978 assert.deepStrictEqual(json.inputs[makePath(entry)].imports, [])979 assert.deepStrictEqual(json.outputs[makePath(outfile)].imports, [])980 assert.deepStrictEqual(json.outputs[makePath(outfile)].exports, [])981 },982 async metafileCJSInFormatCJS({ esbuild, testDir }) {983 const entry = path.join(testDir, 'entry.js')984 const outfile = path.join(testDir, 'out.js')985 await writeFileAsync(entry, `module.exports = {}`)986 const result = await esbuild.build({987 entryPoints: [entry],988 outfile,989 metafile: true,990 format: 'cjs',991 })992 const cwd = process.cwd()993 const makePath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')994 const json = result.metafile995 assert.deepStrictEqual(json.inputs[makePath(entry)].imports, [])996 assert.deepStrictEqual(json.outputs[makePath(outfile)].imports, [])997 assert.deepStrictEqual(json.outputs[makePath(outfile)].exports, [])998 assert.deepStrictEqual(json.outputs[makePath(outfile)].entryPoint, makePath(entry))999 },1000 async metafileCJSInFormatESM({ esbuild, testDir }) {1001 const entry = path.join(testDir, 'entry.js')1002 const outfile = path.join(testDir, 'out.js')1003 await writeFileAsync(entry, `module.exports = {}`)1004 const result = await esbuild.build({1005 entryPoints: [entry],1006 outfile,1007 metafile: true,1008 format: 'esm',1009 })1010 const cwd = process.cwd()1011 const makePath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')1012 const json = result.metafile1013 assert.deepStrictEqual(json.inputs[makePath(entry)].imports, [])1014 assert.deepStrictEqual(json.outputs[makePath(outfile)].imports, [])1015 assert.deepStrictEqual(json.outputs[makePath(outfile)].exports, ['default'])1016 },1017 async metafileESMInFormatIIFE({ esbuild, testDir }) {1018 const entry = path.join(testDir, 'entry.js')1019 const outfile = path.join(testDir, 'out.js')1020 await writeFileAsync(entry, `export let a = 1, b = 2`)1021 const result = await esbuild.build({1022 entryPoints: [entry],1023 outfile,1024 metafile: true,1025 format: 'iife',1026 })1027 const cwd = process.cwd()1028 const makePath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')1029 const json = result.metafile1030 assert.deepStrictEqual(json.inputs[makePath(entry)].imports, [])1031 assert.deepStrictEqual(json.outputs[makePath(outfile)].imports, [])1032 assert.deepStrictEqual(json.outputs[makePath(outfile)].exports, [])1033 },1034 async metafileESMInFormatCJS({ esbuild, testDir }) {1035 const entry = path.join(testDir, 'entry.js')1036 const outfile = path.join(testDir, 'out.js')1037 await writeFileAsync(entry, `export let a = 1, b = 2`)1038 const result = await esbuild.build({1039 entryPoints: [entry],1040 outfile,1041 metafile: true,1042 format: 'cjs',1043 })1044 const cwd = process.cwd()1045 const makePath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')1046 const json = result.metafile1047 assert.deepStrictEqual(json.inputs[makePath(entry)].imports, [])1048 assert.deepStrictEqual(json.outputs[makePath(outfile)].imports, [])1049 assert.deepStrictEqual(json.outputs[makePath(outfile)].exports, [])1050 },1051 async metafileESMInFormatESM({ esbuild, testDir }) {1052 const entry = path.join(testDir, 'entry.js')1053 const outfile = path.join(testDir, 'out.js')1054 await writeFileAsync(entry, `export let a = 1, b = 2`)1055 const result = await esbuild.build({1056 entryPoints: [entry],1057 outfile,1058 metafile: true,1059 format: 'esm',1060 })1061 const cwd = process.cwd()1062 const makePath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')1063 const json = result.metafile1064 assert.deepStrictEqual(json.inputs[makePath(entry)].imports, [])1065 assert.deepStrictEqual(json.outputs[makePath(outfile)].imports, [])1066 assert.deepStrictEqual(json.outputs[makePath(outfile)].exports, ['a', 'b'])1067 },1068 async metafileNestedExportNames({ esbuild, testDir }) {1069 const entry = path.join(testDir, 'entry.js')1070 const nested1 = path.join(testDir, 'nested1.js')1071 const nested2 = path.join(testDir, 'nested2.js')1072 const nested3 = path.join(testDir, 'nested3.js')1073 const outfile = path.join(testDir, 'out.js')1074 await writeFileAsync(entry, `1075 export {nested1} from ${JSON.stringify(nested1)}1076 export * from ${JSON.stringify(nested2)}1077 export let topLevel = 01078 `)1079 await writeFileAsync(nested1, `1080 import {nested3} from ${JSON.stringify(nested3)}1081 export default 11082 export let nested1 = nested31083 `)1084 await writeFileAsync(nested2, `1085 export default 'nested2'1086 export let nested2 = 21087 `)1088 await writeFileAsync(nested3, `1089 export let nested3 = 31090 `)1091 const result = await esbuild.build({1092 entryPoints: [entry],1093 bundle: true,1094 outfile,1095 metafile: true,1096 format: 'esm',1097 })1098 const cwd = process.cwd()1099 const makePath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')1100 const json = result.metafile1101 assert.deepStrictEqual(json.inputs[makePath(entry)].imports, [1102 { path: makePath(nested1), kind: 'import-statement' },1103 { path: makePath(nested2), kind: 'import-statement' },1104 ])1105 assert.deepStrictEqual(json.inputs[makePath(nested1)].imports, [1106 { path: makePath(nested3), kind: 'import-statement' },1107 ])1108 assert.deepStrictEqual(json.inputs[makePath(nested2)].imports, [])1109 assert.deepStrictEqual(json.inputs[makePath(nested3)].imports, [])1110 assert.deepStrictEqual(json.outputs[makePath(outfile)].imports, [])1111 assert.deepStrictEqual(json.outputs[makePath(outfile)].exports, ['nested1', 'nested2', 'topLevel'])1112 assert.deepStrictEqual(json.outputs[makePath(outfile)].entryPoint, makePath(entry))1113 },1114 async metafileCSS({ esbuild, testDir }) {1115 const entry = path.join(testDir, 'entry.css')1116 const imported = path.join(testDir, 'imported.css')1117 const image = path.join(testDir, 'example.png')1118 const output = path.join(testDir, 'out.css')1119 await writeFileAsync(entry, `1120 @import "./imported";1121 body { background: url(https://example.com/external.png) }1122 `)1123 await writeFileAsync(imported, `1124 a { background: url(./example.png) }1125 `)1126 await writeFileAsync(image, 'an image')1127 const result = await esbuild.build({1128 entryPoints: [entry],1129 bundle: true,1130 outfile: output,1131 metafile: true,1132 sourcemap: true,1133 loader: { '.png': 'dataurl' },1134 })1135 const json = result.metafile1136 assert.strictEqual(Object.keys(json.inputs).length, 3)1137 assert.strictEqual(Object.keys(json.outputs).length, 2)1138 const cwd = process.cwd()1139 const makePath = absPath => path.relative(cwd, absPath).split(path.sep).join('/')1140 // Check inputs1141 assert.deepStrictEqual(json, {1142 inputs: {1143 [makePath(entry)]: { bytes: 98, imports: [{ path: makePath(imported), kind: 'import-rule' }] },1144 [makePath(image)]: { bytes: 8, imports: [] },1145 [makePath(imported)]: { bytes: 48, imports: [{ path: makePath(image), kind: 'url-token' }] },1146 },1147 outputs: {1148 [makePath(output)]: {1149 bytes: 263,1150 entryPoint: makePath(entry),1151 imports: [],1152 inputs: {1153 [makePath(entry)]: { bytesInOutput: 62 },1154 [makePath(imported)]: { bytesInOutput: 61 },1155 },1156 },1157 [makePath(output + '.map')]: {1158 bytes: 312,1159 exports: [],1160 imports: [],1161 inputs: {},1162 },1163 },1164 })1165 },1166 async metafileLoaderFileMultipleEntry({ esbuild, testDir }) {1167 const entry1 = path.join(testDir, 'entry1.js')1168 const entry2 = path.join(testDir, 'entry2.js')1169 const file = path.join(testDir, 'x.file')1170 const outdir = path.join(testDir, 'out')1171 await writeFileAsync(entry1, `1172 export {default} from './x.file'1173 `)1174 await writeFileAsync(entry2, `1175 import z from './x.file'1176 console.log(z)1177 `)1178 await writeFileAsync(file, `This is a file`)1179 const result = await esbuild.build({1180 entryPoints: [entry1, entry2],1181 bundle: true,1182 loader: { '.file': 'file' },1183 outdir,1184 metafile: true,1185 format: 'cjs',1186 })1187 const json = result.metafile1188 const cwd = process.cwd()1189 const makePath = pathname => path.relative(cwd, pathname).split(path.sep).join('/')1190 const fileName = require(path.join(outdir, 'entry1.js')).default1191 const fileKey = makePath(path.join(outdir, fileName))1192 assert.deepStrictEqual(json.outputs[fileKey].imports, [])1193 assert.deepStrictEqual(json.outputs[fileKey].exports, [])1194 assert.deepStrictEqual(json.outputs[fileKey].inputs, { [makePath(file)]: { bytesInOutput: 14 } })1195 },1196 // Test in-memory output files1197 async writeFalse({ esbuild, testDir }) {1198 const input = path.join(testDir, 'in.js')1199 const output = path.join(testDir, 'out.js')1200 const inputCode = 'console.log()'1201 await writeFileAsync(input, inputCode)1202 const value = await esbuild.build({1203 entryPoints: [input],1204 bundle: true,1205 outfile: output,1206 sourcemap: true,1207 format: 'esm',1208 metafile: true,1209 write: false,1210 })1211 assert.strictEqual(fs.existsSync(output), false)1212 assert.notStrictEqual(value.outputFiles, void 0)1213 assert.strictEqual(value.outputFiles.length, 2)1214 assert.strictEqual(value.outputFiles[0].path, output + '.map')1215 assert.strictEqual(value.outputFiles[0].contents.constructor, Uint8Array)1216 assert.strictEqual(value.outputFiles[1].path, output)1217 assert.strictEqual(value.outputFiles[1].contents.constructor, Uint8Array)1218 const sourceMap = JSON.parse(Buffer.from(value.outputFiles[0].contents).toString())1219 const js = Buffer.from(value.outputFiles[1].contents).toString()1220 assert.strictEqual(sourceMap.version, 3)1221 assert.strictEqual(js, `// scripts/.js-api-tests/writeFalse/in.js\nconsole.log();\n//# sourceMappingURL=out.js.map\n`)1222 const cwd = process.cwd()1223 const makePath = file => path.relative(cwd, file).split(path.sep).join('/')1224 const meta = value.metafile1225 assert.strictEqual(meta.inputs[makePath(input)].bytes, inputCode.length)1226 assert.strictEqual(meta.outputs[makePath(output)].bytes, js.length)1227 assert.strictEqual(meta.outputs[makePath(output + '.map')].bytes, value.outputFiles[0].contents.length)1228 },1229 async allowOverwrite({ esbuild, testDir }) {1230 const input = path.join(testDir, 'in.mjs')1231 await writeFileAsync(input, `export default FOO`)1232 // Fail without "allowOverwrite"1233 try {1234 await esbuild.build({1235 entryPoints: [input],1236 outfile: input,1237 logLevel: 'silent',1238 })1239 throw new Error('Expected build failure');1240 } catch (e) {1241 if (!e || !e.errors || !e.errors.length || !e.errors[0].text.includes('Refusing to overwrite input file'))1242 throw e1243 }1244 // Succeed with "allowOverwrite"1245 await esbuild.build({1246 entryPoints: [input],1247 outfile: input,1248 allowOverwrite: true,1249 define: { FOO: '123' },1250 })1251 // This needs to use relative paths to avoid breaking on Windows.1252 // Importing by absolute path doesn't work on Windows in node.1253 const result = await import('./' + path.relative(__dirname, input))1254 assert.strictEqual(result.default, 123)1255 },1256 async splittingRelativeSameDir({ esbuild, testDir }) {1257 const inputA = path.join(testDir, 'a.js')1258 const inputB = path.join(testDir, 'b.js')1259 const inputCommon = path.join(testDir, 'common.js')1260 await writeFileAsync(inputA, `1261 import x from "./${path.basename(inputCommon)}"1262 console.log('a' + x)1263 `)1264 await writeFileAsync(inputB, `1265 import x from "./${path.basename(inputCommon)}"1266 console.log('b' + x)1267 `)1268 await writeFileAsync(inputCommon, `1269 export default 'common'1270 `)1271 const outdir = path.join(testDir, 'out')1272 const value = await esbuild.build({1273 entryPoints: [inputA, inputB],1274 bundle: true,1275 outdir,1276 format: 'esm',1277 splitting: true,1278 write: false,1279 })1280 assert.strictEqual(value.outputFiles.length, 3)1281 // These should all use forward slashes, even on Windows1282 const chunk = 'chunk-P3NHLAOZ.js'1283 assert.strictEqual(Buffer.from(value.outputFiles[0].contents).toString(), `import {1284 common_default1285} from "./${chunk}";1286// scripts/.js-api-tests/splittingRelativeSameDir/a.js1287console.log("a" + common_default);1288`)1289 assert.strictEqual(Buffer.from(value.outputFiles[1].contents).toString(), `import {1290 common_default1291} from "./${chunk}";1292// scripts/.js-api-tests/splittingRelativeSameDir/b.js1293console.log("b" + common_default);1294`)1295 assert.strictEqual(Buffer.from(value.outputFiles[2].contents).toString(), `// scripts/.js-api-tests/splittingRelativeSameDir/common.js1296var common_default = "common";1297export {1298 common_default1299};1300`)1301 assert.strictEqual(value.outputFiles[0].path, path.join(outdir, path.basename(inputA)))1302 assert.strictEqual(value.outputFiles[1].path, path.join(outdir, path.basename(inputB)))1303 assert.strictEqual(value.outputFiles[2].path, path.join(outdir, chunk))1304 },1305 async splittingRelativeNestedDir({ esbuild, testDir }) {1306 const inputA = path.join(testDir, 'a/demo.js')1307 const inputB = path.join(testDir, 'b/demo.js')1308 const inputCommon = path.join(testDir, 'common.js')1309 await mkdirAsync(path.dirname(inputA)).catch(x => x)1310 await mkdirAsync(path.dirname(inputB)).catch(x => x)1311 await writeFileAsync(inputA, `1312 import x from "../${path.basename(inputCommon)}"1313 console.log('a' + x)1314 `)1315 await writeFileAsync(inputB, `1316 import x from "../${path.basename(inputCommon)}"1317 console.log('b' + x)1318 `)1319 await writeFileAsync(inputCommon, `1320 export default 'common'1321 `)1322 const outdir = path.join(testDir, 'out')1323 const value = await esbuild.build({1324 entryPoints: [inputA, inputB],1325 bundle: true,1326 outdir,1327 format: 'esm',1328 splitting: true,1329 write: false,1330 })1331 assert.strictEqual(value.outputFiles.length, 3)1332 // These should all use forward slashes, even on Windows1333 const chunk = 'chunk-BPDO6GL2.js'1334 assert.strictEqual(Buffer.from(value.outputFiles[0].contents).toString(), `import {1335 common_default1336} from "../${chunk}";1337// scripts/.js-api-tests/splittingRelativeNestedDir/a/demo.js1338console.log("a" + common_default);1339`)1340 assert.strictEqual(Buffer.from(value.outputFiles[1].contents).toString(), `import {1341 common_default1342} from "../${chunk}";1343// scripts/.js-api-tests/splittingRelativeNestedDir/b/demo.js1344console.log("b" + common_default);1345`)1346 assert.strictEqual(Buffer.from(value.outputFiles[2].contents).toString(), `// scripts/.js-api-tests/splittingRelativeNestedDir/common.js1347var common_default = "common";1348export {1349 common_default1350};1351`)1352 assert.strictEqual(value.outputFiles[0].path, path.join(outdir, path.relative(testDir, inputA)))1353 assert.strictEqual(value.outputFiles[1].path, path.join(outdir, path.relative(testDir, inputB)))1354 assert.strictEqual(value.outputFiles[2].path, path.join(outdir, chunk))1355 },1356 async splittingWithChunkPath({ esbuild, testDir }) {1357 const inputA = path.join(testDir, 'a/demo.js')1358 const inputB = path.join(testDir, 'b/demo.js')1359 const inputCommon = path.join(testDir, 'common.js')1360 await mkdirAsync(path.dirname(inputA)).catch(x => x)1361 await mkdirAsync(path.dirname(inputB)).catch(x => x)1362 await writeFileAsync(inputA, `1363 import x from "../${path.basename(inputCommon)}"1364 console.log('a' + x)1365 `)1366 await writeFileAsync(inputB, `1367 import x from "../${path.basename(inputCommon)}"1368 console.log('b' + x)1369 `)1370 await writeFileAsync(inputCommon, `1371 export default 'common'1372 `)1373 const outdir = path.join(testDir, 'out')1374 const value = await esbuild.build({1375 entryPoints: [inputA, inputB],1376 bundle: true,1377 outdir,1378 format: 'esm',1379 splitting: true,1380 write: false,1381 chunkNames: 'chunks/name=[name]/hash=[hash]',1382 })1383 assert.strictEqual(value.outputFiles.length, 3)1384 // These should all use forward slashes, even on Windows1385 const chunk = 'chunks/name=chunk/hash=7RIY4OCQ.js'1386 assert.strictEqual(value.outputFiles[0].text, `import {1387 common_default1388} from "../${chunk}";1389// scripts/.js-api-tests/splittingWithChunkPath/a/demo.js1390console.log("a" + common_default);1391`)1392 assert.strictEqual(value.outputFiles[1].text, `import {1393 common_default1394} from "../${chunk}";1395// scripts/.js-api-tests/splittingWithChunkPath/b/demo.js1396console.log("b" + common_default);1397`)1398 assert.strictEqual(value.outputFiles[2].text, `// scripts/.js-api-tests/splittingWithChunkPath/common.js1399var common_default = "common";1400export {1401 common_default1402};1403`)1404 assert.strictEqual(value.outputFiles[0].path, path.join(outdir, path.relative(testDir, inputA)))1405 assert.strictEqual(value.outputFiles[1].path, path.join(outdir, path.relative(testDir, inputB)))1406 assert.strictEqual(value.outputFiles[2].path, path.join(outdir, chunk))1407 },1408 async splittingWithEntryHashes({ esbuild, testDir }) {1409 const inputA = path.join(testDir, 'a/demo.js')1410 const inputB = path.join(testDir, 'b/demo.js')1411 const inputCommon = path.join(testDir, 'common.js')1412 await mkdirAsync(path.dirname(inputA)).catch(x => x)1413 await mkdirAsync(path.dirname(inputB)).catch(x => x)1414 await writeFileAsync(inputA, `1415 import x from "../${path.basename(inputCommon)}"1416 console.log('a' + x.name)1417 `)1418 await writeFileAsync(inputB, `1419 import x from "../${path.basename(inputCommon)}"1420 console.log('b' + x.name)1421 `)1422 await writeFileAsync(inputCommon, `1423 export default { name: 'common' }1424 `)1425 const outdir = path.join(testDir, 'out')1426 const value = await esbuild.build({1427 entryPoints: [inputA, inputB],1428 bundle: true,1429 outdir,1430 format: 'esm',1431 splitting: true,1432 write: false,1433 entryNames: 'entry/name=[name]/hash=[hash]',1434 chunkNames: 'chunks/name=[name]/hash=[hash]',1435 })1436 assert.strictEqual(value.outputFiles.length, 3)1437 // These should all use forward slashes, even on Windows1438 const chunk = 'chunks/name=chunk/hash=6VLJRT45.js'1439 assert.strictEqual(value.outputFiles[0].text, `import {1440 common_default1441} from "../../${chunk}";1442// scripts/.js-api-tests/splittingWithEntryHashes/a/demo.js1443console.log("a" + common_default.name);1444`)1445 assert.strictEqual(value.outputFiles[1].text, `import {1446 common_default1447} from "../../${chunk}";1448// scripts/.js-api-tests/splittingWithEntryHashes/b/demo.js1449console.log("b" + common_default.name);1450`)1451 assert.strictEqual(value.outputFiles[2].text, `// scripts/.js-api-tests/splittingWithEntryHashes/common.js1452var common_default = { name: "common" };1453export {1454 common_default1455};1456`)1457 const outputA = 'entry/name=demo/hash=ZKX5HN4L.js'1458 const outputB = 'entry/name=demo/hash=TYTZIN4P.js'1459 assert.strictEqual(value.outputFiles[0].path, path.join(outdir, outputA))1460 assert.strictEqual(value.outputFiles[1].path, path.join(outdir, outputB))1461 assert.strictEqual(value.outputFiles[2].path, path.join(outdir, chunk))1462 },1463 async splittingWithChunkPathAndCrossChunkImportsIssue899({ esbuild, testDir }) {1464 const entry1 = path.join(testDir, 'src', 'entry1.js')1465 const entry2 = path.join(testDir, 'src', 'entry2.js')1466 const entry3 = path.join(testDir, 'src', 'entry3.js')1467 const shared1 = path.join(testDir, 'src', 'shared1.js')1468 const shared2 = path.join(testDir, 'src', 'shared2.js')1469 const shared3 = path.join(testDir, 'src', 'shared3.js')1470 await mkdirAsync(path.join(testDir, 'src')).catch(x => x)1471 await writeFileAsync(entry1, `1472 import { shared1 } from './shared1';1473 import { shared2 } from './shared2';1474 export default async function() {1475 return shared1() + shared2();1476 }1477 `)1478 await writeFileAsync(entry2, `1479 import { shared2 } from './shared2';1480 import { shared3 } from './shared3';1481 export default async function() {1482 return shared2() + shared3();1483 }1484 `)1485 await writeFileAsync(entry3, `1486 import { shared3 } from './shared3';1487 import { shared1 } from './shared1';1488 export default async function() {1489 return shared3() + shared1();1490 }1491 `)1492 await writeFileAsync(shared1, `1493 import { shared2 } from './shared2';1494 export function shared1() {1495 return shared2().replace('2', '1');1496 }1497 `)1498 await writeFileAsync(shared2, `1499 import { shared3 } from './shared3'1500 export function shared2() {1501 return 'shared2';1502 }1503 `)1504 await writeFileAsync(shared3, `1505 export function shared3() {1506 return 'shared3';1507 }1508 `)1509 const outdir = path.join(testDir, 'out')1510 await esbuild.build({1511 entryPoints: [entry1, entry2, entry3],1512 bundle: true,1513 outdir,1514 format: 'esm',1515 splitting: true,1516 outExtension: { '.js': '.mjs' },1517 chunkNames: 'chunks/[hash]/[name]',1518 })1519 // This needs to use relative paths to avoid breaking on Windows.1520 // Importing by absolute path doesn't work on Windows in node.1521 const result1 = await import('./' + path.relative(__dirname, path.join(outdir, 'entry1.mjs')))1522 const result2 = await import('./' + path.relative(__dirname, path.join(outdir, 'entry2.mjs')))1523 const result3 = await import('./' + path.relative(__dirname, path.join(outdir, 'entry3.mjs')))1524 assert.strictEqual(await result1.default(), 'shared1shared2');1525 assert.strictEqual(await result2.default(), 'shared2shared3');1526 assert.strictEqual(await result3.default(), 'shared3shared1');1527 },1528 async splittingStaticImportHashChange({ esbuild, testDir }) {1529 const input1 = path.join(testDir, 'a', 'in1.js')1530 const input2 = path.join(testDir, 'b', 'in2.js')1531 const outdir = path.join(testDir, 'out')1532 await mkdirAsync(path.dirname(input1), { recursive: true })1533 await mkdirAsync(path.dirname(input2), { recursive: true })1534 await writeFileAsync(input1, `import ${JSON.stringify(input2)}`)1535 await writeFileAsync(input2, `console.log(123)`)1536 const result1 = await esbuild.build({1537 entryPoints: [input1, input2],1538 bundle: true,1539 outdir,1540 format: 'esm',1541 splitting: true,1542 write: false,1543 entryNames: '[name]-[hash]',1544 })1545 await writeFileAsync(input2, `console.log(321)`)1546 const result2 = await esbuild.build({1547 entryPoints: [input1, input2],1548 bundle: true,1549 outdir,1550 format: 'esm',1551 splitting: true,1552 write: false,1553 entryNames: '[name]-[hash]',1554 })1555 assert.strictEqual(result1.outputFiles.length, 3)1556 assert.strictEqual(result2.outputFiles.length, 3)1557 // The hashes of both output files must change. Previously there was a bug1558 // where hash changes worked for static imports but not for dynamic imports.1559 for (const { path: oldPath } of result1.outputFiles)1560 for (const { path: newPath } of result2.outputFiles)1561 assert.notStrictEqual(oldPath, newPath)1562 },1563 async splittingDynamicImportHashChangeIssue1076({ esbuild, testDir }) {1564 const input1 = path.join(testDir, 'a', 'in1.js')1565 const input2 = path.join(testDir, 'b', 'in2.js')1566 const outdir = path.join(testDir, 'out')1567 await mkdirAsync(path.dirname(input1), { recursive: true })1568 await mkdirAsync(path.dirname(input2), { recursive: true })1569 await writeFileAsync(input1, `import(${JSON.stringify(input2)})`)1570 await writeFileAsync(input2, `console.log(123)`)1571 const result1 = await esbuild.build({1572 entryPoints: [input1],1573 bundle: true,1574 outdir,1575 format: 'esm',1576 splitting: true,1577 write: false,1578 entryNames: '[name]-[hash]',1579 })1580 await writeFileAsync(input2, `console.log(321)`)1581 const result2 = await esbuild.build({1582 entryPoints: [input1],1583 bundle: true,1584 outdir,1585 format: 'esm',1586 splitting: true,1587 write: false,1588 entryNames: '[name]-[hash]',1589 })1590 assert.strictEqual(result1.outputFiles.length, 2)1591 assert.strictEqual(result2.outputFiles.length, 2)1592 // The hashes of both output files must change. Previously there was a bug1593 // where hash changes worked for static imports but not for dynamic imports.1594 for (const { path: oldPath } of result1.outputFiles)1595 for (const { path: newPath } of result2.outputFiles)1596 assert.notStrictEqual(oldPath, newPath)1597 },1598 async stdinStdoutBundle({ esbuild, testDir }) {1599 const auxiliary = path.join(testDir, 'auxiliary.js')1600 await writeFileAsync(auxiliary, 'export default 123')1601 const value = await esbuild.build({1602 stdin: {1603 contents: `1604 import x from './auxiliary.js'1605 console.log(x)1606 `,1607 resolveDir: testDir,1608 },1609 bundle: true,1610 write: false,1611 })1612 assert.strictEqual(value.outputFiles.length, 1)1613 assert.strictEqual(value.outputFiles[0].path, '<stdout>')1614 assert.strictEqual(Buffer.from(value.outputFiles[0].contents).toString(), `(() => {1615 // scripts/.js-api-tests/stdinStdoutBundle/auxiliary.js1616 var auxiliary_default = 123;1617 // <stdin>1618 console.log(auxiliary_default);1619})();1620`)1621 },1622 async stdinOutfileBundle({ esbuild, testDir }) {1623 const auxiliary = path.join(testDir, 'auxiliary.js')1624 const outfile = path.join(testDir, 'out.js')1625 await writeFileAsync(auxiliary, 'export default 123')1626 const value = await esbuild.build({1627 stdin: {1628 contents: `1629 import x from './auxiliary.js'1630 export {x as fromStdin}1631 `,1632 resolveDir: testDir,1633 },1634 bundle: true,1635 outfile,1636 format: 'cjs',1637 })1638 assert.strictEqual(value.outputFiles, void 0)1639 const result = require(outfile)1640 assert.strictEqual(result.fromStdin, 123)1641 },1642 async stdinAndEntryBundle({ esbuild, testDir }) {1643 const srcDir = path.join(testDir, 'src')1644 const entry = path.join(srcDir, 'entry.js')1645 const auxiliary = path.join(srcDir, 'auxiliary.js')1646 const outdir = path.join(testDir, 'out')1647 await mkdirAsync(srcDir)1648 await writeFileAsync(auxiliary, 'export default 123')1649 await writeFileAsync(entry, `1650 import x from './auxiliary.js'1651 export let fromEntry = x1652 `)1653 const value = await esbuild.build({1654 entryPoints: [entry],1655 stdin: {1656 contents: `1657 import x from './src/auxiliary.js'1658 export {x as fromStdin}1659 `,1660 resolveDir: testDir,1661 },1662 bundle: true,1663 outdir,1664 format: 'cjs',1665 })1666 assert.strictEqual(value.outputFiles, void 0)1667 const entryResult = require(path.join(outdir, path.basename(entry)))1668 assert.strictEqual(entryResult.fromEntry, 123)1669 const stdinResult = require(path.join(outdir, path.basename('stdin.js')))1670 assert.strictEqual(stdinResult.fromStdin, 123)1671 },1672 async forceTsConfig({ esbuild, testDir }) {1673 // ./tsconfig.json1674 // ./a/forced-config.json1675 // ./a/b/test-impl.js1676 // ./a/b/c/in.js1677 const aDir = path.join(testDir, 'a')1678 const bDir = path.join(aDir, 'b')1679 const cDir = path.join(bDir, 'c')1680 await mkdirAsync(aDir).catch(x => x)1681 await mkdirAsync(bDir).catch(x => x)1682 await mkdirAsync(cDir).catch(x => x)1683 const input = path.join(cDir, 'in.js')1684 const forced = path.join(bDir, 'test-impl.js')1685 const tsconfigIgnore = path.join(testDir, 'tsconfig.json')1686 const tsconfigForced = path.join(aDir, 'forced-config.json')1687 const output = path.join(testDir, 'out.js')1688 await writeFileAsync(input, 'import "test"')1689 await writeFileAsync(forced, 'console.log("success")')1690 await writeFileAsync(tsconfigIgnore, '{"compilerOptions": {"baseUrl": "./a", "paths": {"test": ["./ignore.js"]}}}')1691 await writeFileAsync(tsconfigForced, '{"compilerOptions": {"baseUrl": "./b", "paths": {"test": ["./test-impl.js"]}}}')1692 await esbuild.build({1693 entryPoints: [input],1694 bundle: true,1695 outfile: output,1696 tsconfig: tsconfigForced,1697 format: 'esm',1698 })1699 const result = await readFileAsync(output, 'utf8')1700 assert.strictEqual(result, `// scripts/.js-api-tests/forceTsConfig/a/b/test-impl.js1701console.log("success");1702`)1703 },1704 async es5({ esbuild, testDir }) {1705 const input = path.join(testDir, 'in.js')1706 const cjs = path.join(testDir, 'cjs.js')1707 const esm = path.join(testDir, 'esm.js')1708 const output = path.join(testDir, 'out.js')1709 await writeFileAsync(input, `1710 export {foo} from "./cjs"1711 export * as bar from "./esm"1712 `)1713 await writeFileAsync(cjs, 'exports.foo = 123')1714 await writeFileAsync(esm, 'export var foo = 123')1715 const value = await esbuild.build({1716 entryPoints: [input],1717 bundle: true,1718 outfile: output,1719 format: 'cjs',1720 target: 'es5',1721 })1722 assert.strictEqual(value.outputFiles, void 0)1723 const result = require(output)1724 assert.strictEqual(result.foo, 123)1725 assert.strictEqual(result.bar.foo, 123)1726 assert.strictEqual(result.__esModule, true)1727 const contents = await readFileAsync(output, 'utf8')1728 assert.strictEqual(contents.indexOf('=>'), -1)1729 assert.strictEqual(contents.indexOf('const'), -1)1730 },1731 async outbaseImplicit({ esbuild, testDir }) {1732 const outbase = path.join(testDir, 'pages', 'a')1733 const b = path.join(outbase, 'b', 'index.js')1734 const c = path.join(outbase, 'c', 'index.js')1735 const outdir = path.join(testDir, 'outdir')1736 await mkdirAsync(path.dirname(b), { recursive: true })1737 await mkdirAsync(path.dirname(c), { recursive: true })1738 await writeFileAsync(b, 'module.exports = "b"')1739 await writeFileAsync(c, 'module.exports = "c"')1740 await esbuild.build({1741 entryPoints: [1742 path.relative(process.cwd(), b),1743 path.relative(process.cwd(), c),1744 ],1745 outdir,1746 format: 'cjs',1747 })1748 const outB = path.join(outdir, path.relative(outbase, b))1749 const outC = path.join(outdir, path.relative(outbase, c))1750 assert.strictEqual(require(outB), 'b')1751 assert.strictEqual(require(outC), 'c')1752 },1753 async outbaseRelPath({ esbuild, testDir }) {1754 const outbase = path.join(testDir, 'pages')1755 const b = path.join(outbase, 'a', 'b', 'index.js')1756 const c = path.join(outbase, 'a', 'c', 'index.js')1757 const outdir = path.join(testDir, 'outdir')1758 await mkdirAsync(path.dirname(b), { recursive: true })1759 await mkdirAsync(path.dirname(c), { recursive: true })1760 await writeFileAsync(b, 'module.exports = "b"')1761 await writeFileAsync(c, 'module.exports = "c"')1762 await esbuild.build({1763 entryPoints: [1764 path.relative(process.cwd(), b),1765 path.relative(process.cwd(), c),1766 ],1767 outdir,1768 outbase,1769 format: 'cjs',1770 })1771 const outB = path.join(outdir, path.relative(outbase, b))1772 const outC = path.join(outdir, path.relative(outbase, c))1773 assert.strictEqual(require(outB), 'b')1774 assert.strictEqual(require(outC), 'c')1775 },1776 async outbaseAbsPath({ esbuild, testDir }) {1777 const outbase = path.join(testDir, 'pages')1778 const b = path.join(outbase, 'a', 'b', 'index.js')1779 const c = path.join(outbase, 'a', 'c', 'index.js')1780 const outdir = path.join(testDir, 'outdir')1781 await mkdirAsync(path.dirname(b), { recursive: true })1782 await mkdirAsync(path.dirname(c), { recursive: true })1783 await writeFileAsync(b, 'module.exports = "b"')1784 await writeFileAsync(c, 'module.exports = "c"')1785 await esbuild.build({1786 entryPoints: [b, c],1787 outdir,1788 outbase,1789 format: 'cjs',1790 })1791 const outB = path.join(outdir, path.relative(outbase, b))1792 const outC = path.join(outdir, path.relative(outbase, c))1793 assert.strictEqual(require(outB), 'b')1794 assert.strictEqual(require(outC), 'c')1795 },1796 async bundleTreeShakingDefault({ esbuild }) {1797 const { outputFiles } = await esbuild.build({1798 stdin: {1799 contents: `1800 let removeMe1 = /* @__PURE__ */ fn();1801 let removeMe2 = <div/>;1802 `,1803 loader: 'jsx',1804 },1805 write: false,1806 bundle: true,1807 })1808 assert.strictEqual(outputFiles[0].text, `(() => {\n})();\n`)1809 },1810 async bundleTreeShakingTrue({ esbuild }) {1811 const { outputFiles } = await esbuild.build({1812 stdin: {1813 contents: `1814 let removeMe1 = /* @__PURE__ */ fn();1815 let removeMe2 = <div/>;1816 `,1817 loader: 'jsx',1818 },1819 write: false,1820 bundle: true,1821 treeShaking: true,1822 })1823 assert.strictEqual(outputFiles[0].text, `(() => {\n})();\n`)1824 },1825 async bundleTreeShakingIgnoreAnnotations({ esbuild }) {1826 const { outputFiles } = await esbuild.build({1827 stdin: {1828 contents: `1829 let keepMe1 = /* @__PURE__ */ fn();1830 let keepMe2 = <div/>;1831 `,1832 loader: 'jsx',1833 },1834 write: false,1835 bundle: true,1836 ignoreAnnotations: true,1837 })1838 assert.strictEqual(outputFiles[0].text, `(() => {1839 // <stdin>1840 var keepMe1 = fn();1841 var keepMe2 = React.createElement("div", null);1842})();1843`)1844 },1845 async externalWithWildcard({ esbuild }) {1846 const { outputFiles } = await esbuild.build({1847 stdin: {1848 contents: `require('/assets/file.png')`,1849 },1850 write: false,1851 bundle: true,1852 external: ['/assets/*.png'],1853 platform: 'node',1854 })1855 assert.strictEqual(outputFiles[0].text, `// <stdin>1856require("/assets/file.png");1857`)1858 },1859 async errorInvalidExternalWithTwoWildcards({ esbuild }) {1860 try {1861 await esbuild.build({1862 entryPoints: ['in.js'],1863 external: ['a*b*c'],1864 write: false,1865 logLevel: 'silent',1866 })1867 throw new Error('Expected build failure');1868 } catch (e) {1869 if (e.message !== 'Build failed with 1 error:\nerror: External path "a*b*c" cannot have more than one "*" wildcard') {1870 throw e;1871 }1872 }1873 },1874 async jsBannerBuild({ esbuild, testDir }) {1875 const input = path.join(testDir, 'in.js')1876 const outfile = path.join(testDir, 'out.js')1877 await writeFileAsync(input, `if (!bannerDefined) throw 'fail'`)1878 await esbuild.build({1879 entryPoints: [input],1880 outfile,1881 banner: { js: 'const bannerDefined = true' },1882 })1883 require(outfile)1884 },1885 async jsFooterBuild({ esbuild, testDir }) {1886 const input = path.join(testDir, 'in.js')1887 const outfile = path.join(testDir, 'out.js')1888 await writeFileAsync(input, `footer()`)1889 await esbuild.build({1890 entryPoints: [input],1891 outfile,1892 footer: { js: 'function footer() {}' },1893 })1894 require(outfile)1895 },1896 async jsBannerFooterBuild({ esbuild, testDir }) {1897 const aPath = path.join(testDir, 'a.js')1898 const bPath = path.join(testDir, 'b.js')1899 const outdir = path.join(testDir, 'out')1900 await writeFileAsync(aPath, `module.exports = { banner: bannerDefined, footer };`)1901 await writeFileAsync(bPath, `module.exports = { banner: bannerDefined, footer };`)1902 await esbuild.build({1903 entryPoints: [aPath, bPath],1904 outdir,1905 banner: { js: 'const bannerDefined = true' },1906 footer: { js: 'function footer() {}' },1907 })1908 const a = require(path.join(outdir, path.basename(aPath)))1909 const b = require(path.join(outdir, path.basename(bPath)))1910 if (!a.banner || !b.banner) throw 'fail'1911 a.footer()1912 b.footer()1913 },1914 async cssBannerFooterBuild({ esbuild, testDir }) {1915 const input = path.join(testDir, 'in.css')1916 const outfile = path.join(testDir, 'out.css')1917 await writeFileAsync(input, `div { color: red }`)1918 await esbuild.build({1919 entryPoints: [input],1920 outfile,1921 banner: { css: '/* banner */' },1922 footer: { css: '/* footer */' },1923 })1924 const code = await readFileAsync(outfile, 'utf8')1925 assert.strictEqual(code, `/* banner */\ndiv {\n color: red;\n}\n/* footer */\n`)1926 },1927 async buildRelativeIssue693({ esbuild }) {1928 const result = await esbuild.build({1929 stdin: {1930 contents: `const x=1`,1931 },1932 write: false,1933 outfile: 'esbuild.js',1934 });1935 assert.strictEqual(result.outputFiles.length, 1)1936 assert.strictEqual(result.outputFiles[0].path, path.join(process.cwd(), 'esbuild.js'))1937 assert.strictEqual(result.outputFiles[0].text, 'const x = 1;\n')1938 },1939 async noRebuild({ esbuild, testDir }) {1940 const input = path.join(testDir, 'in.js')1941 const output = path.join(testDir, 'out.js')1942 await writeFileAsync(input, `console.log('abc')`)1943 const result1 = await esbuild.build({1944 entryPoints: [input],1945 outfile: output,1946 format: 'esm',1947 incremental: false,1948 })1949 assert.strictEqual(result1.outputFiles, void 0)1950 assert.strictEqual(await readFileAsync(output, 'utf8'), `console.log("abc");\n`)1951 assert.strictEqual(result1.rebuild, void 0)1952 },1953 async rebuildBasic({ esbuild, testDir }) {1954 const input = path.join(testDir, 'in.js')1955 const output = path.join(testDir, 'out.js')1956 // Build 11957 await writeFileAsync(input, `console.log('abc')`)1958 const result1 = await esbuild.build({1959 entryPoints: [input],1960 outfile: output,1961 format: 'esm',1962 incremental: true,1963 })1964 assert.strictEqual(result1.outputFiles, void 0)1965 assert.strictEqual(await readFileAsync(output, 'utf8'), `console.log("abc");\n`)1966 // Build 21967 await writeFileAsync(input, `console.log('xyz')`)1968 const result2 = await result1.rebuild();1969 assert.strictEqual(result2.rebuild, result1.rebuild)1970 assert.strictEqual(result2.outputFiles, void 0)1971 assert.strictEqual(await readFileAsync(output, 'utf8'), `console.log("xyz");\n`)1972 // Build 31973 await writeFileAsync(input, `console.log(123)`)1974 const result3 = await result1.rebuild();1975 assert.strictEqual(result3.rebuild, result1.rebuild)1976 assert.strictEqual(result3.outputFiles, void 0)1977 assert.strictEqual(await readFileAsync(output, 'utf8'), `console.log(123);\n`)1978 // Further rebuilds should not be possible after a dispose1979 result1.rebuild.dispose()1980 try {1981 await result1.rebuild()1982 throw new Error('Expected an error to be thrown')1983 } catch (e) {1984 assert.strictEqual(e.message, 'Cannot rebuild')1985 }1986 },1987 async rebuildIndependent({ esbuild, testDir }) {1988 const inputA = path.join(testDir, 'in-a.js')1989 const inputB = path.join(testDir, 'in-b.js')1990 const outputA = path.join(testDir, 'out-a.js')1991 const outputB = path.join(testDir, 'out-b.js')1992 // Build 11993 await writeFileAsync(inputA, `console.log('a')`)1994 await writeFileAsync(inputB, `console.log('b')`)1995 const resultA1 = await esbuild.build({1996 entryPoints: [inputA],1997 outfile: outputA,1998 format: 'esm',1999 incremental: true,2000 })2001 const resultB1 = await esbuild.build({2002 entryPoints: [inputB],2003 outfile: outputB,2004 format: 'esm',2005 incremental: true,2006 })2007 assert.notStrictEqual(resultA1.rebuild, resultB1.rebuild)2008 assert.strictEqual(resultA1.outputFiles, void 0)2009 assert.strictEqual(resultB1.outputFiles, void 0)2010 assert.strictEqual(await readFileAsync(outputA, 'utf8'), `console.log("a");\n`)2011 assert.strictEqual(await readFileAsync(outputB, 'utf8'), `console.log("b");\n`)2012 // Build 22013 await writeFileAsync(inputA, `console.log(1)`)2014 await writeFileAsync(inputB, `console.log(2)`)2015 const promiseA = resultA1.rebuild();2016 const promiseB = resultB1.rebuild();2017 const resultA2 = await promiseA;2018 const resultB2 = await promiseB;2019 assert.strictEqual(resultA2.rebuild, resultA1.rebuild)2020 assert.strictEqual(resultB2.rebuild, resultB1.rebuild)2021 assert.strictEqual(resultA2.outputFiles, void 0)2022 assert.strictEqual(resultB2.outputFiles, void 0)2023 assert.strictEqual(await readFileAsync(outputA, 'utf8'), `console.log(1);\n`)2024 assert.strictEqual(await readFileAsync(outputB, 'utf8'), `console.log(2);\n`)2025 // Further rebuilds should not be possible after a dispose2026 resultA1.rebuild.dispose()2027 try {2028 await resultA1.rebuild()2029 throw new Error('Expected an error to be thrown')2030 } catch (e) {2031 assert.strictEqual(e.message, 'Cannot rebuild')2032 }2033 // Build 32034 await writeFileAsync(inputB, `console.log(3)`)2035 const resultB3 = await resultB1.rebuild()2036 assert.strictEqual(resultB3.rebuild, resultB1.rebuild)2037 assert.strictEqual(resultB3.outputFiles, void 0)2038 assert.strictEqual(await readFileAsync(outputB, 'utf8'), `console.log(3);\n`)2039 // Further rebuilds should not be possible after a dispose2040 resultB1.rebuild.dispose()2041 try {2042 await resultB1.rebuild()2043 throw new Error('Expected an error to be thrown')2044 } catch (e) {2045 assert.strictEqual(e.message, 'Cannot rebuild')2046 }2047 },2048 async rebuildParallel({ esbuild, testDir }) {2049 const input = path.join(testDir, 'in.js')2050 const output = path.join(testDir, 'out.js')2051 // Build 12052 await writeFileAsync(input, `console.log('abc')`)2053 const result1 = await esbuild.build({2054 entryPoints: [input],2055 outfile: output,2056 format: 'esm',2057 incremental: true,2058 })2059 assert.strictEqual(result1.outputFiles, void 0)2060 assert.strictEqual(await readFileAsync(output, 'utf8'), `console.log("abc");\n`)2061 // Build 22062 await writeFileAsync(input, `console.log('xyz')`)2063 const promise2A = result1.rebuild();2064 const promise2B = result1.rebuild();2065 const result2A = await promise2A;2066 const result2B = await promise2B;2067 assert.strictEqual(result2A.rebuild, result1.rebuild)2068 assert.strictEqual(result2B.rebuild, result1.rebuild)2069 assert.strictEqual(result2A.outputFiles, void 0)2070 assert.strictEqual(result2B.outputFiles, void 0)2071 assert.strictEqual(await readFileAsync(output, 'utf8'), `console.log("xyz");\n`)2072 // Build 32073 await writeFileAsync(input, `console.log(123)`)2074 const promise3A = result1.rebuild();2075 const promise3B = result1.rebuild();2076 const result3A = await promise3A;2077 const result3B = await promise3B;2078 assert.strictEqual(result3A.rebuild, result1.rebuild)2079 assert.strictEqual(result3B.rebuild, result1.rebuild)2080 assert.strictEqual(result3A.outputFiles, void 0)2081 assert.strictEqual(result3B.outputFiles, void 0)2082 assert.strictEqual(await readFileAsync(output, 'utf8'), `console.log(123);\n`)2083 // Further rebuilds should not be possible after a dispose2084 result1.rebuild.dispose()2085 try {2086 await result1.rebuild()2087 throw new Error('Expected an error to be thrown')2088 } catch (e) {2089 assert.strictEqual(e.message, 'Cannot rebuild')2090 }2091 },2092 async bundleAvoidTDZ({ esbuild }) {2093 var { outputFiles } = await esbuild.build({2094 stdin: {2095 contents: `2096 class Foo {2097 // The above line will be transformed into "var". However, the2098 // symbol "Foo" must still be defined before the class body ends.2099 static foo = new Foo2100 }2101 if (!(Foo.foo instanceof Foo))2102 throw 'fail'2103 `,2104 },2105 bundle: true,2106 write: false,2107 })2108 assert.strictEqual(outputFiles.length, 1)2109 new Function(outputFiles[0].text)()2110 },2111 async bundleTSAvoidTDZ({ esbuild }) {2112 var { outputFiles } = await esbuild.build({2113 stdin: {2114 contents: `2115 class Foo {2116 // The above line will be transformed into "var". However, the2117 // symbol "Foo" must still be defined before the class body ends.2118 static foo = new Foo2119 }2120 if (!(Foo.foo instanceof Foo))2121 throw 'fail'2122 `,2123 loader: 'ts',2124 },2125 bundle: true,2126 write: false,2127 })2128 assert.strictEqual(outputFiles.length, 1)2129 new Function(outputFiles[0].text)()2130 },2131 async bundleTSDecoratorAvoidTDZ({ esbuild }) {2132 var { outputFiles } = await esbuild.build({2133 stdin: {2134 contents: `2135 class Bar {}2136 var oldFoo2137 function swap(target) {2138 oldFoo = target2139 return Bar2140 }2141 @swap2142 class Foo {2143 bar() { return new Foo }2144 static foo = new Foo2145 }2146 if (!(oldFoo.foo instanceof oldFoo))2147 throw 'fail: foo'2148 if (!(oldFoo.foo.bar() instanceof Bar))2149 throw 'fail: bar'2150 `,2151 loader: 'ts',2152 },2153 bundle: true,2154 write: false,2155 })2156 assert.strictEqual(outputFiles.length, 1)2157 new Function(outputFiles[0].text)()2158 },2159 async automaticEntryPointOutputPathsWithDot({ esbuild, testDir }) {2160 const input = path.join(testDir, 'in.file.ts')2161 const css = path.join(testDir, 'file.css')2162 await writeFileAsync(input, `import './file.css'; console.log('test')`)2163 await writeFileAsync(css, `body { color: red }`)2164 var { outputFiles } = await esbuild.build({2165 entryPoints: [input],2166 outdir: testDir,2167 bundle: true,2168 write: false,2169 })2170 assert.strictEqual(outputFiles.length, 2)2171 assert.strictEqual(outputFiles[0].path, path.join(testDir, 'in.file.js'))2172 assert.strictEqual(outputFiles[1].path, path.join(testDir, 'in.file.css'))2173 },2174 async customEntryPointOutputPathsWithDot({ esbuild, testDir }) {2175 const input = path.join(testDir, 'in.file.ts')2176 const css = path.join(testDir, 'file.css')2177 await writeFileAsync(input, `import './file.css'; console.log('test')`)2178 await writeFileAsync(css, `body { color: red }`)2179 var { outputFiles } = await esbuild.build({2180 entryPoints: {2181 'out.test': input,2182 },2183 outdir: testDir,2184 bundle: true,2185 write: false,2186 })2187 assert.strictEqual(outputFiles.length, 2)2188 assert.strictEqual(outputFiles[0].path, path.join(testDir, 'out.test.js'))2189 assert.strictEqual(outputFiles[1].path, path.join(testDir, 'out.test.css'))2190 },2191 async customEntryPointOutputPathsRel({ esbuild, testDir }) {2192 const input1 = path.join(testDir, 'in1.js')2193 const input2 = path.join(testDir, 'in2.js')2194 const output1 = 'out/1.cjs'2195 const output2 = 'out/2.mjs'2196 await writeFileAsync(input1, `console.log('in1')`)2197 await writeFileAsync(input2, `console.log('in2')`)2198 var { outputFiles } = await esbuild.build({2199 entryPoints: {2200 [output1]: input1,2201 [output2]: input2,2202 },2203 entryNames: 'entry/[dir]/[hash]-[name]',2204 outdir: testDir,2205 write: false,2206 })2207 assert.strictEqual(outputFiles.length, 2)2208 assert.strictEqual(outputFiles[0].path, path.join(testDir, 'entry', 'out', 'CXHWNMAN-1.cjs.js'))2209 assert.strictEqual(outputFiles[1].path, path.join(testDir, 'entry', 'out', 'EYSNILNO-2.mjs.js'))2210 },2211 async customEntryPointOutputPathsAbs({ esbuild, testDir }) {2212 const input1 = path.join(testDir, 'in1.js')2213 const input2 = path.join(testDir, 'in2.js')2214 const output1 = path.join(testDir, 'out/1')2215 const output2 = path.join(testDir, 'out/2')2216 await writeFileAsync(input1, `console.log('in1')`)2217 await writeFileAsync(input2, `console.log('in2')`)2218 var { outputFiles } = await esbuild.build({2219 entryPoints: {2220 [output1]: input1,2221 [output2]: input2,2222 },2223 entryNames: 'entry/[dir]/[hash]-[name]',2224 outdir: testDir,2225 write: false,2226 })2227 assert.strictEqual(outputFiles.length, 2)2228 assert.strictEqual(outputFiles[0].path, path.join(testDir, 'entry', 'out', 'TIORPBNU-1.js'))2229 assert.strictEqual(outputFiles[1].path, path.join(testDir, 'entry', 'out', '3KY7NOSR-2.js'))2230 },2231}2232function fetch(host, port, path, headers) {2233 return new Promise((resolve, reject) => {2234 http.get({ host, port, path, headers }, res => {2235 const chunks = []2236 res.on('data', chunk => chunks.push(chunk))2237 res.on('end', () => {2238 const content = Buffer.concat(chunks)2239 if (res.statusCode < 200 || res.statusCode > 299)2240 reject(new Error(`${res.statusCode} when fetching ${path}: ${content}`))2241 else {2242 content.headers = res.headers2243 resolve(content)2244 }2245 })2246 }).on('error', reject)2247 })2248}2249let watchTests = {2250 async watchEditSession({ esbuild, testDir }) {2251 const srcDir = path.join(testDir, 'src')2252 const outfile = path.join(testDir, 'out.js')2253 const input = path.join(srcDir, 'in.js')2254 await mkdirAsync(srcDir, { recursive: true })2255 await writeFileAsync(input, `throw 1`)2256 let onRebuild = () => { }2257 const result = await esbuild.build({2258 entryPoints: [input],2259 outfile,2260 format: 'esm',2261 logLevel: 'silent',2262 watch: {2263 onRebuild: (...args) => onRebuild(args),2264 },2265 })2266 const rebuildUntil = (mutator, condition) => {2267 let timeout2268 return new Promise((resolve, reject) => {2269 timeout = setTimeout(() => reject(new Error('Timeout after 30 seconds')), 30 * 1000)2270 onRebuild = args => {2271 try { if (condition(...args)) clearTimeout(timeout), resolve(args) }2272 catch (e) { clearTimeout(timeout), reject(e) }2273 }2274 mutator()2275 })2276 }2277 try {2278 assert.strictEqual(result.outputFiles, void 0)2279 assert.strictEqual(typeof result.stop, 'function')2280 assert.strictEqual(await readFileAsync(outfile, 'utf8'), 'throw 1;\n')2281 // First rebuild: edit2282 {2283 const [error2, result2] = await rebuildUntil(2284 () => writeFileAtomic(input, `throw 2`),2285 () => fs.readFileSync(outfile, 'utf8') === 'throw 2;\n',2286 )2287 assert.strictEqual(error2, null)2288 assert.strictEqual(result2.outputFiles, void 0)2289 assert.strictEqual(result2.stop, result.stop)2290 }2291 // Second rebuild: edit2292 {2293 const [error2, result2] = await rebuildUntil(2294 () => writeFileAtomic(input, `throw 3`),2295 () => fs.readFileSync(outfile, 'utf8') === 'throw 3;\n',2296 )2297 assert.strictEqual(error2, null)2298 assert.strictEqual(result2.outputFiles, void 0)2299 assert.strictEqual(result2.stop, result.stop)2300 }2301 // Third rebuild: syntax error2302 {2303 const [error2, result2] = await rebuildUntil(2304 () => writeFileAtomic(input, `throw 1 2`),2305 err => err,2306 )2307 assert.notStrictEqual(error2, null)2308 assert(error2.message.startsWith('Build failed with 1 error'))2309 assert.strictEqual(error2.errors.length, 1)2310 assert.strictEqual(error2.errors[0].text, 'Expected ";" but found "2"')2311 assert.strictEqual(result2, null)2312 assert.strictEqual(await readFileAsync(outfile, 'utf8'), 'throw 3;\n')2313 }2314 // Fourth rebuild: edit2315 {2316 const [error2, result2] = await rebuildUntil(2317 () => writeFileAtomic(input, `throw 4`),2318 () => fs.readFileSync(outfile, 'utf8') === 'throw 4;\n',2319 )2320 assert.strictEqual(error2, null)2321 assert.strictEqual(result2.outputFiles, void 0)2322 assert.strictEqual(result2.stop, result.stop)2323 }2324 // Fifth rebuild: delete2325 {2326 const [error2, result2] = await rebuildUntil(2327 () => fs.promises.unlink(input),2328 err => err,2329 )2330 assert.notStrictEqual(error2, null)2331 assert(error2.message.startsWith('Build failed with 1 error'))2332 assert.strictEqual(error2.errors.length, 1)2333 assert.strictEqual(result2, null)2334 assert.strictEqual(await readFileAsync(outfile, 'utf8'), 'throw 4;\n')2335 }2336 // Sixth rebuild: restore2337 {2338 const [error2, result2] = await rebuildUntil(2339 () => writeFileAtomic(input, `throw 5`),2340 () => fs.readFileSync(outfile, 'utf8') === 'throw 5;\n',2341 )2342 assert.strictEqual(error2, null)2343 assert.strictEqual(result2.outputFiles, void 0)2344 assert.strictEqual(result2.stop, result.stop)2345 assert.strictEqual(await readFileAsync(outfile, 'utf8'), 'throw 5;\n')2346 }2347 } finally {2348 result.stop()2349 }2350 },2351 async watchWriteFalse({ esbuild, testDir }) {2352 const srcDir = path.join(testDir, 'src')2353 const outdir = path.join(testDir, 'out')2354 const input = path.join(srcDir, 'in.js')2355 const output = path.join(outdir, 'in.js')2356 await mkdirAsync(srcDir, { recursive: true })2357 await writeFileAsync(input, `throw 1`)2358 let onRebuild = () => { }2359 const result = await esbuild.build({2360 entryPoints: [input],2361 outdir,2362 format: 'esm',2363 logLevel: 'silent',2364 write: false,2365 watch: {2366 onRebuild: (...args) => onRebuild(args),2367 },2368 })2369 const rebuildUntil = (mutator, condition) => {2370 let timeout2371 return new Promise((resolve, reject) => {2372 timeout = setTimeout(() => reject(new Error('Timeout after 30 seconds')), 30 * 1000)2373 onRebuild = args => {2374 try { if (condition(...args)) clearTimeout(timeout), resolve(args) }2375 catch (e) { clearTimeout(timeout), reject(e) }2376 }2377 mutator()2378 })2379 }2380 try {2381 assert.strictEqual(result.outputFiles.length, 1)2382 assert.strictEqual(result.outputFiles[0].text, 'throw 1;\n')2383 assert.strictEqual(typeof result.stop, 'function')2384 assert.strictEqual(fs.existsSync(output), false)2385 // First rebuild: edit2386 {2387 const [error2, result2] = await rebuildUntil(2388 () => writeFileAtomic(input, `throw 2`),2389 (err, res) => res.outputFiles[0].text === 'throw 2;\n',2390 )2391 assert.strictEqual(error2, null)2392 assert.strictEqual(result2.stop, result.stop)2393 assert.strictEqual(fs.existsSync(output), false)2394 }2395 // Second rebuild: edit2396 {2397 const [error2, result2] = await rebuildUntil(2398 () => writeFileAtomic(input, `throw 3`),2399 (err, res) => res.outputFiles[0].text === 'throw 3;\n',2400 )2401 assert.strictEqual(error2, null)2402 assert.strictEqual(result2.stop, result.stop)2403 assert.strictEqual(fs.existsSync(output), false)2404 }2405 } finally {2406 result.stop()2407 }2408 },2409}2410let serveTests = {2411 async serveBasic({ esbuild, testDir }) {2412 const input = path.join(testDir, 'in.js')2413 await writeFileAsync(input, `console.log(123)`)2414 let onRequest;2415 let singleRequestPromise = new Promise(resolve => {2416 onRequest = resolve;2417 });2418 const result = await esbuild.serve({2419 host: '127.0.0.1',2420 onRequest,2421 }, {2422 entryPoints: [input],2423 format: 'esm',2424 })2425 assert.strictEqual(result.host, '127.0.0.1');2426 assert.strictEqual(typeof result.port, 'number');2427 const buffer = await fetch(result.host, result.port, '/in.js')2428 assert.strictEqual(buffer.toString(), `console.log(123);\n`);2429 let singleRequest = await singleRequestPromise;2430 assert.strictEqual(singleRequest.method, 'GET');2431 assert.strictEqual(singleRequest.path, '/in.js');2432 assert.strictEqual(singleRequest.status, 200);2433 assert.strictEqual(typeof singleRequest.remoteAddress, 'string');2434 assert.strictEqual(typeof singleRequest.timeInMS, 'number');2435 result.stop();2436 await result.wait;2437 },2438 async serveOutfile({ esbuild, testDir }) {2439 const input = path.join(testDir, 'in.js')2440 await writeFileAsync(input, `console.log(123)`)2441 let onRequest;2442 let singleRequestPromise = new Promise(resolve => {2443 onRequest = resolve;2444 });2445 const result = await esbuild.serve({2446 host: '127.0.0.1',2447 onRequest,2448 }, {2449 entryPoints: [input],2450 format: 'esm',2451 outfile: 'out.js',2452 })2453 assert.strictEqual(result.host, '127.0.0.1');2454 assert.strictEqual(typeof result.port, 'number');2455 const buffer = await fetch(result.host, result.port, '/out.js')2456 assert.strictEqual(buffer.toString(), `console.log(123);\n`);2457 let singleRequest = await singleRequestPromise;2458 assert.strictEqual(singleRequest.method, 'GET');2459 assert.strictEqual(singleRequest.path, '/out.js');2460 assert.strictEqual(singleRequest.status, 200);2461 assert.strictEqual(typeof singleRequest.remoteAddress, 'string');2462 assert.strictEqual(typeof singleRequest.timeInMS, 'number');2463 try {2464 await fetch(result.host, result.port, '/in.js')2465 throw new Error('Expected a 404 error for "/in.js"')2466 } catch (err) {2467 if (err.message !== '404 when fetching /in.js: 404 - Not Found')2468 throw err2469 }2470 result.stop();2471 await result.wait;2472 },2473 async serveWithFallbackDir({ esbuild, testDir }) {2474 const input = path.join(testDir, 'in.js')2475 const wwwDir = path.join(testDir, 'www')2476 const index = path.join(wwwDir, 'index.html')2477 await mkdirAsync(wwwDir, { recursive: true })2478 await writeFileAsync(input, `console.log(123)`)2479 await writeFileAsync(index, `<!doctype html>`)2480 let onRequest;2481 let nextRequestPromise;2482 (function generateNewPromise() {2483 nextRequestPromise = new Promise(resolve => {2484 onRequest = args => {2485 generateNewPromise();2486 resolve(args);2487 };2488 });2489 })();2490 const result = await esbuild.serve({2491 host: '127.0.0.1',2492 onRequest: args => onRequest(args),2493 servedir: wwwDir,2494 }, {2495 entryPoints: [input],2496 format: 'esm',2497 })2498 assert.strictEqual(result.host, '127.0.0.1');2499 assert.strictEqual(typeof result.port, 'number');2500 let promise, buffer, req;2501 promise = nextRequestPromise;2502 buffer = await fetch(result.host, result.port, '/in.js')2503 assert.strictEqual(buffer.toString(), `console.log(123);\n`);2504 req = await promise;2505 assert.strictEqual(req.method, 'GET');2506 assert.strictEqual(req.path, '/in.js');2507 assert.strictEqual(req.status, 200);2508 assert.strictEqual(typeof req.remoteAddress, 'string');2509 assert.strictEqual(typeof req.timeInMS, 'number');2510 promise = nextRequestPromise;2511 buffer = await fetch(result.host, result.port, '/')2512 assert.strictEqual(buffer.toString(), `<!doctype html>`);2513 req = await promise;2514 assert.strictEqual(req.method, 'GET');2515 assert.strictEqual(req.path, '/');2516 assert.strictEqual(req.status, 200);2517 assert.strictEqual(typeof req.remoteAddress, 'string');2518 assert.strictEqual(typeof req.timeInMS, 'number');2519 result.stop();2520 await result.wait;2521 },2522 async serveWithFallbackDirAndSiblingOutputDir({ esbuild, testDir }) {2523 try {2524 const result = await esbuild.serve({2525 servedir: 'www',2526 }, {2527 entryPoints: [path.join(testDir, 'in.js')],2528 outdir: 'out',2529 })2530 result.stop()2531 throw new Error('Expected an error to be thrown')2532 } catch (e) {2533 assert.strictEqual(e + '', `Error: Output directory "out" must be contained in serve directory "www"`)2534 }2535 },2536 async serveWithFallbackDirAndParentOutputDir({ esbuild, testDir }) {2537 try {2538 const result = await esbuild.serve({2539 servedir: path.join(testDir, 'www'),2540 }, {2541 entryPoints: [path.join(testDir, 'in.js')],2542 outdir: testDir,2543 absWorkingDir: testDir,2544 })2545 result.stop()2546 throw new Error('Expected an error to be thrown')2547 } catch (e) {2548 assert.strictEqual(e + '', `Error: Output directory "." must be contained in serve directory "www"`)2549 }2550 },2551 async serveWithFallbackDirAndOutputDir({ esbuild, testDir }) {2552 const input = path.join(testDir, 'in.js')2553 const outputDir = path.join(testDir, 'www/out')2554 const wwwDir = path.join(testDir, 'www')2555 const index = path.join(wwwDir, 'index.html')2556 await mkdirAsync(wwwDir, { recursive: true })2557 await writeFileAsync(input, `console.log(123)`)2558 await writeFileAsync(index, `<!doctype html>`)2559 let onRequest;2560 let nextRequestPromise;2561 (function generateNewPromise() {2562 nextRequestPromise = new Promise(resolve => {2563 onRequest = args => {2564 generateNewPromise();2565 resolve(args);2566 };2567 });2568 })();2569 const result = await esbuild.serve({2570 host: '127.0.0.1',2571 onRequest: args => onRequest(args),2572 servedir: wwwDir,2573 }, {2574 entryPoints: [input],2575 format: 'esm',2576 outdir: outputDir,2577 })2578 assert.strictEqual(result.host, '127.0.0.1');2579 assert.strictEqual(typeof result.port, 'number');2580 let promise, buffer, req;2581 promise = nextRequestPromise;2582 buffer = await fetch(result.host, result.port, '/out/in.js')2583 assert.strictEqual(buffer.toString(), `console.log(123);\n`);2584 req = await promise;2585 assert.strictEqual(req.method, 'GET');2586 assert.strictEqual(req.path, '/out/in.js');2587 assert.strictEqual(req.status, 200);2588 assert.strictEqual(typeof req.remoteAddress, 'string');2589 assert.strictEqual(typeof req.timeInMS, 'number');2590 promise = nextRequestPromise;2591 buffer = await fetch(result.host, result.port, '/')2592 assert.strictEqual(buffer.toString(), `<!doctype html>`);2593 req = await promise;2594 assert.strictEqual(req.method, 'GET');2595 assert.strictEqual(req.path, '/');2596 assert.strictEqual(req.status, 200);2597 assert.strictEqual(typeof req.remoteAddress, 'string');2598 assert.strictEqual(typeof req.timeInMS, 'number');2599 result.stop();2600 await result.wait;2601 },2602 async serveWithFallbackDirNoEntryPoints({ esbuild, testDir }) {2603 const index = path.join(testDir, 'index.html')2604 await writeFileAsync(index, `<!doctype html>`)2605 let onRequest;2606 let nextRequestPromise;2607 (function generateNewPromise() {2608 nextRequestPromise = new Promise(resolve => {2609 onRequest = args => {2610 generateNewPromise();2611 resolve(args);2612 };2613 });2614 })();2615 const result = await esbuild.serve({2616 host: '127.0.0.1',2617 onRequest: args => onRequest(args),2618 servedir: testDir,2619 }, {2620 })2621 assert.strictEqual(result.host, '127.0.0.1');2622 assert.strictEqual(typeof result.port, 'number');2623 let promise, buffer, req;2624 promise = nextRequestPromise;2625 buffer = await fetch(result.host, result.port, '/')2626 assert.strictEqual(buffer.toString(), `<!doctype html>`);2627 req = await promise;2628 assert.strictEqual(req.method, 'GET');2629 assert.strictEqual(req.path, '/');2630 assert.strictEqual(req.status, 200);2631 assert.strictEqual(typeof req.remoteAddress, 'string');2632 assert.strictEqual(typeof req.timeInMS, 'number');2633 // Check that removing the file removes it from the directory listing (i.e. the2634 // "fs.FS" object in Go does not cache the result of calling "ReadDirectory")2635 await fs.promises.unlink(index)2636 promise = nextRequestPromise;2637 buffer = await fetch(result.host, result.port, '/')2638 assert.strictEqual(buffer.toString(), `<!doctype html><meta charset="utf8"><title>Directory: /</title><h1>Directory: /</h1><ul></ul>`);2639 req = await promise;2640 assert.strictEqual(req.method, 'GET');2641 assert.strictEqual(req.path, '/');2642 assert.strictEqual(req.status, 200);2643 assert.strictEqual(typeof req.remoteAddress, 'string');2644 assert.strictEqual(typeof req.timeInMS, 'number');2645 result.stop();2646 await result.wait;2647 },2648 async serveRange({ esbuild, testDir }) {2649 const big = path.join(testDir, 'big.txt')2650 const byteCount = 16 * 1024 * 10242651 const buffer = require('crypto').randomBytes(byteCount)2652 await writeFileAsync(big, buffer)2653 const result = await esbuild.serve({2654 host: '127.0.0.1',2655 servedir: testDir,2656 }, {})2657 // Test small to big ranges2658 const minLength = 12659 const maxLength = buffer.length2660 for (let i = 0, n = 16; i < n; i++) {2661 const length = Math.round(minLength + (maxLength - minLength) * i / (n - 1))2662 const start = Math.floor(Math.random() * (buffer.length - length))2663 const fetched = await fetch(result.host, result.port, '/big.txt', {2664 // Subtract 1 because range headers are inclusive on both ends2665 Range: `bytes=${start}-${start + length - 1}`,2666 })2667 delete fetched.headers.date2668 const expected = buffer.slice(start, start + length)2669 expected.headers = {2670 'access-control-allow-origin': '*',2671 'content-length': `${length}`,2672 'content-range': `bytes ${start}-${start + length - 1}/${byteCount}`,2673 'content-type': 'application/octet-stream',2674 'connection': 'close',2675 }2676 assert.deepStrictEqual(fetched, expected)2677 }2678 result.stop();2679 await result.wait;2680 },2681}2682async function futureSyntax(esbuild, js, targetBelow, targetAbove) {2683 failure: {2684 try { await esbuild.transform(js, { target: targetBelow }) }2685 catch { break failure }2686 throw new Error(`Expected failure for ${targetBelow}: ${js}`)2687 }2688 try { await esbuild.transform(js, { target: targetAbove }) }2689 catch (e) { throw new Error(`Expected success for ${targetAbove}: ${js}\n${e}`) }2690}2691let transformTests = {2692 async transformWithNonString({ esbuild }) {2693 try {2694 await esbuild.transform(Buffer.from(`1+2`))2695 throw new Error('Expected an error to be thrown');2696 } catch (e) {2697 assert.strictEqual(e.errors[0].text, 'The input to "transform" must be a string')2698 }2699 },2700 async version({ esbuild }) {2701 const version = fs.readFileSync(path.join(repoDir, 'version.txt'), 'utf8').trim()2702 assert.strictEqual(esbuild.version, version);2703 },2704 async ignoreUndefinedOptions({ esbuild }) {2705 // This should not throw2706 await esbuild.transform(``, { jsxFactory: void 0 })2707 },2708 async throwOnBadOptions({ esbuild }) {2709 // This should throw2710 try {2711 await esbuild.transform(``, { jsxFactory: ['React', 'createElement'] })2712 throw new Error('Expected transform failure');2713 } catch (e) {2714 if (!e.errors || !e.errors[0] || e.errors[0].text !== '"jsxFactory" must be a string') {2715 throw e;2716 }2717 }2718 },2719 async avoidTDZ({ esbuild }) {2720 var { code } = await esbuild.transform(`2721 class Foo {2722 // The above line will be transformed into "var". However, the2723 // symbol "Foo" must still be defined before the class body ends.2724 static foo = new Foo2725 }2726 if (!(Foo.foo instanceof Foo))2727 throw 'fail'2728 `)2729 new Function(code)()2730 },2731 async tsAvoidTDZ({ esbuild }) {2732 var { code } = await esbuild.transform(`2733 class Foo {2734 // The above line will be transformed into "var". However, the2735 // symbol "Foo" must still be defined before the class body ends.2736 static foo = new Foo2737 }2738 if (!(Foo.foo instanceof Foo))2739 throw 'fail'2740 `, {2741 loader: 'ts',2742 })2743 new Function(code)()2744 },2745 // Note: The TypeScript compiler's transformer doesn't handle this case.2746 // Using "this" like this is a syntax error instead. However, we can handle2747 // it without too much trouble so we handle it here. This is defensive in2748 // case the TypeScript compiler team fixes this in the future.2749 async tsAvoidTDZThis({ esbuild }) {2750 var { code } = await esbuild.transform(`2751 class Foo {2752 static foo = 1232753 static bar = this.foo // "this" must be rewritten when the property is relocated2754 }2755 if (Foo.bar !== 123) throw 'fail'2756 `, {2757 loader: 'ts',2758 tsconfigRaw: {2759 compilerOptions: {2760 useDefineForClassFields: false,2761 },2762 },2763 })2764 new Function(code)()2765 },2766 async tsDecoratorAvoidTDZ({ esbuild }) {2767 var { code } = await esbuild.transform(`2768 class Bar {}2769 var oldFoo2770 function swap(target) {2771 oldFoo = target2772 return Bar2773 }2774 @swap2775 class Foo {2776 bar() { return new Foo }2777 static foo = new Foo2778 }2779 if (!(oldFoo.foo instanceof oldFoo))2780 throw 'fail: foo'2781 if (!(oldFoo.foo.bar() instanceof Bar))2782 throw 'fail: bar'2783 `, {2784 loader: 'ts',2785 })2786 new Function(code)()2787 },2788 async jsBannerTransform({ esbuild }) {2789 var { code } = await esbuild.transform(`2790 if (!bannerDefined) throw 'fail'2791 `, {2792 banner: 'const bannerDefined = true',2793 })2794 new Function(code)()2795 },2796 async jsFooterTransform({ esbuild }) {2797 var { code } = await esbuild.transform(`2798 footer()2799 `, {2800 footer: 'function footer() {}',2801 })2802 new Function(code)()2803 new Function(code)()2804 },2805 async jsBannerFooterTransform({ esbuild }) {2806 var { code } = await esbuild.transform(`2807 return { banner: bannerDefined, footer };2808 `, {2809 banner: 'const bannerDefined = true',2810 footer: 'function footer() {}',2811 })2812 const result = new Function(code)()2813 if (!result.banner) throw 'fail'2814 result.footer()2815 },2816 async cssBannerFooterTransform({ esbuild }) {2817 var { code } = await esbuild.transform(`2818 div { color: red }2819 `, {2820 loader: 'css',2821 banner: '/* banner */',2822 footer: '/* footer */',2823 })2824 assert.strictEqual(code, `/* banner */\ndiv {\n color: red;\n}\n/* footer */\n`)2825 },2826 async transformDirectEval({ esbuild }) {2827 var { code } = await esbuild.transform(`2828 export let abc = 1232829 eval('console.log(abc)')2830 `, {2831 minify: true,2832 })2833 assert.strictEqual(code, `export let abc=123;eval("console.log(abc)");\n`)2834 },2835 async tsconfigRawRemoveUnusedImportsDefault({ esbuild }) {2836 const { code } = await esbuild.transform(`import {T} from 'path'`, {2837 tsconfigRaw: {2838 compilerOptions: {},2839 },2840 loader: 'ts',2841 })2842 assert.strictEqual(code, ``)2843 },2844 async tsconfigRawRemoveUnusedImports({ esbuild }) {2845 const { code } = await esbuild.transform(`import {T} from 'path'`, {2846 tsconfigRaw: {2847 compilerOptions: {2848 importsNotUsedAsValues: 'remove',2849 },2850 },2851 loader: 'ts',2852 })2853 assert.strictEqual(code, ``)2854 },2855 async tsconfigRawPreserveUnusedImports({ esbuild }) {2856 const { code } = await esbuild.transform(`import {T} from 'path'`, {2857 tsconfigRaw: {2858 compilerOptions: {2859 importsNotUsedAsValues: 'preserve',2860 },2861 },2862 loader: 'ts',2863 })2864 assert.strictEqual(code, `import { T } from "path";\n`)2865 },2866 async tsconfigRawPreserveUnusedImportsMinifyIdentifiers({ esbuild }) {2867 const { code } = await esbuild.transform(`import {T} from 'path'`, {2868 tsconfigRaw: {2869 compilerOptions: {2870 importsNotUsedAsValues: 'preserve',2871 },2872 },2873 loader: 'ts',2874 minifyIdentifiers: true,2875 })2876 assert.strictEqual(code, `import "path";\n`)2877 },2878 async tsconfigRawPreserveUnusedImportsJS({ esbuild }) {2879 const { code } = await esbuild.transform(`import {T} from 'path'`, {2880 tsconfigRaw: {2881 compilerOptions: {2882 importsNotUsedAsValues: 'preserve',2883 },2884 },2885 loader: 'js',2886 })2887 assert.strictEqual(code, `import { T } from "path";\n`)2888 },2889 async tsconfigRawCommentsInJSON({ esbuild }) {2890 // Can use a string, which allows weird TypeScript pseudo-JSON with comments and trailing commas2891 const { code: code5 } = await esbuild.transform(`import {T} from 'path'`, {2892 tsconfigRaw: `{2893 "compilerOptions": {2894 "importsNotUsedAsValues": "preserve", // there is a trailing comment here2895 },2896 }`,2897 loader: 'ts',2898 })2899 assert.strictEqual(code5, `import { T } from "path";\n`)2900 },2901 async tsconfigRawImportsNotUsedAsValues({ esbuild }) {2902 const { code: code1 } = await esbuild.transform(`class Foo { foo }`, {2903 tsconfigRaw: {2904 compilerOptions: {2905 useDefineForClassFields: false,2906 },2907 },2908 loader: 'ts',2909 })2910 assert.strictEqual(code1, `class Foo {\n}\n`)2911 const { code: code2 } = await esbuild.transform(`class Foo { foo }`, {2912 tsconfigRaw: {2913 compilerOptions: {2914 useDefineForClassFields: true,2915 },2916 },2917 loader: 'ts',2918 })2919 assert.strictEqual(code2, `class Foo {\n foo;\n}\n`)2920 },2921 async tsconfigRawJSX({ esbuild }) {2922 const { code: code1 } = await esbuild.transform(`<><div/></>`, {2923 tsconfigRaw: {2924 compilerOptions: {2925 },2926 },2927 loader: 'jsx',2928 })2929 assert.strictEqual(code1, `/* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", null));\n`)2930 const { code: code2 } = await esbuild.transform(`<><div/></>`, {2931 tsconfigRaw: {2932 compilerOptions: {2933 jsxFactory: 'factory',2934 jsxFragmentFactory: 'fragment',2935 },2936 },2937 loader: 'jsx',2938 })2939 assert.strictEqual(code2, `/* @__PURE__ */ factory(fragment, null, /* @__PURE__ */ factory("div", null));\n`)2940 },2941 // Note: tree shaking is disabled when the output format isn't IIFE2942 async treeShakingDefault({ esbuild }) {2943 const { code } = await esbuild.transform(`2944 var unused = 1232945 var used = 2342946 export { used }2947 `, {2948 loader: 'jsx',2949 format: 'esm',2950 treeShaking: undefined,2951 })2952 assert.strictEqual(code, `var unused = 123;\nvar used = 234;\nexport {\n used\n};\n`)2953 },2954 async treeShakingFalse({ esbuild }) {2955 const { code } = await esbuild.transform(`2956 var unused = 1232957 var used = 2342958 export { used }2959 `, {2960 loader: 'jsx',2961 format: 'esm',2962 treeShaking: false,2963 })2964 assert.strictEqual(code, `var unused = 123;\nvar used = 234;\nexport {\n used\n};\n`)2965 },2966 async treeShakingTrue({ esbuild }) {2967 const { code } = await esbuild.transform(`2968 var unused = 1232969 var used = 2342970 export { used }2971 `, {2972 loader: 'jsx',2973 format: 'esm',2974 treeShaking: true,2975 })2976 assert.strictEqual(code, `var used = 234;\nexport {\n used\n};\n`)2977 },2978 // Note: tree shaking is enabled when the output format is IIFE2979 async treeShakingDefaultIIFE({ esbuild }) {2980 const { code } = await esbuild.transform(`var unused = 123`, {2981 loader: 'jsx',2982 format: 'iife',2983 treeShaking: undefined,2984 })2985 assert.strictEqual(code, `(() => {\n})();\n`)2986 },2987 async treeShakingFalseIIFE({ esbuild }) {2988 const { code } = await esbuild.transform(`var unused = 123`, {2989 loader: 'jsx',2990 format: 'iife',2991 treeShaking: false,2992 })2993 assert.strictEqual(code, `(() => {\n var unused = 123;\n})();\n`)2994 },2995 async treeShakingTrueIIFE({ esbuild }) {2996 const { code } = await esbuild.transform(`var unused = 123`, {2997 loader: 'jsx',2998 format: 'iife',2999 treeShaking: true,3000 })3001 assert.strictEqual(code, `(() => {\n})();\n`)3002 },3003 async ignoreAnnotationsDefault({ esbuild }) {3004 const { code } = await esbuild.transform(`/* @__PURE__ */ fn(); <div/>`, {3005 loader: 'jsx',3006 minifySyntax: true,3007 })3008 assert.strictEqual(code, ``)3009 },3010 async ignoreAnnotationsFalse({ esbuild }) {3011 const { code } = await esbuild.transform(`/* @__PURE__ */ fn(); <div/>`, {3012 loader: 'jsx',3013 minifySyntax: true,3014 ignoreAnnotations: false,3015 })3016 assert.strictEqual(code, ``)3017 },3018 async ignoreAnnotationsTrue({ esbuild }) {3019 const { code } = await esbuild.transform(`/* @__PURE__ */ fn(); <div/>`, {3020 loader: 'jsx',3021 minifySyntax: true,3022 ignoreAnnotations: true,3023 })3024 assert.strictEqual(code, `fn(), React.createElement("div", null);\n`)3025 },3026 async jsCharsetDefault({ esbuild }) {3027 const { code } = await esbuild.transform(`let π = 'π'`, {})3028 assert.strictEqual(code, `let \\u03C0 = "\\u03C0";\n`)3029 },3030 async jsCharsetASCII({ esbuild }) {3031 const { code } = await esbuild.transform(`let π = 'π'`, { charset: 'ascii' })3032 assert.strictEqual(code, `let \\u03C0 = "\\u03C0";\n`)3033 },3034 async jsCharsetUTF8({ esbuild }) {3035 const { code } = await esbuild.transform(`let π = 'π'`, { charset: 'utf8' })3036 assert.strictEqual(code, `let π = "π";\n`)3037 },3038 async cssCharsetDefault({ esbuild }) {3039 const { code } = await esbuild.transform(`.π:after { content: 'π' }`, { loader: 'css' })3040 assert.strictEqual(code, `.\\3c0:after {\n content: "\\3c0";\n}\n`)3041 },3042 async cssCharsetASCII({ esbuild }) {3043 const { code } = await esbuild.transform(`.π:after { content: 'π' }`, { loader: 'css', charset: 'ascii' })3044 assert.strictEqual(code, `.\\3c0:after {\n content: "\\3c0";\n}\n`)3045 },3046 async cssCharsetUTF8({ esbuild }) {3047 const { code } = await esbuild.transform(`.π:after { content: 'π' }`, { loader: 'css', charset: 'utf8' })3048 assert.strictEqual(code, `.π:after {\n content: "π";\n}\n`)3049 },3050 async cssMinify({ esbuild }) {3051 const { code } = await esbuild.transform(`div { color: #abcd }`, { loader: 'css', minify: true })3052 assert.strictEqual(code, `div{color:#abcd}\n`)3053 },3054 // Using an "es" target shouldn't affect CSS3055 async cssMinifyTargetES6({ esbuild }) {3056 const { code } = await esbuild.transform(`div { color: #abcd }`, { loader: 'css', minify: true, target: 'es6' })3057 assert.strictEqual(code, `div{color:#abcd}\n`)3058 },3059 // Using a "node" target shouldn't affect CSS3060 async cssMinifyTargetNode({ esbuild }) {3061 const { code } = await esbuild.transform(`div { color: #abcd }`, { loader: 'css', minify: true, target: 'node8' })3062 assert.strictEqual(code, `div{color:#abcd}\n`)3063 },3064 // Using an older browser target should affect CSS3065 async cssMinifyTargetChrome8({ esbuild }) {3066 const { code } = await esbuild.transform(`div { color: #abcd }`, { loader: 'css', minify: true, target: 'chrome8' })3067 assert.strictEqual(code, `div{color:rgba(170,187,204,.867)}\n`)3068 },3069 // Using a newer browser target shouldn't affect CSS3070 async cssMinifyTargetChrome80({ esbuild }) {3071 const { code } = await esbuild.transform(`div { color: #abcd }`, { loader: 'css', minify: true, target: 'chrome80' })3072 assert.strictEqual(code, `div{color:#abcd}\n`)3073 },3074 async cjs_require({ esbuild }) {3075 const { code } = await esbuild.transform(`const {foo} = require('path')`, {})3076 assert.strictEqual(code, `const { foo } = require("path");\n`)3077 },3078 async cjs_exports({ esbuild }) {3079 const { code } = await esbuild.transform(`exports.foo = 123`, {})3080 assert.strictEqual(code, `exports.foo = 123;\n`)3081 },3082 async es6_import({ esbuild }) {3083 const { code } = await esbuild.transform(`import {foo} from 'path'`, {})3084 assert.strictEqual(code, `import { foo } from "path";\n`)3085 },3086 async es6_export({ esbuild }) {3087 const { code } = await esbuild.transform(`export const foo = 123`, {})3088 assert.strictEqual(code, `export const foo = 123;\n`)3089 },3090 async es6_import_to_iife({ esbuild }) {3091 const { code } = await esbuild.transform(`import {exists} from "fs"; if (!exists) throw 'fail'`, { format: 'iife' })3092 new Function('require', code)(require)3093 },3094 async es6_import_star_to_iife({ esbuild }) {3095 const { code } = await esbuild.transform(`import * as fs from "fs"; if (!fs.exists) throw 'fail'`, { format: 'iife' })3096 new Function('require', code)(require)3097 },3098 async es6_export_to_iife({ esbuild }) {3099 const { code } = await esbuild.transform(`export {exists} from "fs"`, { format: 'iife', globalName: 'out' })3100 const out = new Function('require', code + ';return out')(require)3101 if (out.exists !== fs.exists) throw 'fail'3102 },3103 async es6_export_star_to_iife({ esbuild }) {3104 const { code } = await esbuild.transform(`export * from "fs"`, { format: 'iife', globalName: 'out' })3105 const out = new Function('require', code + ';return out')(require)3106 if (out.exists !== fs.exists) throw 'fail'3107 },3108 async es6_export_star_as_to_iife({ esbuild }) {3109 const { code } = await esbuild.transform(`export * as fs from "fs"`, { format: 'iife', globalName: 'out' })3110 const out = new Function('require', code + ';return out')(require)3111 if (out.fs.exists !== fs.exists) throw 'fail'3112 },3113 async es6_import_to_cjs({ esbuild }) {3114 const { code } = await esbuild.transform(`import {exists} from "fs"; if (!exists) throw 'fail'`, { format: 'cjs' })3115 new Function('require', code)(require)3116 },3117 async es6_import_star_to_cjs({ esbuild }) {3118 const { code } = await esbuild.transform(`import * as fs from "fs"; if (!fs.exists) throw 'fail'`, { format: 'cjs' })3119 new Function('require', code)(require)3120 },3121 async es6_export_to_cjs({ esbuild }) {3122 const { code } = await esbuild.transform(`export {exists} from "fs"`, { format: 'cjs' })3123 const exports = {}3124 new Function('require', 'exports', code)(require, exports)3125 if (exports.exists !== fs.exists) throw 'fail'3126 },3127 async es6_export_star_to_cjs({ esbuild }) {3128 const { code } = await esbuild.transform(`export * from "fs"`, { format: 'cjs' })3129 const exports = {}3130 new Function('require', 'exports', code)(require, exports)3131 if (exports.exists !== fs.exists) throw 'fail'3132 },3133 async es6_export_star_as_to_cjs({ esbuild }) {3134 const { code } = await esbuild.transform(`export * as fs from "fs"`, { format: 'cjs' })3135 const exports = {}3136 new Function('require', 'exports', code)(require, exports)3137 if (exports.fs.exists !== fs.exists) throw 'fail'3138 },3139 async es6_import_to_esm({ esbuild }) {3140 const { code } = await esbuild.transform(`import {exists} from "fs"; if (!exists) throw 'fail'`, { format: 'esm' })3141 assert.strictEqual(code, `import { exists } from "fs";\nif (!exists)\n throw "fail";\n`)3142 },3143 async es6_import_star_to_esm({ esbuild }) {3144 const { code } = await esbuild.transform(`import * as fs from "fs"; if (!fs.exists) throw 'fail'`, { format: 'esm' })3145 assert.strictEqual(code, `import * as fs from "fs";\nif (!fs.exists)\n throw "fail";\n`)3146 },3147 async es6_export_to_esm({ esbuild }) {3148 const { code } = await esbuild.transform(`export {exists} from "fs"`, { format: 'esm' })3149 assert.strictEqual(code, `import { exists } from "fs";\nexport {\n exists\n};\n`)3150 },3151 async es6_export_star_to_esm({ esbuild }) {3152 const { code } = await esbuild.transform(`export * from "fs"`, { format: 'esm' })3153 assert.strictEqual(code, `export * from "fs";\n`)3154 },3155 async es6_export_star_as_to_esm({ esbuild }) {3156 const { code } = await esbuild.transform(`export * as fs from "fs"`, { format: 'esm' })3157 assert.strictEqual(code, `import * as fs from "fs";\nexport {\n fs\n};\n`)3158 },3159 async iifeGlobalName({ esbuild }) {3160 const { code } = await esbuild.transform(`export default 123`, { format: 'iife', globalName: 'testName' })3161 const globals = {}3162 vm.createContext(globals)3163 vm.runInContext(code, globals)3164 assert.strictEqual(globals.testName.default, 123)3165 },3166 async iifeGlobalNameCompound({ esbuild }) {3167 const { code } = await esbuild.transform(`export default 123`, { format: 'iife', globalName: 'test.name' })3168 const globals = {}3169 vm.createContext(globals)3170 vm.runInContext(code, globals)3171 assert.strictEqual(globals.test.name.default, 123)3172 },3173 async iifeGlobalNameString({ esbuild }) {3174 const { code } = await esbuild.transform(`export default 123`, { format: 'iife', globalName: 'test["some text"]' })3175 const globals = {}3176 vm.createContext(globals)3177 vm.runInContext(code, globals)3178 assert.strictEqual(globals.test['some text'].default, 123)3179 },3180 async iifeGlobalNameUnicodeEscape({ esbuild }) {3181 const { code } = await esbuild.transform(`export default 123`, { format: 'iife', globalName: 'π["π 𐀀"].𐀀["𐀀 π"]' })3182 const globals = {}3183 vm.createContext(globals)3184 vm.runInContext(code, globals)3185 assert.strictEqual(globals.π["π 𐀀"].𐀀["𐀀 π"].default, 123)3186 assert.strictEqual(code.slice(0, code.indexOf('(() => {\n')), `var \\u03C0 = \\u03C0 || {};3187\\u03C0["\\u03C0 \\uD800\\uDC00"] = \\u03C0["\\u03C0 \\uD800\\uDC00"] || {};3188\\u03C0["\\u03C0 \\uD800\\uDC00"]["\\uD800\\uDC00"] = \\u03C0["\\u03C0 \\uD800\\uDC00"]["\\uD800\\uDC00"] || {};3189\\u03C0["\\u03C0 \\uD800\\uDC00"]["\\uD800\\uDC00"]["\\uD800\\uDC00 \\u03C0"] = `)3190 },3191 async iifeGlobalNameUnicodeNoEscape({ esbuild }) {3192 const { code } = await esbuild.transform(`export default 123`, { format: 'iife', globalName: 'π["π 𐀀"].𐀀["𐀀 π"]', charset: 'utf8' })3193 const globals = {}3194 vm.createContext(globals)3195 vm.runInContext(code, globals)3196 assert.strictEqual(globals.π["π 𐀀"].𐀀["𐀀 π"].default, 123)3197 assert.strictEqual(code.slice(0, code.indexOf('(() => {\n')),3198 `var π = π || {};3199π["π 𐀀"] = π["π 𐀀"] || {};3200π["π 𐀀"]["𐀀"] = π["π 𐀀"]["𐀀"] || {};3201π["π 𐀀"]["𐀀"]["𐀀 π"] = `)3202 },3203 async jsx({ esbuild }) {3204 const { code } = await esbuild.transform(`console.log(<div/>)`, { loader: 'jsx' })3205 assert.strictEqual(code, `console.log(/* @__PURE__ */ React.createElement("div", null));\n`)3206 },3207 async jsxTransform({ esbuild }) {3208 const { code } = await esbuild.transform(`console.log(<div/>)`, { loader: 'jsx', jsx: 'transform' })3209 assert.strictEqual(code, `console.log(/* @__PURE__ */ React.createElement("div", null));\n`)3210 },3211 async jsxPreserve({ esbuild }) {3212 const { code } = await esbuild.transform(`console.log(<div/>)`, { loader: 'jsx', jsx: 'preserve' })3213 assert.strictEqual(code, `console.log(<div />);\n`)3214 },3215 async ts({ esbuild }) {3216 const { code } = await esbuild.transform(`enum Foo { FOO }`, { loader: 'ts' })3217 assert.strictEqual(code, `var Foo;\n(function(Foo2) {\n Foo2[Foo2["FOO"] = 0] = "FOO";\n})(Foo || (Foo = {}));\n`)3218 },3219 async tsx({ esbuild }) {3220 const { code } = await esbuild.transform(`console.log(<Foo<T>/>)`, { loader: 'tsx' })3221 assert.strictEqual(code, `console.log(/* @__PURE__ */ React.createElement(Foo, null));\n`)3222 },3223 async minify({ esbuild }) {3224 const { code } = await esbuild.transform(`console.log("a" + "b" + c)`, { minify: true })3225 assert.strictEqual(code, `console.log("ab"+c);\n`)3226 },3227 async define({ esbuild }) {3228 const define = { 'process.env.NODE_ENV': '"production"' }3229 const { code } = await esbuild.transform(`console.log(process.env.NODE_ENV)`, { define })3230 assert.strictEqual(code, `console.log("production");\n`)3231 },3232 async defineArray({ esbuild }) {3233 const define = { 'process.env.NODE_ENV': '[1,2,3]', 'something.else': '[2,3,4]' }3234 const { code } = await esbuild.transform(`console.log(process.env.NODE_ENV)`, { define })3235 assert.strictEqual(code, `var define_process_env_NODE_ENV_default = [1, 2, 3];\nconsole.log(define_process_env_NODE_ENV_default);\n`)3236 },3237 async json({ esbuild }) {3238 const { code } = await esbuild.transform(`{ "x": "y" }`, { loader: 'json' })3239 assert.strictEqual(code, `module.exports = { x: "y" };\n`)3240 },3241 async jsonMinified({ esbuild }) {3242 const { code } = await esbuild.transform(`{ "x": "y" }`, { loader: 'json', minify: true })3243 const module = {}3244 new Function('module', code)(module)3245 assert.deepStrictEqual(module.exports, { x: 'y' })3246 },3247 async jsonESM({ esbuild }) {3248 const { code } = await esbuild.transform(`{ "x": "y" }`, { loader: 'json', format: 'esm' })3249 assert.strictEqual(code, `var x = "y";\nvar stdin_default = { x };\nexport {\n stdin_default as default,\n x\n};\n`)3250 },3251 async jsonInvalidIdentifierStart({ esbuild }) {3252 // This character is a valid "ID_Continue" but not a valid "ID_Start" so it must be quoted3253 const { code } = await esbuild.transform(`{ "\\uD835\\uDFCE": "y" }`, { loader: 'json' })3254 assert.strictEqual(code, `module.exports = { "\\u{1D7CE}": "y" };\n`)3255 },3256 async text({ esbuild }) {3257 const { code } = await esbuild.transform(`This is some text`, { loader: 'text' })3258 assert.strictEqual(code, `module.exports = "This is some text";\n`)3259 },3260 async textESM({ esbuild }) {3261 const { code } = await esbuild.transform(`This is some text`, { loader: 'text', format: 'esm' })3262 assert.strictEqual(code, `var stdin_default = "This is some text";\nexport {\n stdin_default as default\n};\n`)3263 },3264 async base64({ esbuild }) {3265 const { code } = await esbuild.transform(`\x00\x01\x02`, { loader: 'base64' })3266 assert.strictEqual(code, `module.exports = "AAEC";\n`)3267 },3268 async dataurl({ esbuild }) {3269 const { code } = await esbuild.transform(`\x00\x01\x02`, { loader: 'dataurl' })3270 assert.strictEqual(code, `module.exports = "data:application/octet-stream;base64,AAEC";\n`)3271 },3272 async sourceMapWithName({ esbuild }) {3273 const { code, map } = await esbuild.transform(`let x`, { sourcemap: true, sourcefile: 'afile.js' })3274 assert.strictEqual(code, `let x;\n`)3275 await assertSourceMap(map, 'afile.js')3276 },3277 async sourceMapExternalWithName({ esbuild }) {3278 const { code, map } = await esbuild.transform(`let x`, { sourcemap: 'external', sourcefile: 'afile.js' })3279 assert.strictEqual(code, `let x;\n`)3280 await assertSourceMap(map, 'afile.js')3281 },3282 async sourceMapInlineWithName({ esbuild }) {3283 const { code, map } = await esbuild.transform(`let x`, { sourcemap: 'inline', sourcefile: 'afile.js' })3284 assert(code.startsWith(`let x;\n//# sourceMappingURL=`))3285 assert.strictEqual(map, '')3286 const base64 = code.slice(code.indexOf('base64,') + 'base64,'.length)3287 await assertSourceMap(Buffer.from(base64.trim(), 'base64').toString(), 'afile.js')3288 },3289 async sourceMapBothWithName({ esbuild }) {3290 const { code, map } = await esbuild.transform(`let x`, { sourcemap: 'both', sourcefile: 'afile.js' })3291 assert(code.startsWith(`let x;\n//# sourceMappingURL=`))3292 await assertSourceMap(map, 'afile.js')3293 const base64 = code.slice(code.indexOf('base64,') + 'base64,'.length)3294 await assertSourceMap(Buffer.from(base64.trim(), 'base64').toString(), 'afile.js')3295 },3296 async sourceMapRoot({ esbuild }) {3297 const { code, map } = await esbuild.transform(`let x`, { sourcemap: true, sourcefile: 'afile.js', sourceRoot: "https://example.com/" })3298 assert.strictEqual(code, `let x;\n`)3299 assert.strictEqual(JSON.parse(map).sourceRoot, 'https://example.com/');3300 },3301 async numericLiteralPrinting({ esbuild }) {3302 async function checkLiteral(text) {3303 const { code } = await esbuild.transform(`return ${text}`, { minify: true })3304 assert.strictEqual(+text, new Function(code)())3305 }3306 const promises = []3307 for (let i = 0; i < 10; i++) {3308 for (let j = 0; j < 10; j++) {3309 promises.push(checkLiteral(`0.${'0'.repeat(i)}${'123456789'.slice(0, j)}`))3310 promises.push(checkLiteral(`1${'0'.repeat(i)}.${'123456789'.slice(0, j)}`))3311 promises.push(checkLiteral(`1${'123456789'.slice(0, j)}${'0'.repeat(i)}`))3312 }3313 }3314 await Promise.all(promises)3315 },3316 async tryCatchScopeMerge({ esbuild }) {3317 const code = `3318 var x = 13319 if (x !== 1) throw 'fail'3320 try {3321 throw 23322 } catch (x) {3323 if (x !== 2) throw 'fail'3324 {3325 if (x !== 2) throw 'fail'3326 var x = 33327 if (x !== 3) throw 'fail'3328 }3329 if (x !== 3) throw 'fail'3330 }3331 if (x !== 1) throw 'fail'3332 `;3333 new Function(code)(); // Verify that the code itself is correct3334 new Function((await esbuild.transform(code)).code)();3335 },3336 async nestedFunctionHoist({ esbuild }) {3337 const code = `3338 if (x !== void 0) throw 'fail'3339 {3340 if (x !== void 0) throw 'fail'3341 {3342 x()3343 function x() {}3344 x()3345 }3346 x()3347 }3348 x()3349 `;3350 new Function(code)(); // Verify that the code itself is correct3351 new Function((await esbuild.transform(code)).code)();3352 },3353 async nestedFunctionHoistBefore({ esbuild }) {3354 const code = `3355 var x = 13356 if (x !== 1) throw 'fail'3357 {3358 if (x !== 1) throw 'fail'3359 {3360 x()3361 function x() {}3362 x()3363 }3364 x()3365 }3366 x()3367 `;3368 new Function(code)(); // Verify that the code itself is correct3369 new Function((await esbuild.transform(code)).code)();3370 },3371 async nestedFunctionHoistAfter({ esbuild }) {3372 const code = `3373 if (x !== void 0) throw 'fail'3374 {3375 if (x !== void 0) throw 'fail'3376 {3377 x()3378 function x() {}3379 x()3380 }3381 x()3382 }3383 x()3384 var x = 13385 `;3386 new Function(code)(); // Verify that the code itself is correct3387 new Function((await esbuild.transform(code)).code)();3388 },3389 async nestedFunctionShadowBefore({ esbuild }) {3390 const code = `3391 let x = 13392 if (x !== 1) throw 'fail'3393 {3394 if (x !== 1) throw 'fail'3395 {3396 x()3397 function x() {}3398 x()3399 }3400 if (x !== 1) throw 'fail'3401 }3402 if (x !== 1) throw 'fail'3403 `;3404 new Function(code)(); // Verify that the code itself is correct3405 new Function((await esbuild.transform(code)).code)();3406 },3407 async nestedFunctionShadowAfter({ esbuild }) {3408 const code = `3409 try { x; throw 'fail' } catch (e) { if (!(e instanceof ReferenceError)) throw e }3410 {3411 try { x; throw 'fail' } catch (e) { if (!(e instanceof ReferenceError)) throw e }3412 {3413 x()3414 function x() {}3415 x()3416 }3417 try { x; throw 'fail' } catch (e) { if (!(e instanceof ReferenceError)) throw e }3418 }3419 try { x; throw 'fail' } catch (e) { if (!(e instanceof ReferenceError)) throw e }3420 let x = 13421 `;3422 new Function(code)(); // Verify that the code itself is correct3423 new Function((await esbuild.transform(code)).code)();3424 },3425 async sourceMapControlCharacterEscapes({ esbuild }) {3426 let chars = ''3427 for (let i = 0; i < 32; i++) chars += String.fromCharCode(i);3428 const input = `return \`${chars}\``;3429 const { code, map } = await esbuild.transform(input, { sourcemap: true, sourcefile: 'afile.code' })3430 const fn = new Function(code)3431 assert.strictEqual(fn(), chars.replace('\r', '\n'))3432 const json = JSON.parse(map)3433 assert.strictEqual(json.version, 3)3434 assert.strictEqual(json.sourcesContent.length, 1)3435 assert.strictEqual(json.sourcesContent[0], input)3436 },3437 async transformLegalCommentsJS({ esbuild }) {3438 assert.strictEqual((await esbuild.transform(`//!x\ny()`, { legalComments: 'none' })).code, `y();\n`)3439 assert.strictEqual((await esbuild.transform(`//!x\ny()`, { legalComments: 'inline' })).code, `//!x\ny();\n`)3440 assert.strictEqual((await esbuild.transform(`//!x\ny()`, { legalComments: 'eof' })).code, `y();\n//!x\n`)3441 try {3442 await esbuild.transform(``, { legalComments: 'linked' })3443 throw new Error('Expected a transform failure')3444 } catch (e) {3445 if (!e || !e.errors || !e.errors[0] || e.errors[0].text !== 'Cannot transform with linked or external legal comments')3446 throw e3447 }3448 try {3449 await esbuild.transform(``, { legalComments: 'external' })3450 throw new Error('Expected a transform failure')3451 } catch (e) {3452 if (!e || !e.errors || !e.errors[0] || e.errors[0].text !== 'Cannot transform with linked or external legal comments')3453 throw e3454 }3455 },3456 async transformLegalCommentsCSS({ esbuild }) {3457 assert.strictEqual((await esbuild.transform(`/*!x*/\ny{}`, { loader: 'css', legalComments: 'none' })).code, `y {\n}\n`)3458 assert.strictEqual((await esbuild.transform(`/*!x*/\ny{}`, { loader: 'css', legalComments: 'inline' })).code, `/*!x*/\ny {\n}\n`)3459 assert.strictEqual((await esbuild.transform(`/*!x*/\ny{}`, { loader: 'css', legalComments: 'eof' })).code, `y {\n}\n/*!x*/\n`)3460 try {3461 await esbuild.transform(``, { legalComments: 'linked' })3462 throw new Error('Expected a transform failure')3463 } catch (e) {3464 if (!e || !e.errors || !e.errors[0] || e.errors[0].text !== 'Cannot transform with linked or external legal comments')3465 throw e3466 }3467 try {3468 await esbuild.transform(``, { legalComments: 'external' })3469 throw new Error('Expected a transform failure')3470 } catch (e) {3471 if (!e || !e.errors || !e.errors[0] || e.errors[0].text !== 'Cannot transform with linked or external legal comments')3472 throw e3473 }3474 },3475 async tsDecorators({ esbuild }) {3476 const { code } = await esbuild.transform(`3477 let observed = [];3478 let on = key => (...args) => {3479 observed.push({ key, args });3480 };3481 @on('class')3482 class Foo {3483 @on('field') field;3484 @on('method') method() { }3485 @on('staticField') static staticField;3486 @on('staticMethod') static staticMethod() { }3487 fn(@on('param') x) { }3488 static staticFn(@on('staticParam') x) { }3489 }3490 // This is what the TypeScript compiler itself generates3491 let expected = [3492 { key: 'field', args: [Foo.prototype, 'field', undefined] },3493 { key: 'method', args: [Foo.prototype, 'method', { value: Foo.prototype.method, writable: true, enumerable: false, configurable: true }] },3494 { key: 'param', args: [Foo.prototype, 'fn', 0] },3495 { key: 'staticField', args: [Foo, 'staticField', undefined] },3496 { key: 'staticMethod', args: [Foo, 'staticMethod', { value: Foo.staticMethod, writable: true, enumerable: false, configurable: true }] },3497 { key: 'staticParam', args: [Foo, 'staticFn', 0] },3498 { key: 'class', args: [Foo] }3499 ];3500 return {observed, expected};3501 `, { loader: 'ts' });3502 const { observed, expected } = new Function(code)();3503 assert.deepStrictEqual(observed, expected);3504 },3505 async pureCallPrint({ esbuild }) {3506 const { code: code1 } = await esbuild.transform(`print(123, foo)`, { minifySyntax: true, pure: [] })3507 assert.strictEqual(code1, `print(123, foo);\n`)3508 const { code: code2 } = await esbuild.transform(`print(123, foo)`, { minifySyntax: true, pure: ['print'] })3509 assert.strictEqual(code2, `foo;\n`)3510 },3511 async pureCallConsoleLog({ esbuild }) {3512 const { code: code1 } = await esbuild.transform(`console.log(123, foo)`, { minifySyntax: true, pure: [] })3513 assert.strictEqual(code1, `console.log(123, foo);\n`)3514 const { code: code2 } = await esbuild.transform(`console.log(123, foo)`, { minifySyntax: true, pure: ['console.log'] })3515 assert.strictEqual(code2, `foo;\n`)3516 },3517 async nameCollisionEvalRename({ esbuild }) {3518 const { code } = await esbuild.transform(`3519 // "arg" must not be renamed to "arg2"3520 return function(arg2) {3521 function foo(arg) {3522 return arg + arg2;3523 }3524 // "eval" prevents "arg2" from being renamed3525 // "arg" below causes "arg" above to be renamed3526 return eval(foo(1)) + arg3527 }(2);3528 `)3529 const result = new Function('arg', code)(10)3530 assert.strictEqual(result, 13)3531 },3532 async nameCollisionEvalMinify({ esbuild }) {3533 const { code } = await esbuild.transform(`3534 // "arg" must not be renamed to "$"3535 return function($) {3536 function foo(arg) {3537 return arg + $;3538 }3539 // "eval" prevents "$" from being renamed3540 // Repeated "$" puts "$" at the top of the character frequency histogram3541 return eval(foo($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$))3542 }(2);3543 `, { minifyIdentifiers: true })3544 const result = new Function('$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$', code)(1)3545 assert.strictEqual(result, 3)3546 },3547 async dynamicImportString({ esbuild }) {3548 const { code } = await esbuild.transform(`import('foo')`, { target: 'chrome63' })3549 assert.strictEqual(code, `import("foo");\n`)3550 },3551 async dynamicImportStringES6({ esbuild }) {3552 const fromPromiseResolve = text => text.slice(text.indexOf('Promise.resolve'))3553 const { code } = await esbuild.transform(`import('foo')`, { target: 'chrome62' })3554 assert.strictEqual(fromPromiseResolve(code), `Promise.resolve().then(() => __toModule(require("foo")));\n`)3555 },3556 async dynamicImportStringES5({ esbuild }) {3557 const fromPromiseResolve = text => text.slice(text.indexOf('Promise.resolve'))3558 const { code } = await esbuild.transform(`import('foo')`, { target: 'chrome48' })3559 assert.strictEqual(fromPromiseResolve(code), `Promise.resolve().then(function() {\n return __toModule(require("foo"));\n});\n`)3560 },3561 async dynamicImportStringES5Minify({ esbuild }) {3562 const fromPromiseResolve = text => text.slice(text.indexOf('Promise.resolve'))3563 const { code } = await esbuild.transform(`import('foo')`, { target: 'chrome48', minifyWhitespace: true })3564 assert.strictEqual(fromPromiseResolve(code), `Promise.resolve().then(function(){return __toModule(require("foo"))});\n`)3565 },3566 async dynamicImportStringNode12_19({ esbuild }) {3567 const fromPromiseResolve = text => text.slice(text.indexOf('Promise.resolve'))3568 const { code } = await esbuild.transform(`import('foo')`, { target: 'node12.19' })3569 assert.strictEqual(fromPromiseResolve(code), `Promise.resolve().then(() => __toModule(require("foo")));\n`)3570 },3571 async dynamicImportStringNode12_20({ esbuild }) {3572 const { code } = await esbuild.transform(`import('foo')`, { target: 'node12.20' })3573 assert.strictEqual(code, `import("foo");\n`)3574 },3575 async dynamicImportStringNode13({ esbuild }) {3576 const fromPromiseResolve = text => text.slice(text.indexOf('Promise.resolve'))3577 const { code } = await esbuild.transform(`import('foo')`, { target: 'node13' })3578 assert.strictEqual(fromPromiseResolve(code), `Promise.resolve().then(() => __toModule(require("foo")));\n`)3579 },3580 async dynamicImportStringNode13_1({ esbuild }) {3581 const fromPromiseResolve = text => text.slice(text.indexOf('Promise.resolve'))3582 const { code } = await esbuild.transform(`import('foo')`, { target: 'node13.1' })3583 assert.strictEqual(fromPromiseResolve(code), `Promise.resolve().then(() => __toModule(require("foo")));\n`)3584 },3585 async dynamicImportStringNode13_2({ esbuild }) {3586 const { code } = await esbuild.transform(`import('foo')`, { target: 'node13.2' })3587 assert.strictEqual(code, `import("foo");\n`)3588 },3589 async dynamicImportExpression({ esbuild }) {3590 const { code } = await esbuild.transform(`import(foo)`, { target: 'chrome63' })3591 assert.strictEqual(code, `import(foo);\n`)3592 },3593 async dynamicImportExpressionES6({ esbuild }) {3594 const fromPromiseResolve = text => text.slice(text.indexOf('Promise.resolve'))3595 const { code: code2 } = await esbuild.transform(`import(foo)`, { target: 'chrome62' })3596 assert.strictEqual(fromPromiseResolve(code2), `Promise.resolve().then(() => __toModule(require(foo)));\n`)3597 },3598 async dynamicImportExpressionES5({ esbuild }) {3599 const fromPromiseResolve = text => text.slice(text.indexOf('Promise.resolve'))3600 const { code: code3 } = await esbuild.transform(`import(foo)`, { target: 'chrome48' })3601 assert.strictEqual(fromPromiseResolve(code3), `Promise.resolve().then(function() {\n return __toModule(require(foo));\n});\n`)3602 },3603 async dynamicImportExpressionES5Minify({ esbuild }) {3604 const fromPromiseResolve = text => text.slice(text.indexOf('Promise.resolve'))3605 const { code: code4 } = await esbuild.transform(`import(foo)`, { target: 'chrome48', minifyWhitespace: true })3606 assert.strictEqual(fromPromiseResolve(code4), `Promise.resolve().then(function(){return __toModule(require(foo))});\n`)3607 },3608 async caseInsensitiveTarget({ esbuild }) {3609 assert.strictEqual((await esbuild.transform(`a ||= b`, { target: 'eS5' })).code, `a || (a = b);\n`)3610 assert.strictEqual((await esbuild.transform(`a ||= b`, { target: 'eSnExT' })).code, `a ||= b;\n`)3611 },3612 async multipleEngineTargets({ esbuild }) {3613 const check = async (target, expected) =>3614 assert.strictEqual((await esbuild.transform(`foo(a ?? b)`, { target })).code, expected)3615 await Promise.all([3616 check('es2020', `foo(a ?? b);\n`),3617 check('es2019', `foo(a != null ? a : b);\n`),3618 check('chrome80', `foo(a ?? b);\n`),3619 check('chrome79', `foo(a != null ? a : b);\n`),3620 check(['es2020', 'chrome80'], `foo(a ?? b);\n`),3621 check(['es2020', 'chrome79'], `foo(a != null ? a : b);\n`),3622 check(['es2019', 'chrome80'], `foo(a != null ? a : b);\n`),3623 ])3624 },3625 async multipleEngineTargetsNotSupported({ esbuild }) {3626 try {3627 await esbuild.transform(`0n`, { target: ['es5', 'chrome1', 'safari2', 'firefox3'] })3628 throw new Error('Expected an error to be thrown')3629 } catch (e) {3630 assert.strictEqual(e.errors[0].text,3631 'Big integer literals are not available in the configured target environment ("chrome1", "es5", "firefox3", "safari2")')3632 }3633 },3634 // Future syntax3635 forAwait: ({ esbuild }) => futureSyntax(esbuild, 'async function foo() { for await (let x of y) {} }', 'es2017', 'es2018'),3636 bigInt: ({ esbuild }) => futureSyntax(esbuild, '123n', 'es2019', 'es2020'),3637 bigIntKey: ({ esbuild }) => futureSyntax(esbuild, '({123n: 0})', 'es2019', 'es2020'),3638 bigIntPattern: ({ esbuild }) => futureSyntax(esbuild, 'let {123n: x} = y', 'es2019', 'es2020'),3639 nonIdArrayRest: ({ esbuild }) => futureSyntax(esbuild, 'let [...[x]] = y', 'es2015', 'es2016'),3640 topLevelAwait: ({ esbuild }) => futureSyntax(esbuild, 'await foo', 'es2020', 'esnext'),3641 topLevelForAwait: ({ esbuild }) => futureSyntax(esbuild, 'for await (foo of bar) ;', 'es2020', 'esnext'),3642 // Future syntax: async generator functions3643 asyncGenFnStmt: ({ esbuild }) => futureSyntax(esbuild, 'async function* foo() {}', 'es2017', 'es2018'),3644 asyncGenFnExpr: ({ esbuild }) => futureSyntax(esbuild, '(async function*() {})', 'es2017', 'es2018'),3645 asyncGenObjFn: ({ esbuild }) => futureSyntax(esbuild, '({ async* foo() {} })', 'es2017', 'es2018'),3646 asyncGenClassStmtFn: ({ esbuild }) => futureSyntax(esbuild, 'class Foo { async* foo() {} }', 'es2017', 'es2018'),3647 asyncGenClassExprFn: ({ esbuild }) => futureSyntax(esbuild, '(class { async* foo() {} })', 'es2017', 'es2018'),3648}3649function registerClassPrivateTests(target) {3650 let contents = `3651 class Field { #foo = 123; bar = this.#foo }3652 if (new Field().bar !== 123) throw 'fail: field'3653 class Method { bar = this.#foo(); #foo() { return 123 } }3654 if (new Method().bar !== 123) throw 'fail: method'3655 class Accessor { bar = this.#foo; get #foo() { return 123 } }3656 if (new Accessor().bar !== 123) throw 'fail: accessor'3657 class StaticField { static #foo = 123; static bar = StaticField.#foo }3658 if (StaticField.bar !== 123) throw 'fail: static field'3659 class StaticMethod { static bar = StaticMethod.#foo(); static #foo() { return 123 } }3660 if (StaticMethod.bar !== 123) throw 'fail: static method'3661 class StaticAccessor { static bar = StaticAccessor.#foo; static get #foo() { return 123 } }3662 if (StaticAccessor.bar !== 123) throw 'fail: static accessor'3663 class StaticFieldThis { static #foo = 123; static bar = this.#foo }3664 if (StaticFieldThis.bar !== 123) throw 'fail: static field'3665 class StaticMethodThis { static bar = this.#foo(); static #foo() { return 123 } }3666 if (StaticMethodThis.bar !== 123) throw 'fail: static method'3667 class StaticAccessorThis { static bar = this.#foo; static get #foo() { return 123 } }3668 if (StaticAccessorThis.bar !== 123) throw 'fail: static accessor'3669 class FieldFromStatic { #foo = 123; static bar = new FieldFromStatic().#foo }3670 if (FieldFromStatic.bar !== 123) throw 'fail: field from static'3671 class MethodFromStatic { static bar = new MethodFromStatic().#foo(); #foo() { return 123 } }3672 if (MethodFromStatic.bar !== 123) throw 'fail: method from static'3673 class AccessorFromStatic { static bar = new AccessorFromStatic().#foo; get #foo() { return 123 } }3674 if (AccessorFromStatic.bar !== 123) throw 'fail: accessor from static'3675 `3676 // Test this code as JavaScript3677 let buildOptions = {3678 stdin: { contents },3679 bundle: true,3680 write: false,3681 target,3682 }3683 transformTests[`transformClassPrivate_${target[0]}`] = async ({ esbuild }) =>3684 new Function((await esbuild.transform(contents, { target })).code)()3685 buildTests[`buildClassPrivate_${target[0]}`] = async ({ esbuild }) =>3686 new Function((await esbuild.build(buildOptions)).outputFiles[0].text)()3687 // Test this code as TypeScript3688 let buildOptionsTS = {3689 stdin: { contents, loader: 'ts' },3690 bundle: true,3691 write: false,3692 }3693 transformTests[`tsTransformClassPrivate_${target[0]}`] = async ({ esbuild }) =>3694 new Function((await esbuild.transform(contents, { target, loader: 'ts' })).code)()3695 buildTests[`tsBuildClassPrivate_${target[0]}`] = async ({ esbuild }) =>3696 new Function((await esbuild.build(buildOptionsTS)).outputFiles[0].text)()3697}3698for (let es of ['es2015', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'esnext'])3699 registerClassPrivateTests([es])3700for (let chrome = 49; chrome < 100; chrome++)3701 registerClassPrivateTests([`chrome${chrome}`])3702for (let firefox = 45; firefox < 100; firefox++)3703 registerClassPrivateTests([`firefox${firefox}`])3704for (let edge = 13; edge < 100; edge++)3705 registerClassPrivateTests([`edge${edge}`])3706for (let safari = 10; safari < 20; safari++)3707 registerClassPrivateTests([`safari${safari}`])3708let formatTests = {3709 async formatMessages({ esbuild }) {3710 const messages = await esbuild.formatMessages([3711 { text: 'This is an error' },3712 { text: 'Another error', location: { file: 'file.js' } },3713 ], {3714 kind: 'error',3715 })3716 assert.strictEqual(messages.length, 2)3717 assert.strictEqual(messages[0], ` > error: This is an error\n\n`)3718 assert.strictEqual(messages[1], ` > file.js:0:0: error: Another error\n 0 │ \n ╵ ^\n\n`)3719 },3720}3721let analyzeTests = {3722 async analyzeMetafile({ esbuild }) {3723 const metafile = {3724 "inputs": {3725 "entry.js": {3726 "bytes": 50,3727 "imports": [3728 {3729 "path": "lib.js",3730 "kind": "import-statement"3731 }3732 ]3733 },3734 "lib.js": {3735 "bytes": 200,3736 "imports": []3737 }3738 },3739 "outputs": {3740 "out.js": {3741 "imports": [],3742 "exports": [],3743 "entryPoint": "entry.js",3744 "inputs": {3745 "entry.js": {3746 "bytesInOutput": 253747 },3748 "lib.js": {3749 "bytesInOutput": 503750 }3751 },3752 "bytes": 1003753 }3754 }3755 }3756 assert.strictEqual(await esbuild.analyzeMetafile(metafile), `3757 out.js 100b 100.0%3758 ├ lib.js 50b 50.0%3759 └ entry.js 25b 25.0%3760`)3761 assert.strictEqual(await esbuild.analyzeMetafile(metafile, { verbose: true }), `3762 out.js ────── 100b ── 100.0%3763 ├ lib.js ──── 50b ─── 50.0%3764 │ └ entry.js3765 └ entry.js ── 25b ─── 25.0%3766`)3767 },3768}3769let functionScopeCases = [3770 'function x() {} { var x }',3771 'function* x() {} { var x }',3772 'async function x() {} { var x }',3773 'async function* x() {} { var x }',3774 '{ var x } function x() {}',3775 '{ var x } function* x() {}',3776 '{ var x } async function x() {}',3777 '{ var x } async function* x() {}',3778 '{ function x() {} { var x } }',3779 '{ function* x() {} { var x } }',3780 '{ async function x() {} { var x } }',3781 '{ async function* x() {} { var x } }',3782 '{ { var x } function x() {} }',3783 '{ { var x } function* x() {} }',3784 '{ { var x } async function x() {} }',3785 '{ { var x } async function* x() {} }',3786 'function f() { function x() {} { var x } }',3787 'function f() { function* x() {} { var x } }',3788 'function f() { async function x() {} { var x } }',3789 'function f() { async function* x() {} { var x } }',3790 'function f() { { var x } function x() {} }',3791 'function f() { { var x } function* x() {} }',3792 'function f() { { var x } async function x() {} }',3793 'function f() { { var x } async function* x() {} }',3794 'function f() { { function x() {} { var x } }}',3795 'function f() { { function* x() {} { var x } }}',3796 'function f() { { async function x() {} { var x } }}',3797 'function f() { { async function* x() {} { var x } }}',3798 'function f() { { { var x } function x() {} }}',3799 'function f() { { { var x } function* x() {} }}',3800 'function f() { { { var x } async function x() {} }}',3801 'function f() { { { var x } async function* x() {} }}',3802];3803{3804 let counter = 0;3805 for (let kind of ['var', 'let', 'const']) {3806 for (let code of functionScopeCases) {3807 code = code.replace('var', kind)3808 transformTests['functionScope' + counter++] = async ({ esbuild }) => {3809 let esbuildError3810 let nodeError3811 try { await esbuild.transform(code) } catch (e) { esbuildError = e }3812 try { new Function(code)() } catch (e) { nodeError = e }3813 if (!esbuildError !== !nodeError) {3814 throw new Error(`3815 code: ${code}3816 esbuild: ${esbuildError}3817 node: ${nodeError}3818 `)3819 }3820 }3821 }3822 }3823}3824let syncTests = {3825 async buildSync({ esbuild, testDir }) {3826 const input = path.join(testDir, 'in.js')3827 const output = path.join(testDir, 'out.js')3828 await writeFileAsync(input, 'export default 123')3829 esbuild.buildSync({ entryPoints: [input], bundle: true, outfile: output, format: 'cjs' })3830 const result = require(output)3831 assert.strictEqual(result.default, 123)3832 assert.strictEqual(result.__esModule, true)3833 },3834 async buildSyncOutputFiles({ esbuild, testDir }) {3835 const input = path.join(testDir, 'in.js')3836 const output = path.join(testDir, 'out.js')3837 await writeFileAsync(input, 'module.exports = 123')3838 let prettyPath = path.relative(process.cwd(), input).replace(/\\/g, '/')3839 let text = `// ${prettyPath}\nmodule.exports = 123;\n`3840 let result = esbuild.buildSync({ entryPoints: [input], bundle: true, outfile: output, format: 'cjs', write: false })3841 assert.strictEqual(result.outputFiles.length, 1)3842 assert.strictEqual(result.outputFiles[0].path, output)3843 assert.strictEqual(result.outputFiles[0].text, text)3844 assert.deepStrictEqual(result.outputFiles[0].contents, new Uint8Array(Buffer.from(text)))3845 },3846 async transformSyncJSMap({ esbuild }) {3847 const { code, map } = esbuild.transformSync(`1+2`, { sourcemap: true })3848 assert.strictEqual(code, `1 + 2;\n`)3849 assert.strictEqual(map, `{3850 "version": 3,3851 "sources": ["<stdin>"],3852 "sourcesContent": ["1+2"],3853 "mappings": "AAAA,IAAE;",3854 "names": []3855}3856`)3857 },3858 async transformSyncJSMapNoContent({ esbuild }) {3859 const { code, map } = esbuild.transformSync(`1+2`, { sourcemap: true, sourcesContent: false })3860 assert.strictEqual(code, `1 + 2;\n`)3861 assert.strictEqual(map, `{3862 "version": 3,3863 "sources": ["<stdin>"],3864 "mappings": "AAAA,IAAE;",3865 "names": []3866}3867`)3868 },3869 async transformSyncCSS({ esbuild }) {3870 const { code, map } = esbuild.transformSync(`a{b:c}`, { loader: 'css' })3871 assert.strictEqual(code, `a {\n b: c;\n}\n`)3872 assert.strictEqual(map, '')3873 },3874 async transformSyncWithNonString({ esbuild }) {3875 try {3876 esbuild.transformSync(Buffer.from(`1+2`))3877 throw new Error('Expected an error to be thrown');3878 } catch (e) {3879 assert.strictEqual(e.errors[0].text, 'The input to "transform" must be a string')3880 }3881 },3882 async transformSync100x({ esbuild }) {3883 for (let i = 0; i < 100; i++) {3884 const { code } = esbuild.transformSync(`console.log(1+${i})`, {})3885 assert.strictEqual(code, `console.log(1 + ${i});\n`)3886 }3887 },3888 async buildSyncThrow({ esbuild, testDir }) {3889 const input = path.join(testDir, 'in.js')3890 try {3891 const output = path.join(testDir, 'out.js')3892 await writeFileAsync(input, '1+')3893 esbuild.buildSync({ entryPoints: [input], bundle: true, outfile: output, format: 'cjs', logLevel: 'silent' })3894 const result = require(output)3895 assert.strictEqual(result.default, 123)3896 assert.strictEqual(result.__esModule, true)3897 throw new Error('Expected an error to be thrown');3898 } catch (error) {3899 assert(error instanceof Error, 'Must be an Error object');3900 assert.strictEqual(error.message, `Build failed with 1 error:3901${path.relative(process.cwd(), input).replace(/\\/g, '/')}:1:2: error: Unexpected end of file`);3902 assert.strictEqual(error.errors.length, 1);3903 assert.strictEqual(error.warnings.length, 0);3904 }3905 },3906 async buildSyncIncrementalThrow({ esbuild, testDir }) {3907 try {3908 const input = path.join(testDir, 'in.js')3909 const output = path.join(testDir, 'out.js')3910 await writeFileAsync(input, '1+')3911 esbuild.buildSync({ entryPoints: [input], bundle: true, outfile: output, format: 'cjs', logLevel: 'silent', incremental: true })3912 const result = require(output)3913 assert.strictEqual(result.default, 123)3914 assert.strictEqual(result.__esModule, true)3915 throw new Error('Expected an error to be thrown');3916 } catch (error) {3917 assert(error instanceof Error, 'Must be an Error object');3918 assert.strictEqual(error.message, `Build failed with 1 error:\nerror: Cannot use "incremental" with a synchronous build`);3919 assert.strictEqual(error.errors.length, 1);3920 assert.strictEqual(error.warnings.length, 0);3921 }3922 },3923 async buildSyncWatchThrow({ esbuild, testDir }) {3924 try {3925 const input = path.join(testDir, 'in.js')3926 const output = path.join(testDir, 'out.js')3927 await writeFileAsync(input, '1+')3928 esbuild.buildSync({ entryPoints: [input], bundle: true, outfile: output, format: 'cjs', logLevel: 'silent', watch: true })3929 const result = require(output)3930 assert.strictEqual(result.default, 123)3931 assert.strictEqual(result.__esModule, true)3932 throw new Error('Expected an error to be thrown');3933 } catch (error) {3934 assert(error instanceof Error, 'Must be an Error object');3935 assert.strictEqual(error.message, `Build failed with 1 error:\nerror: Cannot use "watch" with a synchronous build`);3936 assert.strictEqual(error.errors.length, 1);3937 assert.strictEqual(error.warnings.length, 0);3938 }3939 },3940 async transformThrow({ esbuild }) {3941 try {3942 await esbuild.transform(`1+`, {})3943 throw new Error('Expected an error to be thrown');3944 } catch (error) {3945 assert(error instanceof Error, 'Must be an Error object');3946 assert.strictEqual(error.message, `Transform failed with 1 error:\n<stdin>:1:2: error: Unexpected end of file`);3947 assert.strictEqual(error.errors.length, 1);3948 assert.strictEqual(error.warnings.length, 0);3949 }3950 },3951 async formatMessagesSync({ esbuild }) {3952 const messages = esbuild.formatMessagesSync([3953 { text: 'This is an error' },3954 { text: 'Another error', location: { file: 'file.js' } },3955 ], {3956 kind: 'error',3957 })3958 assert.strictEqual(messages.length, 2)3959 assert.strictEqual(messages[0], ` > error: This is an error\n\n`)3960 assert.strictEqual(messages[1], ` > file.js:0:0: error: Another error\n 0 │ \n ╵ ^\n\n`)3961 },3962 async analyzeMetafileSync({ esbuild }) {3963 const metafile = {3964 "inputs": {3965 "entry.js": {3966 "bytes": 50,3967 "imports": [3968 {3969 "path": "lib.js",3970 "kind": "import-statement"3971 }3972 ]3973 },3974 "lib.js": {3975 "bytes": 200,3976 "imports": []3977 }3978 },3979 "outputs": {3980 "out.js": {3981 "imports": [],3982 "exports": [],3983 "entryPoint": "entry.js",3984 "inputs": {3985 "entry.js": {3986 "bytesInOutput": 253987 },3988 "lib.js": {3989 "bytesInOutput": 503990 }3991 },3992 "bytes": 1003993 }3994 }3995 }3996 assert.strictEqual(esbuild.analyzeMetafileSync(metafile), `3997 out.js 100b 100.0%3998 ├ lib.js 50b 50.0%3999 └ entry.js 25b 25.0%4000`)4001 assert.strictEqual(esbuild.analyzeMetafileSync(metafile, { verbose: true }), `4002 out.js ────── 100b ── 100.0%4003 ├ lib.js ──── 50b ─── 50.0%4004 │ └ entry.js4005 └ entry.js ── 25b ─── 25.0%4006`)4007 },4008}4009async function assertSourceMap(jsSourceMap, source) {4010 const map = await new SourceMapConsumer(jsSourceMap)4011 const original = map.originalPositionFor({ line: 1, column: 4 })4012 assert.strictEqual(original.source, source)4013 assert.strictEqual(original.line, 1)4014 assert.strictEqual(original.column, 10)4015}4016async function main() {4017 const esbuild = installForTests()4018 // Create a fresh test directory4019 removeRecursiveSync(rootTestDir)4020 fs.mkdirSync(rootTestDir)4021 // Time out these tests after 5 minutes. This exists to help debug test hangs in CI.4022 let minutes = 54023 let timeout = setTimeout(() => {4024 console.error(`❌ js api tests timed out after ${minutes} minutes, exiting...`)4025 process.exit(1)4026 }, minutes * 60 * 1000)4027 // Run all tests concurrently4028 const runTest = async ([name, fn]) => {4029 let testDir = path.join(rootTestDir, name)4030 try {4031 await mkdirAsync(testDir)4032 await fn({ esbuild, testDir })4033 removeRecursiveSync(testDir)4034 return true4035 } catch (e) {4036 console.error(`❌ ${name}: ${e && e.message || e}`)4037 return false4038 }4039 }4040 const tests = [4041 ...Object.entries(buildTests),4042 ...Object.entries(watchTests),4043 ...Object.entries(serveTests),4044 ...Object.entries(transformTests),4045 ...Object.entries(formatTests),4046 ...Object.entries(analyzeTests),4047 ...Object.entries(syncTests),4048 ]4049 let allTestsPassed = (await Promise.all(tests.map(runTest))).every(success => success)4050 if (!allTestsPassed) {4051 console.error(`❌ js api tests failed`)4052 process.exit(1)4053 } else {4054 console.log(`✅ js api tests passed`)4055 removeRecursiveSync(rootTestDir)4056 }4057 clearTimeout(timeout);4058}...

Full Screen

Full Screen

Functions.js

Source:Functions.js Github

copy

Full Screen

1// jPak 1808-- 2// jPak 1901-- added password option ==> pwdProtected:'true' <==3function jPak(a) {4 if (a.leavePopUpOpen === undefined) a.leavePopUpOpen = 'false';5 if (a.returnAction === undefined) a.returnAction = "refreshAll"; /*noReturn , onlyAppend, refreshAll, myFunction*/6 if (a.refreshArea === undefined) a.refreshArea = "div1";7 if (a.ctrlAction === undefined) a.ctrlAction = "GetData";8 if (a.confirm === undefined) a.confirm = "false";9 if (a.event === undefined) a.event = "show"; /*update | insert | remove | show */10 if (a.edid === undefined) a.edid = 0;11 if (a.ctrl === undefined) a.ctrl = window.location.pathname.split('/')[1];12 //if (a.func === undefined) a.func = null;13 if (a.closefunc === undefined) a.closefunc = function (r) { };14 if (a.title === undefined) a.title = "Edit Area";15 if (a.tsk === undefined) a.tsk = "lst"; /*//lst //frm // dsp // rem // ref //*/16 if (a.popUp === undefined) a.popUp = "false";17 if (a.showLoader === 'true') { LoaderAppend(a.refreshArea); }18 if (a.popUpStyle === undefined) a.popUpStyle = "";19 if (a.popUpSize === undefined) a.popUpSize = "lg";20 if (a.divId === undefined) a.divId = a.refreshArea + "-" + a.edid;21 if (a.showMsg === undefined) a.showMsg = 'true';22 if (a.ctrl.length === 0) a.ctrl = "Home";23 var f = new FormData();24 if (a.tsk !== undefined) f.append("sect", a.tsk);25 if (a.refreshArea !== undefined) f.append("refreshArea", a.refreshArea);26 if (a.returnAction !== undefined) f.append("returnAction", a.returnAction);27 f.append("edid", a.edid);28 if (a.frmName !== undefined) {29 $('input[type=file]').each(function () {30 var inputfile = $(this);31 var files = inputfile[0].files;32 for (var fi = 0; fi < files.length; fi++) {33 f.append(inputfile[0].name, files[fi], files[fi].name);34 }35 });36 var elements = document.forms[a.frmName].elements;37 for (var i = 0; i < elements.length; i++) {38 if (elements[i].name.length !== 0) {39 if (elements[i].type === "radio" || elements[i].type === "checkbox") {40 if (elements[i].checked === true)41 f.append(elements[i].name, elements[i].value);42 } else f.append(elements[i].name, elements[i].value);43 }44 }45 }46 if (a.frmValues !== undefined) {47 var attrib = a.frmValues;48 Object.keys(attrib).forEach(function (key) { f.append(key, attrib[key]); });49 }50 if (a.leavePopUpOpen === 'false') KillPopUp();51 52 if (a.confirm === 'true') {53 if (a.confirmArr === undefined) a.confirmArr = {};54 if (a.confirmArr.title === undefined) a.confirmArr.title = "Are you sure?";55 if (a.confirmArr.text === undefined) a.confirmArr.text = " ";56 if (a.confirmArr.type === undefined) a.confirmArr.type = "warning";57 if (a.confirmArr.confirmButtonClass === undefined) a.confirmArr.confirmButtonClass = "btn-danger";58 if (a.confirmArr.confirmButtonText === undefined) a.confirmArr.confirmButtonText = "Yes, I am!";59 if (a.confirmArr.showCancelButton === undefined) a.confirmArr.showCancelButton = 'true';60 if (a.confirmArr.closeOnConfirm === undefined) a.confirmArr.closeOnConfirm = 'true';61 swal({62 type: "warning",63 confirmButtonClass: "btn-danger",64 title: a.confirmArr.title,65 text: a.confirmArr.text,66 confirmButtonText: a.confirmArr.confirmButtonText,67 showCancelButton: true,68 closeOnConfirm: true69 /*,showLoaderOnConfirm: true*/70 },71 function (isConfirm) {72 if (isConfirm) {73 window.onkeydown = null;74 window.onfocus = null;75 jPakAJx("/" + a.ctrl + "/" + a.ctrlAction, f, function (r) {76 jPakSuccessFunc(a, r);77 if (a.func !== undefined) {78 a.func(r);79 }80 return true;81 });82 } else {83 swal("Cancelled", "You are safe :)", "info");84 }85 });86 } else {87 if (a.pwdProtected === 'true') {88 swal({89 title: "Provide Password!",90 text: "Password:",91 type: "input",92 inputType: "password",93 showCancelButton: true,94 closeOnConfirm: false,95 showLoaderOnConfirm: true,96 inputPlaceholder: "Password"97 }, function (inputValue) {98 if (inputValue === false) return false;99 if (inputValue === "") { swal.showInputError("Can not be empty.!"); return false }100 f.append("code", inputValue);101 if (a.popUp === 'true') {102 jPakCrtMdl({ modalHeader: a.title, divId: a.divId, style: a.popUpStyle, sizeModal: a.popUpSize });103 $(document).on('click', "#swalClose1", function (r) { a.closefunc(r); });104 $(document).on('click', "#swalClose2", function (r) { a.closefunc(r); });105 a.refreshArea = a.divId;106 }107 jPakAJx("/" + a.ctrl + "/" + a.ctrlAction, f, function (r) { jPakSuccessFunc(a, r); if (a.func !== undefined) a.func(r); });108 swal.close();109 });110 die();111 }112 if (a.popUp === 'true') {113 jPakCrtMdl({ modalHeader: a.title, divId: a.divId, style: a.popUpStyle, sizeModal: a.popUpSize });114 $(document).on('click', "#swalClose1", function (r) { a.closefunc(r); });115 $(document).on('click', "#swalClose2", function (r) { a.closefunc(r); });116 a.refreshArea = a.divId;117 }118 jPakAJx("/" + a.ctrl + "/" + a.ctrlAction, f, function (r) { jPakSuccessFunc(a, r); if (a.func !== undefined) a.func(r); });119 }120 return false;121}122function jPakCrtMdl(a) {123 var divId = "PopUp";124 var sizeModal = "lg";125 var modalHeader = "General Information";126 var style = 'style="width:75%;"';127 if (a.divId !== undefined) divId = a.divId;128 if (a.sizeModal !== undefined) sizeModal = a.sizeModal;129 if (a.style !== undefined) style = a.style;130 if (a.modalHeader !== undefined) modalHeader = a.modalHeader;131 if (document.getElementById(divId) === null) {132 var div = '<div class="modal fade" id="' + divId + '">';133 var sizeModeldiv = '<div class="modal-dialog modal-' + sizeModal + '" style="' + style + '" >';134 var container = '<div class="modal-content">';135 var header = '<div class="modal-header"><button type="button" id="swalClose1" class="close swalClose" data-dismiss="modal" style="color: #000;">&times;</button><h4 class="modal-title">' + modalHeader + '</h4></div>';136 var body = '<div class="modal-body" id="modal-body" ></div>';137 var footer = '<div class="modal-footer"><button type="button" id="swalClose2" class="btn swalClose btn-default" data-dismiss="modal">Close</button></div>';138 container = container + header + body + footer + '</div>';139 sizeModeldiv = sizeModeldiv + container + '</div>';140 div = div + sizeModeldiv + '</div>';141 $('body').prepend(div);142 $('.modal-body').append('<div class="Preloader" id="Preloader" style="display:none"></div>');143 LoaderAppend("Preloader");144 ProgressAppend("Preloader");145 $('#' + divId).modal();146 $('#' + divId).on('shown.bs.modal', function () {147 $(document).off('focusin.modal');148 });149 }150}151function jPakAJx(url, data, success) {152 var type = "POST";153 if (data.length !== 0) {154 $.ajax({155 url: url,156 type: type,157 cache: false,158 contentType: false, // Not to set any content header159 processData: false, // Not to process data160 data: data,161 timeout: 30000,162 async: false,163 success: success,164 xhr: function () {165 var xhr = new window.XMLHttpRequest();166 xhr.upload.addEventListener("progress", function (evt) {167 if (evt.lengthComputable) {168 var percentComplete = evt.loaded / evt.total;169 percentComplete = parseInt(percentComplete * 100);170 /*$('.myprogress').text(percentComplete + '%');*/171 $('.myprogress').css('width', percentComplete + '%');172 }173 }, false);174 return xhr;175 },176 error: function (r) { /*swal("Oops!", "Some thing went wrong!", "warning");*/ }177 });178 } else {179 $.ajax({180 url: url,181 type: type,182 cache: false,183 timeout: 30000,184 async: false,185 contentType: false,186 processData: false,187 success: success,188 error: function (r) { /*swal("Oop!", "Some thing went wrong!", "warning");*/ }189 });190 }191}192function jPakSuccessFunc(a, r) {193 var row = document.getElementById('trc-' + a.edid);194 var rowC = $('.trc-' + a.edid);195 if (a.event === "remove") {196 if (row !== null) $('#trc-' + a.edid).remove();197 if (rowC !== null) $('.trc-' + a.edid).remove();198 if (a.showMsg === 'true') toastr.warning("Done");199 return false;200 }201 if (a.frmName !== undefined) {202 if (r.ReturnAction === "onlyPrepend") $('#' + r.RefreshArea).prepend(r.Data);203 else if (r.ReturnAction === "onlyAppend") $('#' + r.RefreshArea).append(r.Data);204 else if (r.ReturnAction === "refreshAll") $('#' + r.RefreshArea).empty().append(r.Data);205 if (a.showMsg === 'true' && (r.ErrorMessage !== undefined)) toastr.warning(r.ErrorMessage);206 if (document.forms[a.frmName] !== undefined) document.forms[a.frmName].reset();207 }208 if (a.returnAction === "refreshAll") {209 if (a.popUp === 'true') {210 $("#" + a.divId).modal('show');211 $('#' + a.divId + ' .modal-body').empty().html(r);212 } else213 $('#' + a.refreshArea).empty().append(r);214 }215 else if (a.returnAction === "onlyAppend") $('#' + a.refreshArea).append(r);216 else if (a.returnAction === "onlyPrepend") $('#' + a.refreshArea).prepend(r);217 else if (a.returnAction === "noReturn") {218 if (a.showMsg === 'true') toastr.warning("Done");219 }220 //else if (a.returnAction === "myFunc") a.func(r);221 else if (a.returnAction === "remoteFeed") {222 $.each(r,223 function (index, value) {224 if (value.ReturnAction === "onlyAppend")225 $('#' + value.RefreshArea).append(value.Data);226 else if (value.ReturnAction === "onlyPrepend")227 $('#' + value.RefreshArea).append(value.Data);228 else229 $('#' + value.RefreshArea).empty().append(value.Data);230 });231 } else {232 if (a.showMsg === 'true') toastr.warning("Done");233 }234}235//Dynamic Form236var FormAttrib = function (attr) {237 this.id = ((attr.id === undefined) ? "frm1" : attr.id);238 this.action = ((attr.action === undefined) ? "?" : attr.action);239 this.method = ((attr.method === undefined) ? "POST" : attr.method);240}241var InputText = function (attr) {242 this.label = ((attr.label === undefined) ? "-" : attr.label);243 this.labelDivClass = ((attr.labelDivClass === undefined) ? "control-label col-md-3" : attr.labelDivClass);244 this.DivFormat = ((attr.DivFormat === undefined) ? "{'col-md-3':'label','col-md-8':'input'}" : attr.DivFormat);245 this.pretxt = ((attr.pretxt === undefined) ? "-" : attr.pretxt);246 this.InputDivClass = ((attr.InputDivClass === undefined) ? "col-md-8" : attr.InputDivClass);247 this.posttxt = ((attr.posttxt === undefined) ? "-" : attr.posttxt);248 this.type = ((attr.type === undefined) ? "text" : attr.type);249 this.id = ((attr.id === undefined) ? "id1" : attr.id);250 this.value = ((attr.value === undefined) ? "" : attr.value);251 this.placeholder = ((attr.placeholder === undefined) ? "" : attr.placeholder);252 this.class = ((attr.class === undefined) ? "form-control" : attr.class);253 this.style = ((attr.style === undefined) ? "-" : attr.style);254 this.appendTo = ((attr.appendTo === undefined) ? "normal" : attr.appendTo);255 this.onChange = ((attr.onChange === undefined) ? "-" : attr.onChange);256 this.onClick = ((attr.onClick === undefined) ? "-" : attr.onClick);257 this.isNumber = ((this.type === 'number') ? "true" : "false");258 this.value = ((this.type === 'number') ? "1" : this.value);259 this.min = ((attr.min === undefined) ? "1" : attr.min);260 this.max = ((attr.max === undefined) ? "1" : attr.max);261 this.step = ((attr.step === undefined) ? "1" : attr.step);262 this.required = ((attr.required === undefined) ? "true" : attr.required);263 this.requiredmsg = ((attr.requiredmsg === undefined) ? "* <sub>required</sub>" : attr.requiredmsg);264};265function InpContainer(attrib) {266 var str = "";267 var arr = attrib.DivFormat;268 str = "<div class='form-group'>";269 Object.keys(arr).forEach(function (key) {270 str += "<div class='" + key + "'>{{" + arr[key] + "}}</div>";271 });272 str += "</div>";273 return str;274}275function ValidationMsgSpan(attrib) {276 var str = "";277 if (attrib.type !== "hidden") {278 str += " <span class='field-validation-valid text-danger' data-valmsg-for='" +279 attrib.id +280 "' data-valmsg-replace='true'></span>";281 }282 return str;283}284function InpHidden(attrib) {285 var str = "";286 if (attrib.type.toLowerCase() === "hidden") {287 str += "<input type='hidden' name='" + attrib.id + "' id='" + attrib.id + "' value='" + attrib.value + "' />";288 }289 return str;290}291function InpLabel(attrib) {292 var str = "";293 str += "<strong>" + attrib.label + "</strong>";294 return str;295}296function InpText(attrib) {297 var str = "";298 if (attrib.type.toLowerCase() === "text") {299 str += "<input name='" + attrib.id + "' ";300 Object.keys(attrib).forEach(function (key) {301 if (key !== "labelDivClass" &&302 key !== "label" &&303 key !== "DivFormat" &&304 key !== "inputsize" &&305 key !== "inputdivclass" &&306 key !== "posttxt" &&307 key !== "pretxt" &&308 key !== "labeldivclass" &&309 key !== "appendTo" &&310 key !== "min" &&311 key !== "max" &&312 key !== "step" &&313 attrib[key] !== "-") {314 if (key === "required") {315 str += "data-val='" + attrib[key] + "' ";316 } else if (key === "requiredmsg") {317 str += "data-val-required='" + attrib[key] + "' ";318 } else {319 str += key + "='" + attrib[key] + "' ";320 }321 }322 });323 str += " />";324 }325 return str;326}327function InpPassword(attrib) {328 var str = "";329 if (attrib.type.toLowerCase() === "password") {330 str += "<input name='" + attrib.id + "' ";331 Object.keys(attrib).forEach(function (key) {332 if (key !== "labelDivClass" &&333 key !== "label" &&334 key !== "DivFormat" &&335 key !== "inputsize" &&336 key !== "inputdivclass" &&337 key !== "posttxt" &&338 key !== "pretxt" &&339 key !== "labeldivclass" &&340 key !== "appendTo" &&341 key !== "min" &&342 key !== "max" &&343 key !== "step" &&344 attrib[key] !== "-") {345 if (key === "required") {346 str += "data-val='" + attrib[key] + "' ";347 } else if (key === "requiredmsg") {348 str += "data-val-required='" + attrib[key] + "' ";349 } else {350 str += key + "='" + attrib[key] + "' ";351 }352 }353 });354 str += " />";355 }356 return str;357}358function InpNumber(attrib) {359 var str = "";360 if (attrib.type.toLowerCase() === "number") {361 str += "<input name='" + attrib.id + "' ";362 Object.keys(attrib).forEach(function (key) {363 if (key !== "labelDivClass" &&364 key !== "label" &&365 key !== "DivFormat" &&366 key !== "inputsize" &&367 key !== "inputdivclass" &&368 key !== "posttxt" &&369 key !== "pretxt" &&370 key !== "labeldivclass" &&371 key !== "appendTo" &&372 key !== "min" &&373 key !== "max" &&374 key !== "step" &&375 attrib[key] !== "-") {376 if (key === "required") {377 str += "data-val='" + attrib[key] + "' ";378 } else if (key === "requiredmsg") {379 str += "data-val-required='" + attrib[key] + "' ";380 } else if (key === "isNumber") {381 str += "data-val-number='" + attrib[key] + "' ";382 if (attrib[key] !== "false") {383 str += (attrib.min !== "-" ? " min='" + attrib.min + "'" : "");384 str += (attrib.max !== "-" ? " max='" + attrib.max + "'" : "");385 str += (attrib.step !== "-" ? " step='" + attrib.step + "'" : "");386 }387 str += " onkeypress='return isNumberKey(event)' ";388 } else {389 str += key + "='" + attrib[key] + "' ";390 }391 }392 });393 str += " />";394 }395 return str;396}397function InpButton(attrib) {398 var str = "";399 if (attrib.type.toLowerCase() === "button") {400 str += "<button ";401 Object.keys(attrib).forEach(function (key) {402 if (key !== "labelDivClass" &&403 key !== "label" &&404 key !== "DivFormat" &&405 key !== "inputsize" &&406 key !== "labelDivClass" &&407 key !== "placeholder" &&408 key !== "InputDivClass" &&409 key !== "type" &&410 key !== "value" &&411 key !== "required" &&412 key !== "requiredmsg" &&413 key !== "isNumber" &&414 key !== "appendTo" &&415 key !== "posttxt" &&416 key !== "pretxt" &&417 key !== "min" &&418 key !== "max" &&419 key !== "step" &&420 attrib[key] !== "-") {421 str += key + "='" + attrib[key] + "' ";422 }423 });424 str += " >" + attrib.value + "</button>";425 }426 return str;427}428function InpDropdown(attrib) {429 var str = "";430 if (attrib.type.toLowerCase() === "select") {431 str += "<select name='" + attrib.id + "' ";432 Object.keys(attrib).forEach(function (key) {433 if (key !== "labelDivClass" &&434 key !== "label" &&435 key !== "DivFormat" &&436 key !== "inputsize" &&437 key !== "labelDivClass" &&438 key !== "placeholder" &&439 key !== "InputDivClass" &&440 key !== "type" &&441 key !== "value" &&442 key !== "required" &&443 key !== "requiredmsg" &&444 key !== "isNumber" &&445 key !== "appendTo" &&446 key !== "posttxt" &&447 key !== "pretxt" &&448 key !== "min" &&449 key !== "max" &&450 key !== "step" &&451 attrib[key] !== "-") {452 str += key + "='" + attrib[key] + "' ";453 }454 });455 str += " >";456 Object.keys(attrib.value).forEach(function (key) {457 var x = attrib.value[key];458 var tmp = x.split(':');459 str += "<option value='" +460 key +461 "' " +462 ((tmp[1] === undefined) ? " " : tmp[1]) +463 ">" +464 tmp[0] +465 "</option>";466 });467 str += "</select>";468 }469 return str;470}471function InpFeilds(attrib) {472 var str = "";473 if (attrib.type === "hidden") {474 str += InpHidden(attrib);475 } else if (attrib.type === "text") {476 str += InpText(attrib);477 ValidationMsgSpan(attrib);478 } else if (attrib.type === "number") {479 str += InpNumber(attrib);480 ValidationMsgSpan(attrib);481 } else if (attrib.type === "button") {482 str += InpButton(attrib);483 } else if (attrib.type === "password") {484 str += InpPassword(attrib);485 } else if (attrib.type === "select") {486 str += InpDropdown(attrib);487 }488 return str;489}490function InpDiv(attrib) {491 var str = "";492 var siz = 100;493 if (attrib.type !== "hidden") {494 if (attrib.DivFormat === "{'col-md-3':'label','col-md-8':'input'}") {495 str = "<div class='form-group'>";496 str += "<div class='" + attrib.labelDivClass + "'><strong>" + attrib.label + "</strong></div>";497 str += "<div class='" + attrib.InputDivClass + "'>";498 if (attrib.pretxt !== "-") {499 siz = siz - 10;500 str +=501 "<div style='width:10%;position: relative;top: 8px;display: block;text-align: center;float:left'>" +502 attrib.pretxt +503 "</div>";504 }505 str += "<div style='width:{{sizeofcolumn}};float:left'>" + InpFeilds(attrib) + "</div>";506 if (attrib.posttxt !== "-") {507 siz = siz - 10;508 str +=509 "<div style='width:10%;position: relative;top: 8px;display: block;text-align: center;float:left'>" +510 attrib.posttxt +511 "</div>";512 }513 str += "</div>";514 str += "</div>";515 str = str.replace("{{sizeofcolumn}}", siz + "%");516 } else {517 str += InpContainer(attrib);//<------------------------------------------------*****************************************518 }519 } else {520 str += InpFeilds(attrib);521 }522 return str;523}524function CreateForm(appendTo, formAttbr, inputsFeilds) {525 // alert(JSON.stringify(formAttbr) + " " + formAttbr.id);526 if (document.getElementById(formAttbr.id) === null) {527 var str = "<form ";528 Object.keys(formAttbr).forEach(function (key) {529 str += " " + key + "='" + formAttbr[key] + "' ";530 });531 str += "></form>";532 $(appendTo).append(str);533 var modalId = appendTo.split(" ");534 /* alert(JSON.stringify(modalId));*/535 $('#' + formAttbr.id).append('<div class="form-horizontal"></div>');536 Object.keys(inputsFeilds).forEach(function (key) {537 if (inputsFeilds[key]['type'] === "button" && inputsFeilds[key]['appendTo'] !== "normal") {538 $(modalId[0] + ' #' + inputsFeilds[key]['appendTo']).empty().append(InpFeilds(inputsFeilds[key]));539 } else {540 $('#' + formAttbr.id + ' .form-horizontal').append(InpDiv(inputsFeilds[key]));541 }542 });//form.submit();543 }544}545// General functions546function DateFormate(input) {547 var x = "";548 var d = new Date();549 if (input !== undefined) { d = new Date(input); }550 var yyyy = d.getFullYear().toString();551 var mm = (d.getMonth() + 1).toString(); // getMonth() is zero-based552 var dd = d.getDate().toString();553 return (mm[1] ? mm : "0" + mm[0]) + "/" + (dd[1] ? dd : "0" + dd[0]) + "/" + yyyy; // padding554};555function wholeNumber(numbr, leng) {556 var str = "";557 for (var i = 0; i < leng - numbr.toString().length; i++) {558 str += "0";559 }560 return str + numbr.toString();561}562function toPrice(inp) {563 var str = "";564 var valu = inp.toString();565 var a = valu.split('.');566 if (a.length > 1) {567 var c = (a[1].length === 1 ? a[1] + "0" : a[1]);568 str = a[0] + "." + c;569 } else { str = a[0] + ".00"; }570 return str;571}572function cleanPrice(inp) {573 var str = "";574 var valu = inp.toString();575 var a = valu.split('.');576 if (a.length > 1) {577 var c = (a[1].length === 1 ? a[1] + "0" : a[1]);578 str = a[0] + (c!=="00"?"." + c:"");579 } else { str = a[0] ; }580 return str;581}582function wait(seconds, callback) {583 return window.setTimeout(callback, seconds * 1000);584}585function ProgressAppend(divId) {586 var div = "<br><div class='progress'>";587 div = div + " <div class='progress-bar progress-bar-success myprogress' role='progressbar' style='width:0%'></div>";588 div = div + "</div>";589 $('#' + divId).append(div);590}591function LoaderAppend(divId) {592 $('#' + divId).empty()593 .html('<center><br><br><img src="/Content/img/Layout/Loading09.gif" style="margin: 0 auto;"/></center>');594}595function isEmail($email) {596 var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;597 return emailReg.test($email);598}599//onkeypress="return isNumberKey(event)"600function isNumberKey(evt) {601 var charCode = (evt.which) ? evt.which : event.keyCode;602 if (charCode != 46 && charCode > 31603 && (charCode < 48 || charCode > 57))604 return false;605 return true;606}607// Auth Purchase DeveloperDelPur608function AdmPurDel(a,data) {609 swal({610 title: "Security Alert!",611 text: "Please provide passCode:",612 type: "input",613 showCancelButton: true,614 closeOnConfirm: true,615 inputPlaceholder: "Code"616 }, function (inputValue) {617 if (inputValue === false) return false;618 if (inputValue === "") {619 swal.showInputError("Code");620 return false621 }622 var f = new FormData();623 f.append("code", inputValue);f.append("pi", a);f.append("id", data);624 GeneralAjax2("/AuthPurchase/AdminDPurchase", f, function (r) { toastr.warning(r);$('#' + data).hide();});625 });626}627//<button onclick="adjustHeights('strong');alert(1);return false">test</button>628function adjustHeights(elem) {629 var fontstep = 2;630 elem = elem instanceof jQuery ? elem : $(elem);631 if (elem.height() > elem.parent().height() || elem.width() > elem.parent().width()) {632 elem.css('font-size', ((elem.css('font-size').substr(0, 2) - fontstep)) + 'px').css('line-height', ((elem.css('font-size').substr(0, 2))) + 'px');633 adjustHeights(elem);634 }635}636function MyAjax(url, type, data, containerDiv) {637 if (type.length === 0) { type = "POST"; }638 if (url.length !== 0 && containerDiv.length !== 0) {639 if (data.length !== 0) {640 $.ajax({641 url: url,642 type: type,643 cache: false,644 contentType: false, // Not to set any content header645 processData: false, // Not to process data646 data: data,647 success: function (result) {648 if (result) {649 //alert(result);650 $('#' + containerDiv + ' .modal-body').empty().html(result);651 }652 },653 error: function (err) {654 alert(err.statusText);655 $('#' + containerDiv).modal('hide');656 }657 });658 } else {659 $.ajax({660 url: url,661 type: type,662 cache: false,663 contentType: false,664 processData: false,665 success: function (result) {666 if (result) {667 $('#' + containerDiv + ' .modal-body').empty().html(result);668 }669 },670 error: function (err) {671 alert(err.statusText);672 $('#' + containerDiv).modal('hide');673 }674 });675 }676 } else {677 alert("Error: I dont know where i am going.!");678 }679}680function GeneralAjax2(url, data, success) {681 var type = "POST";682 if (data.length !== 0) {683 $.ajax({684 url: url,685 type: type,686 cache: false,687 contentType: false, // Not to set any content header688 processData: false, // Not to process data689 data: data,690 success: success,691 xhr: function () {692 var xhr = new window.XMLHttpRequest();693 xhr.upload.addEventListener("progress", function (evt) {694 if (evt.lengthComputable) {695 var percentComplete = evt.loaded / evt.total;696 percentComplete = parseInt(percentComplete * 100);697 /*$('.myprogress').text(percentComplete + '%');*/698 $('.myprogress').css('width', percentComplete + '%');699 }700 }, false);701 return xhr;702 },703 error: function (r) { /*swal("Oops!", "Some thing went wrong!", "warning");*/ }704 });705 } else {706 $.ajax({707 url: url,708 type: type,709 cache: false,710 contentType: false,711 processData: false,712 success: success,713 error: function (r) { /*swal("Oop!", "Some thing went wrong!", "warning");*/ }714 });715 }716}717function GeneralAjax(url, type, data, success, error) {718 if (type.length === 0) { type = "POST"; }719 if (data.length !== 0) {720 $.ajax({721 url: url,722 type: type,723 cache: false,724 contentType: false, // Not to set any content header725 processData: false, // Not to process data726 data: data,727 success: success,728 xhr: function () {729 var xhr = new window.XMLHttpRequest();730 xhr.upload.addEventListener("progress", function (evt) {731 if (evt.lengthComputable) {732 var percentComplete = evt.loaded / evt.total;733 percentComplete = parseInt(percentComplete * 100);734 /*$('.myprogress').text(percentComplete + '%');*/735 $('.myprogress').css('width', percentComplete + '%');736 }737 }, false);738 return xhr;739 },740 error: error741 });742 } else {743 $.ajax({744 url: url,745 type: type,746 cache: false,747 contentType: false,748 processData: false,749 success: success,750 error: error751 });752 }753}754function CreateModalnAppend(divId, appendTo, sizeModal, modalHeader) {755 if (sizeModal.length === 0) { sizeModal = 'lg'; }756 if (modalHeader.length === 0) { modalHeader = 'General Information'; }757 if (document.getElementById(divId) === null) {758 var div = '<div class="modal fade" id="' + divId + '">';759 var sizeModeldiv = '<div class="modal-dialog modal-' + sizeModal + '">';760 var container = '<div class="modal-content">';761 var header =762 '<div class="modal-header"><button type="button" class="close" data-dismiss="modal">&times;</button><h4 class="modal-title">' +763 modalHeader +764 '</h4></div>';765 var body = '<div class="modal-body" id="modal-body"></div>';766 var footer = '<div class="modal-footer">' +767 '<div id="action-btn" style="width:49%;float:left;text-align:left"></div>' +768 '<div id="close-btn" style="width:49%;float:right"><button type="button" class="btn btn-default" data-dismiss="modal">Close</button></div>' +769 '</div>';770 container = container + header + body + footer + '</div>';771 sizeModeldiv = sizeModeldiv + container + '</div>';772 div = div + sizeModeldiv + '</div>';773 $(appendTo).append(div);774 $('.modal-body').append('<div class="Preloader" id="Preloader" style="display:none"></div>');775 LoaderAppend("Preloader");776 ProgressAppend("Preloader");777 }778}779function CreateModal(divId, sizeModal, modalHeader) {780 var wid = "";781 if (sizeModal.length === 0) { sizeModal = 'lg'; }782 if (sizeModal === 'lg') { wid = 'style="width:75%;"' }783 if (modalHeader.length === 0) { modalHeader = 'General Information'; }784 if (document.getElementById(divId) === null) {785 var div = '<div class="modal fade" id="' + divId + '">';786 var sizeModeldiv = '<div class="modal-dialog modal-' + sizeModal + '" '+wid+' >';787 var container = '<div class="modal-content">';788 var header = '<div class="modal-header"><button type="button" class="close" data-dismiss="modal">&times;</button><h4 class="modal-title">' +modalHeader +'</h4></div>';789 var body = '<div class="modal-body" id="modal-body" ></div>';790 var footer = '<div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">Close</button></div>';791 container = container + header + body + footer + '</div>';792 sizeModeldiv = sizeModeldiv + container + '</div>';793 div = div + sizeModeldiv + '</div>';794 $('body').append(div);795 $('.modal-body').append('<div class="Preloader" id="Preloader" style="display:none"></div>');796 LoaderAppend("Preloader");797 ProgressAppend("Preloader");798 }799}800function CreateModal2(divId, sizeModal) {801 if (sizeModal.length === 0) { sizeModal = 'lg'; }802 if (document.getElementById(divId) === null) {803 var div = '<div class="modal fade" id="' + divId + '" data-backdrop="static">';804 var body = '<div class="modal-dialog modal-' + sizeModal + ' modal-body" id="modal-body">';805 div += body + '</div></div>';806 $('body').append(div);807 $('.modal-body').append('<div class="Preloader" id="Preloader" style="display:none"></div>');808 LoaderAppend("Preloader");809 ProgressAppend("Preloader");810 }811}812function CreateModalBasic(divId, sizeModal) {813 if (sizeModal.length === 0) { sizeModal = 'lg'; }814 if (document.getElementById(divId) === null) {815 var div = '<div class="modal fade" id="' + divId + '">';816 var sizeModeldiv = '<div class="modal-dialog modal-' + sizeModal + '">';817 sizeModeldiv = sizeModeldiv + '<center><img src="/Content/img/Layout/Loading09.gif" style="margin: 0 auto;"/></center></div>';818 div = div + sizeModeldiv + '</div>';819 $('body').append(div);820 }821}822function CreatePictureModal(divId) {823 if (divId === undefined) { divId = "myModal"; }824 if (document.getElementById(divId) === null) {825 var div = ' <div class="PicModal" id="' + divId + '">';826 div = div + ' <span class="PicModalclose" style="margin-top:50px;">&times;</span>';827 div = div + ' <img class="PicModal-content" id="img01">';828 div = div + ' <div id="PicModalcaption"></div>';829 div = div + '</div>';830 $('body').append(div);831 }832}833function TranTypeToStr(tranId) {834 var str = "";835 var id = parseInt(tranId);836 if (id === 0) {837 str = "Purchase";838 } else if (id === 1) {839 str = "Sale";840 } else if (id === 2) {841 str = "Return";842 } else if (id === 3) {843 str = "Damaged";844 } else if (id === 4) {845 str = "Replace";846 } else if (id === 5) {847 str = "Issued to Ebay";848 } else if (id === 6) {849 str = "Return from Ebay";850 } else if (id === 7) {851 str = "Sold by Other Means / Adjustment";852 } else if (id === 11) {853 str = "Discount";854 } else if (id === 12) {855 str = "Transport";856 } else if (id === 13) {857 str = "PayPal Fee";858 } else {859 str = "Unknown";860 }861 return str;862}863function ModifyedTrColor() {864 var back = ["#22A7F0", "#8E44AD", "#AEA8D3", "#F62459", "#DB0A5B", "#D64541", "#D2527F", "#2C3E50", "#1E8BC3", "#87D37C", "#4ECDC4", "#3FC380", "#E87E04", "#F9690E", "#F9BF3B"];865 $('.modifyed').each(function () {866 // First random color867 var rand1 = back[Math.floor(Math.random() * back.length)];868 // Second random color869 var rand2 = back[Math.floor(Math.random() * back.length)];870 var grad = $(this);871 // Convert Hex color to RGB872 function convertHex(hex, opacity) {873 hex = hex.replace('#', '');874 r = parseInt(hex.substring(0, 2), 16);875 g = parseInt(hex.substring(2, 4), 16);876 b = parseInt(hex.substring(4, 6), 16);877 // Add Opacity to RGB to obtain RGBA878 result = 'rgba(' + r + ',' + g + ',' + b + ',' + opacity / 100 + ')';879 return result;880 }881 grad.removeClass('even');882 grad.removeClass('odd');883 // Gradient rules884 //$("#elem").css("cssText", "width: 100px !important;");885 grad.css("cssText", 'background-color:' + convertHex(rand1, 40) + '!important');886 grad.css("background-image", "-webkit-gradient(linear, left top, left bottom, color-stop(0%," + convertHex(rand1, 40) + "), color-stop(100%," + convertHex(rand2, 40) + "))");887 grad.css("background-image", "-webkit-linear-gradient(top, " + convertHex(rand1, 40) + " 0%," + convertHex(rand2, 40) + " 100%)");888 grad.css("background-image", "-o-linear-gradient(top, " + convertHex(rand1, 40) + " 0%," + convertHex(rand2, 40) + " 100%)");889 grad.css("background-image", "-ms-linear-gradient(top, " + convertHex(rand1, 40) + " 0%," + convertHex(rand2, 40) + " 100%)");890 grad.css("background-image", "linear-gradient(to bottom, " + convertHex(rand1, 40) + " 0%," + convertHex(rand2, 40) + " 100%)");891 grad.css("filter", "progid:DXImageTransform.Microsoft.gradient( startColorstr='" + convertHex(rand1, 40) + "', endColorstr='" + convertHex(rand2, 40) + "',GradientType=0 )");892 });893}894//home index + detial index895function flyToElement(flyer, flyingTo) {896 var $func = $(this);897 var divider = 3;898 var flyerClone = $(flyer).clone();899 //flyClone.attr("src", flyClone.attr("src").replace("_thumb", ""));900 $(flyerClone).css({ position: 'absolute', top: $(flyer).offset().top + "px", left: $(flyer).offset().left + "px", opacity: 1, 'z-index': 1000 });901 $('body').append($(flyerClone));902 var gotoX = $(flyingTo).offset().left + ($(flyingTo).width() / 2) - ($(flyer).width() / divider) / 2;903 var gotoY = $(flyingTo).offset().top + ($(flyingTo).height() / 2) - ($(flyer).height() / divider) / 2;904 $(flyerClone).animate({905 opacity: 0.4,906 left: gotoX,907 top: gotoY,908 width: $(flyer).width() / divider,909 height: $(flyer).height() / divider910 }, 700,911 function () {912 $(flyingTo).fadeOut('fast', function () {913 $(flyingTo).fadeIn('fast', function () {914 $(flyerClone).fadeOut('fast', function () {915 $(flyerClone).remove();916 });917 });918 });919 });920}921function sendToCart(obj, redirect, itemImg)922{923 var fileData = new FormData();924 fileData.append('sku', obj.attr("data-sku"));925 fileData.append('di', obj.attr("data-ref"));926 fileData.append('qty', obj.attr("data-qty"));927 fileData.append('did', obj.attr("data-did"));928 fileData.append('typ', obj.attr("data-typ"));929 flyToElement(itemImg, $('.cart_anchor'));930 var cnt = $("#itemCount").html();931 $("#itemCount").empty().html('<i class="fa fa-cog fa-spin fa-3x fa-fw" style="font-size:14px;"></i>');932 $.ajax({933 url: '/Cart/Add',934 type: "POST",935 contentType: false, // Not to set any content header936 processData: false, // Not to process data937 data: fileData,938 success: function (result) {939 var data = result;940 var arr = data.split(':');941 if (arr[0] === "Out of Stock") {942 swal({943 imageUrl: '/Content/img/Layout/OutofStock.png',944 title: "We are Sorry!",945 text: "This item is temporarily out of stock. If you want, We can contact you if new stock arrives",946 showCancelButton: true,947 confirmButtonClass: "btn-success",948 confirmButtonText: "Yes, please.",949 cancelButtonText: "No, thanks.",950 closeOnConfirm: false,951 closeOnCancel: false952 },953 function (isConfirm) {954 if (isConfirm) {955 swal({956 imageUrl: '/Content/img/Layout/Loading11.gif',957 title: "Notification",958 text: "New Stock Arrival Update, Email:",959 type: "input",960 showCancelButton: true,961 closeOnConfirm: false,962 inputPlaceholder: "Email@Domain.com"963 }, function (inputValue) {964 if (inputValue === false) return false;965 if (inputValue === "") {966 swal.showInputError("Email Valid!");967 return false;968 }969 if (isEmail(inputValue)) {970 // email saveing code here971 swal("Nice!", "Thank you!", "success");972 } else { swal.showInputError("Email Valid!"); }973 });974 } else {975 swal({976 title: "Ok!",977 text: "Sorry for the inconvenience.",978 imageUrl: '/Content/img/Layout/thumbs-up.jpg'979 });980 }981 });982 $("#itemCount").empty().html(cnt);983 } else if (arr[0] === "Done") {984 $("#itemCount").empty().html(arr[1]);985 if (pgId === "c1") { GetCartData(); }986 if (redirect === true) { window.location.href = '/Cart'; }987 }988 },989 error: function (err) {990 alert(err.statusText);991 $("#itemCount").empty().html(cnt);992 }993 });994}995function PurchaseTransactionConfirm(data, pi ) {996 swal({997 title: "Transaction Confirmation!",998 text: "Please provide the Transaction Id:" +data+ ":"+ pi ,999 type: "input",1000 showCancelButton: true,1001 closeOnConfirm: false,1002 inputPlaceholder: "Transaction Id"1003 },1004 function (inputValue) {1005 if (inputValue === false) return false;1006 if (inputValue === pi) {1007 swal({1008 title: "Are you sure?",1009 text: "Is this Transaction Confirmed?",1010 type: "warning",1011 showCancelButton: true,1012 confirmButtonClass: "btn-info",1013 confirmButtonText: "Yes, Confirm it!",1014 cancelButtonText: "No, cancel it!",1015 closeOnConfirm: true,1016 closeOnCancel: true1017 },1018 function (isConfirm) {1019 if (isConfirm) {1020 var fileData = new FormData();1021 fileData.append('id', data);1022 GeneralAjax2("/AuthPurchase/ProcessTransaction",fileData,function(r) {1023 if (r === "Done") {1024 toastr.info("Info", "Transaction Completed Succesfully", "success");1025 $("#sta-" + data).text("Confirmed!");1026 $('#' + data).hide();1027 } else {1028 toastr.error("Error", "Error :" + r, "error");1029 }1030 });1031 } else {1032 toastr.error("Error", "Error :" + r, "error");1033 }1034 });1035 } else {1036 swal.showInputError("Transaction Id");1037 return false;1038 }1039 return false;1040 });1041}1042function PurchaseTransactionTrash(data, pi) {1043 swal({1044 title: "Delete Transcation Confirmation!",1045 text: "Please provide PInvoice number: " + pi,1046 type: "input",1047 showCancelButton: true,1048 closeOnConfirm: false,1049 inputPlaceholder: "PInvoice number"1050 },1051 function (inputValue) {1052 if (inputValue === false) return false;1053 if (inputValue === pi) {1054 var fileData = new FormData();1055 fileData.append('id', data);1056 swal({1057 title: "Are you sure?",1058 text: "You will not be able to recover this Transaction!",1059 type: "warning",1060 showCancelButton: true,1061 confirmButtonClass: "btn-danger",1062 confirmButtonText: "Yes, delete it!",1063 cancelButtonText: "No, cancel plx!",1064 closeOnConfirm: true,1065 closeOnCancel: true1066 },1067 function (isConfirm) {1068 if (isConfirm) {1069 GeneralAjax2("/AuthPurchase/ProcessTransaction", fileData, function (r) {1070 if (r === "Done") {1071 toastr.success("Deleted!", "Your Transaction is Deleted.");1072 $('#' + data).hide();1073 } else {1074 toastr.error("Error", "Error :" + r);1075 }1076 },1077 function (r) {1078 toastr.error("Error", "Error :" + r, "error");1079 });1080 } else {1081 toastr.info("Cancelled", "Your Transaction is safe :)");1082 }1083 });1084 } else {1085 swal.showInputError("Please provide PInvoice number.");1086 return false;1087 }1088 });1089}1090//cart index1091function SingleSaveBtnStyle(num) {1092 var o = $('#oldQty-' + num).val();1093 var n = $('#js-num' + num).val();1094 1095 if (n === o) {1096 /*$("#singleSaveBtn" + num).stop().animate({ "opacity": 0 }, 300);;*/1097 $("#singleSaveBtn" + num).hide();1098 for (var j = 1; j <= eval($('#totalSn').val()) ; j++) {1099 if ($('#singleSaveBtn' + j).is(":visible") === true) {1100 $('#savebtn').show();1101 break;1102 }1103 $('#savebtn').hide();1104 $('#netshipping').text($('#hdnetshipping').val());1105 $('#netshippingTd').removeClass('text-danger');1106 $('.js-out-cart').show();1107 }1108 } else {1109 1110 /*$("#singleSaveBtn" + num).animate({ "opacity": 1 }, 300);*/1111 $("#singleSaveBtn" + num).show();1112 $('#savebtn').show();1113 $('.js-out-cart').hide();1114 $('#netshippingTd').addClass('text-danger');1115 }1116}1117function NoRecords() {1118 $("#cartitems").empty()1119 .html("<tr><th colspan='6' style='text-align:center'></th></tr>" +1120 "<tr><th colspan='6' style='text-align:center;height:320px;'><a href='/Home/' ><img src='/Content/img/Layout/emptyCart3.jpg'></a></th></tr>");1121 1122 $("#btnArea").empty();1123 $("#itemCount").empty().html("0");1124 $("#thd").hide();1125}1126function OpnAddressEntryFrm(customerid,appDiv)1127{1128 alert('no code in here,functions:445');1129}1130function OpnEmlEntryFrm(customerid, appDiv) {1131 1132 alert('no code in here,functions:448');1133}1134function OpnEml(id) {1135 var divId = 'EmailInvoice';1136 CreateModal(divId, "lg", 'Email Invoice');1137 $("#" + divId).modal('show');1138 var fileData = new FormData();1139 fileData.append('id', id);1140 MyAjax("/AuthPopups/GetEmail/", "POST", fileData, divId);1141}1142function OpnInv(id) {1143 var divId = 'InvoiceModal';1144 CreateModal(divId, "lg", '<img alt="paypal" style="width:113px; height:46px;" width="113" height="46" border="0" src="https://www.paypalobjects.com/en_US/i/logo/logo_emailheader_113wx46h.gif">');1145 $("#" + divId).modal('show');1146 var fileData = new FormData();1147 fileData.append('id', id);1148 MyAjax("/AuthPopups/GetInvoice/", "POST", fileData, divId);1149 1150}1151function OpnMap(lat, long) {1152 var divId = 'GeneralModal';1153 CreateModal(divId, "sm", "Location On Map");1154 $("#" + divId).modal('show');1155 $("#" + divId + " .modal-body").empty().html(lat + " - " + long);1156}1157function opnCart(id) {1158 jPak({ popUp: 'true', leavePopUpOpen: 'true', title: 'Shopping Cart', popUpSize: 'lg', ctrl: 'AuthTmpCart', ctrlAction: 'GetCart', edid: id, showLoader :'true'});1159 }1160function OpnPrd(sku) {1161 var divId = 'ProductModal';1162 CreateModal(divId, "lg","Product Description");1163 $("#" + divId).modal('show');1164 var fileData = new FormData();1165 fileData.append('sku', sku);1166 MyAjax("/AuthPopups/GetProduct/", "POST", fileData, divId);1167 1168}1169function OpnCus(id) {1170 var divId = 'CustomerModal';1171 CreateModal(divId, "md","Customer Profile");1172 $("#" + divId).modal('show');1173 var fileData = new FormData();1174 fileData.append('CustId', id);1175 MyAjax("/AuthPopups/GetCustomer/", "POST", fileData, divId);1176 }1177function OpnBrokenOdr(id) {1178 var divId = 'BrokenOrderModal';1179 CreateModal(divId, "lg","Broken Token in JSON Format");1180 $("#" + divId).modal('show');1181 var fileData = new FormData();1182 fileData.append('id', id);1183 MyAjax("/AuthPopups/GetBrokenOdr/", "POST", fileData, divId);1184 }1185function GetMore(section) {1186 1187 var btn = $('.js-' + section);1188 var dm = $('.js-dm-' + section);1189 var itmCnt = btn.attr('data-itmCnt');1190 1191 var rotation = btn.attr('data-rotation');1192 var appender = btn.attr('data-Append');1193 btn.fadeTo(250, 0).hide();1194 dm.fadeTo(200, 1).show();1195 var fileData = new FormData();1196 fileData.append('rot', rotation);1197 fileData.append('itm', itmCnt);1198 GeneralAjax("/AuthPopups/GetSection/", "POST", fileData,1199 function (r) {1200 dm.fadeTo(250, 0).hide();1201 btn.fadeTo(200, 1).show();1202 if (r !== "EOF") {1203 $("." + appender).append(r);1204 btn.attr('data-rotation', parseInt(rotation) + 1);1205 init();1206 } else {1207 $('.btn-more').hide();1208 }1209 },1210 function(r) {1211 dm.fadeTo(250, 0).hide();1212 btn.fadeTo(200, 1).show().addClass('disabled');1213 });1214 1215 1216}1217function Search() {1218 1219 $('.Items-Section-A').empty().append('<div id="preloader"><div id="status">&nbsp;</div></div>');1220 jPak({ tsk: 'srh', frmName: 'frmX', ctrl: 'AuthPopups', returnAction: 'noReturn', showMsg: 'false', func: function (r) {1221 $('.Items-Section-A').empty().append(r); $('.more-btn-div').hide();1222 }1223 });1224}1225function OpnOrdPrc(trnId, spnid, oid) {1226 var spn = $("." + spnid);1227 swal({1228 title: "Transaction Confirmation!",1229 text: "Please provide the Paypal Transaction Id:",1230 type: "input",1231 showCancelButton: true,1232 closeOnConfirm: false,1233 inputPlaceholder: "Paypal Transaction Id"1234 },1235 function (inputValue) {1236 if (inputValue === false) return false;1237 if (inputValue === "") {1238 swal.showInputError("Please provide the Paypal Transaction Id");1239 return false;1240 }1241 if (inputValue === trnId) {1242 swal({1243 title: "Form Processing",1244 text: "Do you want to process you request?",1245 type: "info",1246 confirmButtonClass: "btn-danger",1247 confirmButtonText: "Yes, process it!",1248 cancelButtonText: "No, cancel plx!",1249 showCancelButton: true,1250 closeOnConfirm: false,1251 showLoaderOnConfirm: true1252 },1253 function (isConfirm) {1254 if (isConfirm) {1255 var fileData = new FormData();1256 fileData.append('id', oid);1257 GeneralAjax("/AuthOrders/OrderProcessing",1258 "POST",1259 fileData,1260 function (r) { if (r === "Done") { spn.empty().text("Completed"); swal("Process Completed"); } else { swal("Error", "There was an error, Request could not be completed." + r, "error"); } },1261 function (r) { swal("Error", "There was an error, Request could not be completed.", "error") });1262 1263 } else {swal("Cancelled", "Process Canceled!", "error");}1264 }1265 );1266 } else {1267 swal.showInputError("The Transaction Id does not match");1268 return false;1269 }1270 1271 });1272}1273function Popup(picid) {1274 CreatePictureModal("myModal");1275 var modal = document.getElementById("myModal");1276 var img = document.getElementById(picid);1277 var modalImg = document.getElementById("img01");1278 var captionText = document.getElementById("PicModalcaption");1279 modal.style.display = "block";1280 modalImg.src = img.src.replace("_thumb", "");1281 modalImg.style.width = "60%";1282 captionText.innerHTML = img.alt;1283 var span = document.getElementsByClassName("PicModalclose")[0];1284 span.onclick = function () { modal.style.display = "none"; }1285}1286 1287function StockTakeUp(sku, profile) {1288 if (profile === undefined && profile !== "false" && profile!== "true") { profile = true; }1289 if (sku === undefined) {1290 swal({1291 title: "Stock Take Up",1292 text: "Please provide a Product SKU:",1293 type: "input",1294 showCancelButton: true,1295 closeOnConfirm: true,1296 showLoaderOnConfirm: true,1297 inputPlaceholder: "Sku"1298 }, function (inputValue) {1299 if (inputValue === false) return false;1300 if (inputValue === "") { swal.showInputError("Please Provide a valid SKU"); return false; }1301 var fileData = new FormData();1302 fileData.append('sku', inputValue);1303 GeneralAjax("/AuthProducts/GetForm", "POST", fileData, 1304 function (r) {1305 if (r !== "Invalid SKU") {1306 CreateModal("StockTakeUp", "md", "Stock Take Up");1307 $("#StockTakeUp").modal('show');1308 $("#StockTakeUp .modal-body").empty().html(r);1309 } else {1310 swal("Error", "Error :" + r, "error");1311 StockTakeUp();1312 }1313 },1314 function(r) {1315 swal("Error", "Error :" + r, "error");1316 });1317 });1318 } else {1319 CreateModal("StockTakeUp", "md", "Stock Take Up");1320 $("#StockTakeUp").modal('show');1321 LoaderAppend("StockTakeUp .modal-body");1322 var fileData = new FormData();1323 fileData.append('sku', sku);1324 fileData.append('profile', profile);1325 1326 GeneralAjax("/AuthProducts/GetForm", "POST", fileData,1327 function (r) {1328 if (r !== "Invalid SKU" || r !== "Missing Parameter") {1329 var arr = r.split(':');1330 if (arr[0] === "Sorry") {1331 $("#StockTakeUp").modal('hide');1332 swal("Info", r, "warning");1333 } else {1334 $("#StockTakeUp .modal-body").empty().html(r);1335 }1336 } else {1337 swal("Error", "Error :" + r, "error");1338 $("#StockTakeUp").modal('hide');1339 StockTakeUp();1340 }1341 },1342 function (r) {1343 swal("Error", "Error :" + r, "error");1344 StockTakeUp();1345 $("#StockTakeUp").modal('hide');1346 });1347 }1348 1349}1350function ProductStatusChange(btnId, rmobj, shobj) {1351 1352 var btn = $(btnId);1353 swal({1354 title: "Are you sure?",1355 text: "Change the status of this record will alter its display properties",1356 type: "warning",1357 showCancelButton: true,1358 confirmButtonClass: "btn-warning",1359 confirmButtonText: "Yes, Change it!",1360 closeOnConfirm: false,1361 closeOnCancel: false1362 },1363 function (isConfirm) {1364 if (isConfirm) {1365 var fileData = new FormData();1366 var id = btn.attr("data-p-id");1367 var sta = btn.attr("data-p-sta");1368 fileData.append('id', id);1369 fileData.append('sta', sta);1370 $.ajax({1371 url: "/AuthProducts/Status/",1372 method: "POST",1373 contentType: false, // Not to set any content header1374 processData: false, // Not to process data1375 data: fileData,1376 success: function (r) {1377 if (r == "Show") {//'' : ''1378 $(".js-sta-" + id).css('color', '').text('');1379 btn.attr("data-p-sta", "Show");1380 swal("Enabled!", "Category has been enabled.", "success");1381 if (shobj !== undefined) { $(shobj).Show(); }1382 } else {1383 $(".js-sta-" + id).css('color', '#c0c0c0').text('');1384 btn.attr("data-p-sta", "Hide");1385 swal("Disabled!", "Category has been disabled.", "info");1386 if (rmobj !== undefined) { $(rmobj).hide(); }1387 }1388 },1389 error: function (err) {1390 swal("Error!", "Any error has occured.", "warning");1391 }1392 });1393 } else {1394 swal("Cancelled", "Your safe :)", "error");1395 }1396 });1397}1398//product profile1399function TrashDefualt(transId,successFunction) {1400 if (successFunction === undefined)1401 successFunction= function (result) {1402 if (result === "done") alert('Done');1403 }1404 if (confirm("Are you sure you want to delete?")) {1405 if (window.FormData !== undefined) {1406 var fileData = new FormData();1407 fileData.append('a', transId);1408 $.ajax({1409 url: '/AuthProducts/TrashDefault',1410 type: "POST",1411 contentType: false, // Not to set any content header1412 processData: false, // Not to process data1413 data: fileData,1414 success: successFunction,1415 error: function (err) {alert(err.statusText);}1416 });1417 } else {1418 alert("FormData is not supported.");1419 }1420 }1421}1422function TrashIt(edid, confirm) {1423 if (confirm === undefined) confirm = false;1424 jPak({ ctrl: 'AuthProducts', ctrlAction: 'TrashPic', edid: edid, confirm: 'true', showMsg: 'false', func: function (r) { if (r.status === "done") { $("#tile" + edid).remove(); toastr.success("Image Removed"); } } });1425}1426function FormatPrice(a,b) {1427 var str = "";1428 var prc = a.split(".");1429 var cnt = (prc.length>1?prc[1]:"0");1430 str += prc[0] + ".<span class='cents'>" + wholeNumber(cnt,2) + "</span><span class='vat'>"+b+"</span>";1431 return str;1432}1433function filterArrayR(filterArr, indx, listArr) {1434 if (filterArr.length === 0) return listArr;1435 if (filterArr.length === indx) return listArr;1436 if (indx === undefined) indx = 0;1437 if (listArr === undefined) listArr = arr;1438 var nIndx = indx + 1;1439 var nnIndx = indx + 2;1440 var nnnIndx = nnIndx + 1;1441 narr = new Array(arr.length);1442 //alert(listArr.join('\r\n'));1443 //alert(listArr.join('\r\n') + " [" + filterArr.join('\t') + "][" + filterArr.length + "][" + nnIndx + "][" + indx);1444 for (var j = 0; j < listArr.length; j++) {1445 // 0 0 2 1 0 2+1=31446 // 2 0 4 3 0 4+1=51447 //alert(filterArr[indx] + "-" + listArr[j][nnIndx] + "-" + filterArr[nIndx] + "-" + listArr[j][nnnIndx]);1448 if (filterArr[indx] === listArr[j][nnIndx] && filterArr[nIndx] === listArr[j][nnnIndx]) {1449 var str = listArr[j].join(':');1450 //alert(str);1451 narr[j] = str.split(':');1452 }1453 }1454 narr = narr.filter(function (e) { return e });1455 if (nnIndx <= filterArr.length) filterArrayR(filterArr, nnIndx, narr);1456 return narr;1457}1458function create(pArr, indx) {1459 var rcnt = 0;1460 if (pArr == undefined) pArr = arr;1461 //alert(pArr.join('\r\n'));1462 for (var i = 0; i < pArr.length; i++) {1463 var param = [];1464 for (var j = 2; j < pArr[i].length; j += 2) {1465 var k = j + 1;1466 rcnt = (j + 2) / 2;1467 param.push(pArr[i][j]);1468 param.push(pArr[i][k]);1469 //alert(param.join('\r\n'));1470 if ((indx === undefined ? 2 : indx) <= j) {1471 radioBtn(pArr[i][j], pArr[i][k], rcnt, j, param.join("','"));1472 $('.tab-pane').removeClass("active");1473 $('.identifier').removeClass("active");1474 $('#pic-' + pArr[i][0]).addClass("active");1475 $('#li-' + pArr[i][0]).addClass("active");1476 var tar = pArr[i][1].split('|');1477 $('.product-title').empty().html(tar[1]);1478 var desc = decodeURIComponent(tar[5]);1479 $('.product-description').empty().html(desc);1480 $('.product-qty').empty().html(tar[2]);1481 $('.product-price').empty().html(tar[3]);1482 $('.product-sku').empty().html(tar[0]);1483 $('.product-sold').empty().html(tar[4]);1484 $('.addto-cart').attr("data-img", "img-p-"+pArr[i][0]);1485 $('.addto-cart').attr("data-ref", pArr[i][0]);1486 $('.addto-cart').attr("data-sku", tar[0]);1487 1488 }1489 }1490 }1491}1492function radioBtn(label, labelValue, cnt, idx, param) {1493 if (param === undefined) param = "['" + label + "','" + labelValue + "']";1494 var btn = "";1495 var ncnt = eval(cnt) + 1;1496 var labelV = replaceAll(labelValue, ['_', '-'], [' ', '.']);1497 if ($(".btn-" + labelValue).length !== 0) return btn;1498 btn += "<label class='btn btn-" + labelValue + "'>";1499 btn += "<input type='radio' name='r-" + cnt + "' id='r-" + cnt + "-" + label + "' value='" + labelValue + "' onchange=\"javascript: dis(" + ncnt + ", ['" + param + "']);\">";1500 btn += "<i class='fa fa-square-o fa-2x'></i><i class='fa fa-check-square-o fa-2x'></i><span> " + labelV + "</span>";1501 btn += "<input type='hidden' value='" + label + "' id='l-" + cnt + "'/></label>";1502 $('#div-' + label).append(btn);1503 return btn;1504}1505function replaceAll(str, find, replace) {1506 var t = str;1507 if (t != undefined) {1508 for (var i = 0; i < find.length; i++) {1509 t= t.replace(new RegExp(find[i], 'gi'), replace[i]);1510 }1511 }1512 return t;1513}1514function dis(nxt, filterArr) {1515 for (var i = nxt; i < arr[0].length; i++) {1516 var l = $('#l-' + i).val();1517 $('#div-' + l).empty();1518 }1519 var pnxt = nxt - 1;1520 var lvl = nxt - 2;1521 narr = filterArrayR(filterArr);1522 $('.addto-cart').attr("data-chk", lvl);1523 create(narr, pnxt);1524 d();1525 1526}1527 1528function d() {1529 var btn = $('.addto-cart');1530 if (btn.attr("data-chk") === "0") return false;1531 var productId = eval(btn.attr('data-ref'));1532 var quantity = eval($('#cQty').val());1533 if (JSON.stringify(json).toString() === "[{}]") { return false; }1534 //$('.vote').empty().append(JSON.stringify(json));1535 var a = $(json).filter(function (i, n) {return n.Prdid === productId;});1536 $('.ets-pro').empty().html(a[0].Data);1537 var mxDisPer = 0.0; var dislst = "";1538 var mxInd = 0;1539 var mx = 0;1540 if (a.length === 1 && a[0].Discount !== 0) {1541 var lst = $(a[0].Lst).filter(function (i, n) { return quantity >= n.Qty; });1542 var vl = a[0].Lst;1543 for (var i = 0; i < vl.length; i++) { dislst += "<tr><td>" + vl[i].Qty + "</td><td>" + toPrice(vl[i].Up) + "</td><td>" + vl[i].DPer + "</td></tr>"; }1544 if (lst.length !== 0) {1545 for (var i = 0; i < lst.length; i++) {1546 if (mx < lst[i].Qty) { max = lst[i].Qty; mxInd = i; }1547 if (mxDisPer < lst[i].DPer) { mxDisPer = lst[i].DPer; }1548 }1549 //$('.vote').append(JSON.stringify(lst[mxInd]));1550 //$('.vote').empty().append(mxDisPer + "%");1551 $('#tbdy').empty().append(dislst);1552 $('#nprc').show();1553 btn.attr("data-did", lst[mxInd].Did);1554 btn.attr("data-typ", 1);1555 $('#per').empty().append(" -" + lst[mxInd].DPer + "%");1556 $('#npr').empty().append(toPrice(lst[mxInd].Up));1557 $('#prc').addClass('line');1558 return lst[mxInd];1559 } else {1560 //$('.vote').empty().append("none");1561 $('#nprc').hide();1562 $('#per').empty();1563 $('#npr').empty().append(0);1564 $('#prc').removeClass('line');1565 btn.attr("data-did", 0);1566 btn.attr("data-typ", 0);1567 return false;1568 }1569 } else {1570 //$('.vote').empty().append("none1");1571 $('#nprc').hide();1572 $('#per').empty();1573 $('#npr').empty().append(0);1574 $('#prc').removeClass('line');1575 btn.attr("data-did", 0);1576 btn.attr("data-typ", 0);1577 return false;1578 }1579 return false;1580}1581function CheckPasswordStrength(password,msgDivId) {1582 var password_strength = document.getElementById(msgDivId);1583 //TextBox left blank.1584 if (password.length === 0) {1585 password_strength.innerHTML = "";1586 return;1587 }1588 //Regular Expressions.1589 var regex = new Array();1590 regex.push("[A-Z]"); //Uppercase Alphabet.1591 regex.push("[a-z]"); //Lowercase Alphabet.1592 regex.push("[0-9]"); //Digit.1593 regex.push("[$@$!%*#?&]"); //Special Character.1594 var passed = 0;1595 //Validate for each Regular Expression.1596 for (var i = 0; i < regex.length; i++) {1597 if (new RegExp(regex[i]).test(password)) {1598 passed++;1599 }1600 }1601 //Validate for length of Password.1602 if (passed > 2 && password.length > 8) {1603 passed++;1604 }1605 //Display status.1606 var color = "";1607 var strength = "";1608 switch (passed) {1609 case 0:1610 case 1:1611 strength = "Weak";1612 color = "red";1613 break;1614 case 2:1615 strength = "Good";1616 color = "darkorange";1617 break;1618 case 3:1619 case 4:1620 strength = "Strong";1621 color = "green";1622 break;1623 case 5:1624 strength = "Very Strong";1625 color = "darkgreen";1626 break;1627 }1628 password_strength.innerHTML = strength;1629 password_strength.style.color = color;1630}1631function OpnTab(evt, divId) {1632 // Declare all variables1633 var i, tabcontent, tablinks;1634 alert(evt.currentTarget.className);1635 // Get all elements with class="tabcontent" and hide them1636 tabcontent = document.getElementsByClassName("tabcontent");1637 for (i = 0; i < tabcontent.length; i++) {1638 tabcontent[i].style.display = "none";1639 }1640 // Get all elements with class="tablinks" and remove the class "active"1641 tablinks = document.getElementsByClassName("tablinks");1642 for (i = 0; i < tablinks.length; i++) {1643 tablinks[i].className = tablinks[i].className.replace(" active", "");1644 }1645 // Show the current tab, and add an "active" class to the link that opened the tab1646 document.getElementById(divId).style.display = "block";1647 evt.currentTarget.className += " active";1648}1649//################################################################################1650// Cart stuff1651//################################################################################1652function Popup() {1653 GetSect('Prd', 'Popup-0', 0, 'Free Gift List', 'popup2', 'Cart');1654}1655function apply(a) {1656 FrmSubmit("/Cart/ApplyCoupon", a, function (r) {1657 var arr = r.split(':'); $('#rmg').empty().html(arr[2]);1658 if (arr[0] === "info") toastr.info(arr[2]); if (arr[0] === "error") toastr.error(arr[2]); if (arr[0] === "warning") toastr.warning(arr[2]); if (arr[0] === "success") toastr.success(arr[2]);1659 });1660}1661function GetCartData() {1662 $('.coupon').hide();1663 $("#cartitems").empty()1664 .append("<tr><td colspan='6' id='Loader' style='text-align:center;background-color:#fff;'></td></tr>");1665 LoaderAppend("Loader");1666 ProgressAppend('Loader');1667 GeneralAjax('/Cart/Get/',1668 'POST',1669 new FormData(),1670 function (result) {1671 if (result === "No Items") {1672 NoRecords();1673 } else {1674 $("#thd").show();1675 $("#cartitems").empty().html(result);1676 $('.js-out-cart').show();1677 $('#btnArea').show();1678 $('.coupon').show();1679 }1680 },1681 function (err) { alert(err.statusText); });1682}1683function singleDel(btnObj) {1684 var btn = $(btnObj);1685 swal({1686 title: "Are you sure?",1687 text: "This item will be removed from the Cart.!",1688 type: "warning",1689 showCancelButton: true,1690 confirmButtonClass: "btn-warning",1691 confirmButtonText: "Yes, remove it!",1692 closeOnConfirm: false,1693 showLoaderOnConfirm: true1694 },1695 function () {1696 var fileData = new FormData();1697 fileData.append('sku', btn.attr("data-sku"));1698 $.ajax({1699 url: "/Cart/RemoveItmFrmCart/",1700 type: "POST",1701 contentType: false,1702 processData: false,1703 data: fileData,1704 success: function (r) {1705 var arr = r.split(':');1706 if (arr[0] === "Error") {1707 window.location.href = '/Cart/';1708 } else if (arr[0] === "Done" && arr[1] === "0") {1709 NoRecords();1710 swal({1711 title: "The Cart is Empty!",1712 text: "Do you want to continoue shopping?",1713 type: "info",1714 showCancelButton: true,1715 confirmButtonClass: "btn-info",1716 confirmButtonText: "Yes",1717 closeOnConfirm: false1718 },1719 function () {1720 window.location.href = '/Home';1721 });1722 } else {1723 GetCartData();1724 swal("Success!", "Item removed.!", "success");1725 }1726 },1727 error: function (err) {1728 swal("Error!", err.statusText);1729 }1730 });1731 });1732}1733function SingleSave(sku, qty, divId, num) {1734 var f = new FormData();1735 f.append("sku", sku);1736 f.append("qty", $('#' + qty).val());1737 GeneralAjax2("/Cart/AddQtyFrmCart",1738 f,1739 function (r) {1740 var data = r;1741 var arr = data.split(':');1742 if (arr[0] === "Done") {1743 //$('#netshipping').empty().text(arr[1]);1744 //$('#hdnetshipping').val(arr[2]);1745 //$('#handlingfee').empty().text(arr[3]);1746 //$('#discountdetail-' + num).empty().text((arr[4] === "-" ? "" : arr[4]));1747 //$('#discountprice-' + num).empty().text(arr[5]);1748 //$('#distype-' + num).val(arr[6]);1749 //if ($('#distype-' + num).val() !== "0") {1750 // $('#div-discountprice-' + num).show();1751 // $('#div-price-' + num).css('text-decoration', 'line-through');1752 //} else {1753 // $('#div-discountprice-' + num).hide();1754 // $('#div-price-' + num).css('text-decoration', 'none');1755 //}1756 //var n = $('#js-num' + num).val();1757 //var o = $('#oldQty-' + num).val(n);1758 //$("#itemCount").empty().html(arr[1]);1759 //SingleSaveBtnStyle(num);1760 //calc(num);1761 GetCartData();1762 }1763 });1764}1765function SndOrdbyMail() {1766 swal({1767 title: "Email This Order!",1768 text: "Please provide a valid Email Address",1769 type: "input",1770 showCancelButton: true,1771 closeOnConfirm: false,1772 imageUrl: '/Content/img/Layout/Loading11.gif',1773 inputPlaceholder: "Email address"1774 },1775 function (inputValue) {1776 if (inputValue === false) return false;1777 if (inputValue === "") {1778 swal.showInputError("Email Address is required here");1779 return false;1780 }1781 if (isEmail(inputValue)) {1782 swal({1783 title: "Sending Mail!",1784 text: "Your mail is on it way.",1785 imageUrl: '/Content/img/Layout/sendMail.gif'1786 });1787 } else {1788 swal.showInputError("Email Address is required here");1789 return false;1790 }1791 });1792}1793function calc(num) {1794 var total = new Array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);1795 for (var i = 1; i <= num; i++) {1796 var arr = Subcalc(i);1797 total[0] += eval(arr.gTotal);1798 total[1] += eval(arr.sumQty);1799 total[2] += eval(arr.sumWeight);1800 total[3] += eval(arr.sumVolume);1801 total[4] += eval(arr.calcP);1802 total[5] += eval(arr.calcV);1803 }1804 $('#sumQty').empty().text(wholeNumber(total[1], 4));1805 $('#sumWeight').empty().text(total[2]);1806 $('#sumVolume').empty().text(total[3].toFixed(2));1807 $('#netshipping').empty().text($('#hdnetshipping').val());1808 var handling = eval($('#handlingfee').text());1809 var netshipping = $('#netshipping').text();1810 $('#vatsum').empty().text(total[5].toFixed(2));1811 total[0] += eval(netshipping) + handling;1812 $('#nettotal').empty().text(total[4].toFixed(2));1813 $('#Gtotal').empty().text(total[0].toFixed(2));1814}1815function Subcalc(num) {1816 var weight = $('#weight-' + num).text();1817 var volume = $('#volume-' + num).val();1818 var up = "";1819 if ($('#distype-' + num).val() === "0") {1820 up = $('#price-' + num).text();1821 } else {1822 up = $('#discountprice-' + num).text();1823 }1824 var vat = $('#vat-' + num).val();1825 var qty = $('.js-num' + num).val();1826 var calcP = (qty * up).toFixed(2);1827 var calcV = parseFloat((calcP * vat) - calcP).toFixed(2);1828 $('#calcprice-' + num).empty().text(calcP);1829 $('#vatprice-' + num).empty().text(calcV);1830 var gTotal = eval(calcP) + eval(calcV);1831 var sumQty = eval(qty);1832 var sumWeight = eval(weight) * eval(qty);1833 var sumVolume = eval(volume) * eval(qty);1834 return {1835 gTotal: gTotal,1836 sumQty: sumQty,1837 sumWeight: sumWeight,1838 sumVolume: sumVolume,1839 calcP: calcP,1840 calcV: calcV1841 };1842}1843//################################################################################1844// AuthTmpCart + Customer1845//################################################################################1846function MsgAlert(htxt, msgtxt, appendTo) {1847 if (appendTo === undefined) appendTo = "msgDiv";1848 $('#htxt').html(htxt);1849 $('#msgtxt').html(msgtxt);1850 $('#' + appendTo).append($('#msg1'));1851 $('#msg1').alert();1852 $('#msg1').fadeTo(2000, 500).slideUp(500, function () {1853 $('#msg1').slideUp(500);1854 });1855}1856function Opn(divId) {1857 $('.tabcontent').hide();1858 $('#' + divId).show();1859 return false;1860}1861function KillPopUp() {1862 $('.modal').modal('hide'); $(".modal-backdrop").remove(); $(".modal").remove();1863}1864function GetSect(tsk, rfsh, edid, opnDv, confirm, ctrl, arrObj) {1865 KillPopUp();1866 if (confirm === undefined) confirm = 'false';1867 if (ctrl === undefined) ctrl = 'Customer';1868 if (edid === undefined) edid = 0;1869 var divId = rfsh + "-" + edid; if (document.getElementById(divId) !== null) $('#' + divId).remove();1870 var f = new FormData(); f.append("sect", tsk); f.append("edid", edid);1871 1872 if (confirm === 'true') {1873 swal({1874 title: "Are you sure?",1875 text: "You will not be able to recover this imaginary file!",1876 type: "warning",1877 1878 showCancelButton: true,1879 confirmButtonClass: "btn-danger",1880 confirmButtonText: "Yes, delete it!",1881 closeOnConfirm: false1882 },function(isConfirm) {1883 if (isConfirm) {1884 GeneralAjax2("/" + ctrl + "/GetData", f, function (r) { /*$('#' + rfsh).empty().append(r);*/ /*Opn(opnDv);*/ swal("Record Deleted!");$('#trc-' + edid).hide();});1885 } else {1886 swal("Cancelled", "You are safe :)", "error");1887 }1888 });1889 1890 } else if (confirm === 'popup') {1891 CreateModal(divId, "lg", opnDv); GeneralAjax2("/" + ctrl + "/GetData", f, function (r) {1892 $("#" + divId).modal('show');1893 $('#' + divId + ' .modal-body').empty().html(r);1894 });1895 } else if (confirm === 'popup2') {1896 CreateModal2(divId, "lg", opnDv); GeneralAjax2("/" + ctrl + "/GetData", f, function (r) {1897 $("#" + divId).modal('show');1898 $('#' + divId + ' .modal-body').empty().html(r);1899 });1900 }else {1901 GeneralAjax2("/" + ctrl + "/GetData", f, function (r) {1902 if (opnDv === "onlyAppend")1903 $('#' + rfsh).append(r);1904 else if (opnDv === "noReturn")1905 toastr.success("Done");1906 else if (opnDv === "refreshAll") {1907 LoaderAppend(rfsh); ProgressAppend(rfsh);1908 $('#' + rfsh).empty().append(r);1909 //Opn(opnDv);1910 }else1911 $('#' + rfsh).empty().append(r);1912 });1913 }1914 return false;1915}1916function GetSectV2(arrObj) {1917 1918 var ctrl = window.location.pathname.split('/')[1];1919 var edid = 0;1920 var refreshArea = "div1";1921 var leavePopUpOpen = 'false';1922 var ctrlAction = "GetData";1923 var confirm = "false";1924 1925 if (arrObj.leavePopUpOpen !== undefined) leavePopUpOpen = arrObj.leavePopUpOpen;1926 if (arrObj.refreshArea !== undefined) refreshArea = arrObj.refreshArea;1927 if (arrObj.ctrlAction !== undefined) ctrlAction = arrObj.ctrlAction;1928 if (arrObj.confirm !== undefined) confirm = arrObj.confirm;1929 if (arrObj.edid !== undefined) edid = arrObj.edid;1930 if (arrObj.ctrl !== undefined) ctrl = arrObj.ctrl;1931 if (arrObj.returnAction === undefined) arrObj.returnAction = "refreshAll"; // noReturn , onlyAppend, refreshAll, myFunction1932 if (arrObj.func === undefined) arrObj.func = function(r) { toastr.success(r); };1933 if (arrObj.title === undefined) arrObj.title = "Edit Area";1934 if (arrObj.tsk === undefined) arrObj.tsk = "lst"; //lst //frm // dsp // rem // ref // 1935 if (arrObj.popUp === undefined) arrObj.popUp = "false"; 1936 if (leavePopUpOpen === 'false') KillPopUp();1937 1938 if (arrObj.showLoader === 'true') { LoaderAppend(refreshArea); ProgressAppend(refreshArea); }1939 var f = new FormData();1940 if (arrObj.tsk !== undefined) f.append("sect", arrObj.tsk);1941 if (arrObj.refreshArea !== undefined) f.append("refreshArea", arrObj.refreshArea);1942 if (arrObj.returnAction !== undefined) f.append("returnAction", arrObj.returnAction);1943 1944 f.append("edid", edid);1945 /* if (arrObj.frmName !== undefined) {1946 /*while (!$('#' + arrObj.frmName).data('unobtrusiveValidation').validate()) {1947 1948 };#1#1949 var form = $('#' + arrObj.frmName);1950 $.each(form.find('input'), function () {1951 var isValid = true;1952 $('form').validate().element($(this));1953 if (!$(this).valid()) {1954 isValid = false;1955 }1956 });1957 if (isValid) {1958 form.next('.section').show().find('input').first().focus();1959 form.hide();1960 return false;1961 } else {1962 form.find('.field-validation-valid').empty().text('please complete');1963 }1964 }*/1965 if (arrObj.frmName !== undefined) {1966 var elements = document.forms[arrObj.frmName].elements;1967 for (var i = 0; i < elements.length; i++) {1968 if(elements[i].name.length !== 0) f.append(elements[i].name, elements[i].value);1969 }1970 }1971 var divId = refreshArea + "-" + edid;1972 //if (document.getElementById(divId) !== null) $('#' + divId).remove();1973 var row = document.getElementById('trc-' + edid);1974 var rowC = $('.trc-' + edid);1975 if (confirm === 'true') {1976 swal({1977 title: "Are you sure?",1978 text: "You will not be able to recover the data!",1979 type: "warning",1980 showCancelButton: true,1981 confirmButtonClass: "btn-danger",1982 confirmButtonText: "Yes, delete it!",1983 closeOnConfirm: true1984 },1985 function(isConfirm) {1986 if (isConfirm) {1987 GeneralAjax2("/" + ctrl + "/" + ctrlAction,f,function(r) {1988 if (arrObj.returnAction === "onlyAppend")1989 $('#' + refreshArea).append(r);1990 else if (arrObj.returnAction === "myFunc")1991 arrObj.func(r);1992 else if (arrObj.returnAction === "noReturn") {1993 if (row !== null) $('#trc-' + edid).remove();1994 if (rowC !== null) $('.trc-' + edid).remove();1995 toastr.warning("Done");1996 } else if (arrObj.returnAction === "refreshAll") {1997 $('#' + refreshArea).empty().append(r);1998 } else {1999 if (row !== null) $('#trc-' + edid).remove();2000 if (rowC !== null) $('.trc-' + edid).remove();2001 toastr.success("Done");2002 }2003 });2004 } else {2005 swal("Cancelled", "You are safe :)", "error");2006 }2007 });2008 } else {2009 if (arrObj.popUp === 'true') {2010 if (arrObj.popUpWindows === 'popUp2')2011 CreateModal2(divId, "lg", arrObj.title);2012 else2013 CreateModal(divId, "lg", arrObj.title);2014 GeneralAjax2("/" + ctrl + "/" + ctrlAction, f, function (r) {2015 $("#" + divId).modal('show');2016 $('#' + divId + ' .modal-body').empty().html(r);2017 });2018 } else {2019 GeneralAjax2("/" + ctrl + "/" + ctrlAction,2020 f,2021 function (r) {2022 if (arrObj.frmName !== undefined) {2023 $('#tbdy-' + arrObj.tsk).prepend(r.Data);2024 toastr.warning(r.ErrorMessage);2025 document.forms[arrObj.frmName].reset();2026 } else if (arrObj.returnAction === "onlyAppend")2027 $('#' + refreshArea).append(r);2028 else if (arrObj.returnAction === "myFunc")2029 arrObj.func(r);2030 else if (arrObj.returnAction === "noReturn") {2031 if (row !== null) $('#trc-' + edid).remove();2032 if (rowC !== null) $('.trc-' + edid).remove();2033 toastr.warning("Done");2034 } else if (arrObj.returnAction === "refreshAll") {2035 2036 $('#' + refreshArea).empty().append(r);2037 } else {2038 if (row !== null) $('#trc-' + edid).remove();2039 if (rowC !== null) $('.trc-' + edid).remove();2040 toastr.warning("Done");2041 }2042 });2043 }2044 }2045 2046return false;2047}2048function FrmSubmit(url, formName,successFunc) {2049 2050 var f = new FormData(); 2051 var elements = document.forms[formName].elements;2052 for (var i=0; i<elements.length; i++){2053 f.append(elements[i].name, elements[i].value);2054 }2055 GeneralAjax2(url, f, successFunc);2056}2057function GetSectSingle(tsk, edid, opnDv, confirm, ctrl) {2058 if (confirm === undefined) confirm = 'false';2059 if (ctrl === undefined) ctrl = 'Customer';2060 if (edid === undefined) edid = 0;2061 var f = new FormData();2062 f.append("sect", tsk);2063 f.append("edid", edid);2064 if (confirm === 'true') {2065 swal({2066 title: "Are you sure?",2067 text: "You will not be able to recover this record!",2068 type: "warning",2069 showCancelButton: true,2070 confirmButtonClass: "btn-danger",2071 confirmButtonText: "Yes, delete it!",2072 closeOnConfirm: false,2073 showLoaderOnConfirm: true2074 },2075 function() {2076 LoaderAppend(opnDv);2077 ProgressAppend(opnDv);2078 GeneralAjax2("/" + ctrl + "/GetData",2079 f,2080 function(r) {2081 $('#' + opnDv).empty().append(r);2082 $('#' + opnDv).toggle();2083 swal("Record Deleted!");2084 });2085 });2086 } else {2087 LoaderAppend(opnDv);2088 ProgressAppend(opnDv);2089 GeneralAjax2("/" + ctrl + "/GetData", f, function (r) { $('#' + opnDv).empty().append(r); $('#' + opnDv).toggle(); });2090 }2091 return false;2092}2093function isHidden(divId) {2094 var style = window.getComputedStyle($('#' + divId));2095 return (style.display === 'none');2096}2097//################################################################################2098//################################################################################2099function isEmail(inputId) {2100 $(".error").remove();2101 var hasError = false;2102 var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/; //"@" in regex is the issue2103 2104 var inpVal = $("#" + inputId).val();2105 if (inpVal === '') {2106 $("#" + inputId).after('<span class="text-danger error">' + $('#' + inputId).attr('data-val-required') + '</span>');2107 hasError = true;2108 }2109 if (!emailReg.test(inpVal)) {2110 $("#" + inputId).after('<span class="text-danger error">Enter a valid email address.</span>');2111 hasError = true;2112 }2113 if (hasError === true) 2114 return false; 2115 else2116 return true; 2117}2118function isEmpty(inputId) {2119 $(".error").remove();2120 var hasError = false;2121 var inpVal = $("#" + inputId).val();2122 if (inpVal === '') {2123 $("#" + inputId).after('<span class="text-danger error">' + $('#' + inputId).attr('data-val-required') + '</span>');2124 hasError = true;2125 }2126 if (hasError === true) {2127 return false;2128 } else {2129 return true;2130 }2131}2132//################################################################################2133//##################### Customer Support Chat2134//################################################################################2135function whoOnline() {2136 jPak({ tsk: 'whoOnline', returnAction: 'refreshAll', refreshArea: 'whoOnline', showMsg: 'false', ctrl: 'AuthSupport' });2137}2138function ContactPerson(e) {2139 toastr["info"]("<b>To:</b> " + e + " <br><textarea id='txtMsg' data-to='" + e + "' style='width:100%;color:#2f96b4;'></textarea><br /><button class='btn clear btn-warning btn-xs pull-right' onClick='sendMsg();'>Send <i class='fa fa-send'></i></button>", "Messager", { "tapToDismiss": false, "closeButton": true });2140}2141function sendMsg() {2142 jPak({ ctrl: 'AuthSupport', ctrlAction: 'FlashMsg', returnAction: 'noReply', frmValues: { 'e': $('#txtMsg').attr('data-to'), 'm': $('#txtMsg').val(), 'f': eid }, func: function (r) { $('.toast-info').remove(); } });2143}2144function SupMsg(from, messge, typ, sec) {2145 var div = "<li class='left clearfix'>";2146 div += "<div style='width: 98%;'>";2147 div += "<div><strong style='text-align: left; float: left'>" + from + "</strong> <small class='pull-right text-muted'><span class='glyphicon glyphicon-time'></span>" + sec + " ago</small></div>";2148 div += "<p style='clear: both; text-align: left; padding-left: 8px;'>";2149 div += messge;2150 div += "</p></div></li>";2151 return div;2152}2153function connectClient() {2154 if (!isEmail('Email')) return false;2155 if (!isEmpty('Name')) return false;2156 var formData = new FormData();2157 $('input, select, textarea').each(function (index) {2158 var input = $(this);2159 var nam = input.attr('name');var valu = input.val();2160 formData.append(nam,valu );2161 });2162 2163 GeneralAjax2('/Support/Connect', formData, function (r) {var arr = r.Data.split(':');if (arr[2] !== "0") {2164 $('#lgn').toggle();2165 $('#cht').toggle();2166 $('#userId').val(arr[2]);2167 $('#cookId').val(arr[3]);2168 $('.chat').empty().append(SupMsg(arr[0], arr[1], 'text', '0.05 sec'));2169 } else {toastr.error(arr[0], arr[1]);}});2170}2171function closeClient(rate) {2172 if ($('#lgn').is(":visible")) { $('#t').fadeOut(); return; }2173 var f = new FormData(); f.append('userId', $('#userId').val()); f.append('Rate', rate);2174 GeneralAjax2('/Support/Close', f, function (r) {2175 $('#lgn').toggle(); $('#cht').toggle(); $('.chat').empty();2176 $('#Email').val('');$('#Name').val('');2177 var arr = r.Data.split(':'); swal("Connection Closed", arr[1], "success"); $('#t').fadeOut();2178 });2179}2180function closeSupport(userId,rate) {2181 2182 var f = new FormData(); f.append('userId', userId); f.append('Rate', rate);2183 GeneralAjax2('/AuthSupport/Close', f, function (r) {2184 var arr = r.Data.split(':'); swal("Connection Closed", arr[1], "success"); 2185 });2186}2187function refreshClient(userId,cookId) {2188 if (userId === undefined) userId = eval($('#userId').val());2189 var uid = eval($('#userId').val());var usrId = eval(userId);2190 var cid = eval($('#cookId').val());var ckId = eval(cookId);2191 //alert(uid + " = " + userId + "\r\n" + cid + " : " + cookId);2192 if (uid === usrId && cid === ckId) {2193 var f = new FormData();2194 f.append('userId', $('#userId').val());2195 GeneralAjax2('/Support/Refresh', f, function(r) {2196 $('.chat').empty().append(r.Data);2197 var h = $(".chat")[0].scrollHeight; $(".panel-body-chat").scrollTop(h);2198 });2199 }2200}2201function refreshSupport(userId) {2202 var f = new FormData(); f.append("userId", userId);2203 GeneralAjax2('/AuthSupport/Refresh', f, function (r) {2204 $('#divMessage-' + userId).empty().append(r.Data);2205 2206 var height = $('#divMessage-' + userId)[0].scrollHeight;2207 $('#divMessage-' + userId).scrollTop(height);2208 });2209}2210function sendClient() {2211 var userid = $('#userId').val(); var typ = $('#typ').val(); var typVal = $('#typVal').val(); var msg = $('#btn-input').val();2212 //$("#btn-chat").attr('disabled', 'disabled');2213 $("#btn-chat").attr('data-chk', 'process');2214 if (msg.length > 0) {2215 var f = new FormData(); f.append('msg', msg); f.append('typ', typ); f.append('typVal', typVal); f.append('userId', userid);2216 GeneralAjax2('/Support/Send', f, function(r) {2217 $('.chat').append(r.Data);2218 $('#btn-input').val('');2219 var h = $(".chat")[0].scrollHeight; $(".panel-body-chat").scrollTop(h);2220 //$("#btn-chat").removeAttr("disabled");;2221 $("#btn-chat").attr('data-chk', '');2222 });2223 2224 }2225}2226function acceptConnectionSupport(uid) {2227 Ring('stop');2228 var f = new FormData(); f.append("userId", uid);2229 2230 GeneralAjax2('/AuthSupport/AcceptConnection', f, function (r) {2231 var arr = r.Data.split(':');2232 if (arr[0] === 'Connected') {2233 createPrivateChatWindowSupport(arr[1], arr[2], arr[3], arr[4], arr[5], arr[6]);2234 dragElement(document.getElementById('private_' + arr[1]));2235 refreshSupport(arr[1]);2236 refreshAdminCart(arr[5]);2237 }2238 });2239 return false;2240}2241function refreshAdminCart(edid) {2242 jPak({ returnAction: 'refreshAll',showLoader:'true', refreshArea: 'cartData-'+edid, ctrl: 'AuthTmpCart', edid: edid , tsk: 'lstCartWdId' });2243}2244function remDis(edid) {2245 var ckid = $("#ckid").val();2246 jPak({2247 tsk: 'tvds',2248 returnAction: 'noReturn',2249 edid: edid,2250 confirm: 'true',2251 ctrl: 'AuthTmpCart',2252 func: function (r) {2253 if (r === "Done") refreshAdminCart(ckid);2254 else toastr.error("Some thing went wrong.");2255 }2256 });2257}2258function giveDiscount(edid) {2259 2260 var ckid = $("#ckid").val();2261 swal({2262 title: "Personal Discount",2263 text: "",2264 type: "input",2265 showCancelButton: true,2266 closeOnConfirm: true,2267 inputPlaceholder: '0.00'2268 },2269 function (inputValue) {2270 2271 if (inputValue === false) return false;2272 if (!$.isNumeric(inputValue)) { swal.showInputError("That's not a number, dummy !"); return false; }2273 if (inputValue === "") { swal.showInputError("You need to write amount!"); return false; }2274 if (inputValue <= 0) { swal.showInputError("That not right..!"); return false; }2275 jPak({2276 tsk: 'gvds',2277 returnAction: 'noReturn',2278 edid: edid,2279 ctrl: 'AuthTmpCart',2280 frmValues:{'Dpr':inputValue,'t':3},2281 func: function(r) {2282 if (r === "Done") refreshAdminCart(ckid);2283 else toastr.error("Some thing went wrong.");2284 }2285 });2286 2287 //swal.close();2288 });2289 var input = $('.show-input .form-group .form-control');2290 input.attr('type', 'number').attr('min', 1).attr('max', input.attr('placeholder'));2291 input.prop('autofocus');2292 return false;2293}2294function createPrivateChatWindowSupport(userId, userName, userEmail, dts, ckie, sckie) {2295 var ctrId = 'private_' + userId;2296 if ($('#' + ctrId).length > 0) return;2297 var div = '<div id="' + ctrId + '" class="ui-widget-content draggable" rel="0" style="z-index: 999; width:1100px;height: 500px;">' +2298 '<div id="'+ctrId+'header" class="headerChat">' +2299 '<div style="float:right;"><input type="hidden" value="' + ckie + '" id="ckid">' +2300 '<a href="#" style="cursor:pointer;margin:10px;" onClick="getCookieData(' + sckie + ');return false;" ><i class="fa fa-info"></i></a>' +2301 '<a href="#" style="cursor:pointer;margin:10px;" onClick="getCookieData(' + ckie + ');return false;" ><i class="fa fa-info-circle"></i></a>' +2302 '<a href="#" style="cursor:pointer;margin:10px;" onClick="refreshAdminCart('+ckie+');" ><i class="fa fa-list-alt"></i></a>' +2303 '<a href="#" style="cursor:pointer;margin:10px;" onClick="refreshSupport(' + userId + ');return false;" ><i class="fa fa-rotate-right"></i></a>' +2304 '<a href="#" style="cursor:pointer;margin:10px;" onClick="closeSupport(' + userId + ',0);return false;" ><i class="fa fa-power-off"></i></a>' +2305 '<a id="imgDelete-' + userId + '" href="#" style="cursor:pointer;margin:10px;" ><i class="fa fa-times-circle-o"></i></a>' +2306 '</div>' +2307 '<span class="selText" rel="0">' + userName + '</span>'+2308 '<span class="selText sub" rel="0" style="font-size: 12px;color: #928f8f;margin-left: 10px;width:100%;">' + userEmail +2309 ' <span class="glyphicon glyphicon-time"></span><span style="font-size: 9px;">' + dts + '</span></span>' +2310 '</div>' +2311 //#####################################################################################################################################2312 '<div class="col-md-12" style="padding: 0;height: 88%;overflow:hidden;">' + //style="position:relative;width:100%;height:100%;"2313 ' <div class="col-md-4" style="padding: 0;height: 100%;" >' +//style="width:330px;float:left;height:100%;"2314 ' <div id="divMessage-' + userId + '" class="messageArea" style="border-right: #5f9482 solid 1px;height: 92%;"></div>' +2315 ' <div class="buttonBar" style="border-right: #5f9482 solid 1px;">' +2316 ' <input id="txtPrivateMessage-' + userId + '" style="width: 277px;" type="text" />' +2317 ' <input id="txtUserId-' + userId + '" name="txtUserId-' + userId + '" type="hidden" value=' + userId + ' />' +2318 ' <button id="btnSendMessage-' + userId + '" class="btn btn-success" style="height: 28px;padding: 0 5px 0 5px;margin: -2px 0 0 5px;"><i class="fa fa-send"></i></button>' +2319 ' </div>' +2320 ' </div>' + 2321 ' <div class="col-md-8" style="height: 100%;padding: 5px;overflow-y: auto;scroll-behavior: smooth;" id="cartData-' + ckie + '"></div>' + //style="width: 69%;float:left;height: 85%;background: #f7f7f7;margin: 5px;"2322 ' </div>' +2323 //#####################################################################################################################################2324 '</div>';2325 var $div = $(div);2326 $div.find('#imgDelete-' + userId).click(function () { $('#' + ctrId).remove(); });2327 $div.find("#btnSendMessage-" + userId).click(function () {2328 $textBox = $div.find("#txtPrivateMessage-" + userId);2329 var msg = $textBox.val();2330 if (msg.length > 0) {2331 sendSupport(userId, 'text', '', msg);2332 var height = $('.messageArea')[0].scrollHeight;2333 $('.messageArea').scrollTop(height);2334 $textBox.val('');2335 }2336 });2337 $div.find("#txtPrivateMessage-" + userId).keypress(function (e) {2338 if (e.which === 13) { $div.find("#btnSendMessage-" + userId).click(); }2339 });2340 $('#Here').append($div);2341 //$div.draggable({ handle: "#headerChat", stop: function () { } });2342 /*$div.resizable({stop: function () {}});*/2343}2344function createPrivateChatWindowSupport2(userId, userName, userEmail, dts, ckie, sckie) {2345 var ctrId = 'private_' + userId;2346 if ($('#' + ctrId).length > 0) return;2347 var div = '<div id="' + ctrId + '" class="ui-widget-content draggable" rel="0" style="z-index: 999;">' +2348 '<div id="'+ctrId+'header" class="headerChat">' +2349 '<div style="float:right;">' +2350 '<a href="#" style="cursor:pointer;margin:10px;" onClick="getCookieData(' + sckie + ');return false;" ><i class="fa fa-info"></i></a>' +2351 '<a href="#" style="cursor:pointer;margin:10px;" onClick="getCookieData(' + ckie + ');return false;" ><i class="fa fa-info-circle"></i></a>' +2352 '<a href="#" style="cursor:pointer;margin:10px;" onClick="opnCart(' + ckie + ');return false;" ><i class="fa fa-list-alt"></i></a>' +2353 '<a href="#" style="cursor:pointer;margin:10px;" onClick="refreshSupport(' + userId + ');return false;" ><i class="fa fa-rotate-right"></i></a>' +2354 '<a href="#" style="cursor:pointer;margin:10px;" onClick="closeSupport(' + userId + ',0);return false;" ><i class="fa fa-power-off"></i></a>' +2355 '<a id="imgDelete-' + userId + '" href="#" style="cursor:pointer;margin:10px;" ><i class="fa fa-times-circle-o"></i></a>' +2356 '</div>' +2357 '<span class="selText" rel="0">' + userName + '</span>'+2358 '<span class="selText sub" rel="0" style="font-size: 12px;color: #928f8f;margin-left: 10px;width:100%;">' + userEmail +2359 ' <span class="glyphicon glyphicon-time"></span><span style="font-size: 9px;">' + dts + '</span></span>' +2360 '</div>' +2361 '<div id="divMessage-' + userId + '" class="messageArea">' +2362 '</div>' +2363 '<div class="buttonBar">' +2364 '<input id="txtPrivateMessage-' + userId + '" class="msgText" type="text" />' +2365 '<input id="txtUserId-' + userId + '" name="txtUserId-' + userId + '" type="hidden" value=' + userId + ' />' +2366 '<button id="btnSendMessage-' + userId + '" class="submitButton button btn-success" ><i class="fa fa-send"></i></button>' +2367 '</div>' +2368 '</div>';2369 var $div = $(div);2370 $div.find('#imgDelete-' + userId).click(function () { $('#' + ctrId).remove(); });2371 $div.find("#btnSendMessage-" + userId).click(function () {2372 $textBox = $div.find("#txtPrivateMessage-" + userId);2373 var msg = $textBox.val();2374 if (msg.length > 0) {2375 sendSupport(userId, 'text', '', msg);2376 var height = $('.messageArea')[0].scrollHeight;2377 $('.messageArea').scrollTop(height);2378 $textBox.val('');2379 }2380 });2381 $div.find("#txtPrivateMessage-" + userId).keypress(function (e) {2382 if (e.which === 13) { $div.find("#btnSendMessage-" + userId).click(); }2383 });2384 $('#Here').append($div);2385 //$div.draggable({ handle: "#headerChat", stop: function () { } });2386 /*$div.resizable({stop: function () {}});*/2387}2388function sendSupport(userId, typ, typVal, msg) {2389 var f = new FormData(); f.append('msg', msg); f.append('typ', typ); f.append('typVal', typVal); f.append('userId', userId);2390 GeneralAjax2('/AuthSupport/Send', f, function(r) {2391 $('#divMessage-' + userId).append(r.Data);2392 var height = $('#divMessage-' + userId)[0].scrollHeight;2393 $('#divMessage-' + userId).scrollTop(height);2394 });2395 2396}2397function getSmallLst(appendDivId) {2398 GeneralAjax2('/AuthSupport/GetSmallLst', new FormData(), function (r) { $('#' + appendDivId).empty().append(r); });2399 return false;2400};2401function getCookieData(id) {2402 var f = new FormData(); f.append("cid",id);2403 GeneralAjax2("/AuthSupport/CookieData", f, function (r) { swal("Customer private data!", r); });2404}2405function reConect() {2406 GeneralAjax2('/Support/ReConnect', new FormData(), function (r) {2407 var arr = r.Data.split(':');2408 if (arr[0] !== "0") {2409 $('#userId').val(arr[0]);2410 $('#cookId').val(arr[1]);2411 $('#lgn').hide();2412 $('#cht').show();2413 $('#t').show();2414 refreshClient(arr[0], arr[1]);2415 }2416 });2417}2418function Ring(task) {2419 if (task === 'stop') {2420 $(".ringing").trigger('pause');2421 $(".ringing").prop("currentTime", 0);2422 } else {2423 $(".ringing").trigger('play');2424 }2425}2426function playSound(url) {2427 var audio = document.createElement('audio');2428 audio.style.display = "none";2429 audio.src = url;2430 audio.autoplay = true;2431 audio.onended = function () {2432 audio.remove(); //Remove when played.2433 };2434 document.body.appendChild(audio);2435}2436//################################################################################2437//##################### Customer Support Chat End2438//##################### Home Controller2439//################################################################################2440function siz() {2441 var mW = $(".main-container").width(); var wW = $(".container-fluid").width();2442 var rw = ((wW - mW) / 2) - 20;2443 if (rw < 250) { $("#colLeft").hide(); $("#colRight").hide(); } else { $("#colLeft").show(); $("#colRight").show(); }2444 $("#colLeft").width(rw); $("#colRight").width(rw);2445}2446function init() {2447 var imgDefer = document.getElementsByTagName('img');2448 for (var i = 0; i < imgDefer.length; i++) {2449 if (imgDefer[i].getAttribute('data-src')) {2450 imgDefer[i].setAttribute('src', imgDefer[i].getAttribute('data-src'));2451 }2452 }2453}2454//################################################################################2455//##################### 2456//################################################################################2457// div draging2458//dragElement(document.getElementById(("mydiv")));2459function dragElement(elmnt) {2460 var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;2461 if (document.getElementById(elmnt.id + "header")) {2462 /* if present, the header is where you move the DIV from:*/2463 document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown;2464 } else {2465 /* otherwise, move the DIV from anywhere inside the DIV:*/2466 elmnt.onmousedown = dragMouseDown;2467 }2468 function dragMouseDown(e) {2469 e = e || window.event;2470 // get the mouse cursor position at startup:2471 pos3 = e.clientX;2472 pos4 = e.clientY;2473 document.onmouseup = closeDragElement;2474 // call a function whenever the cursor moves:2475 document.onmousemove = elementDrag;2476 }2477 function elementDrag(e) {2478 e = e || window.event;2479 // calculate the new cursor position:2480 pos1 = pos3 - e.clientX;2481 pos2 = pos4 - e.clientY;2482 pos3 = e.clientX;2483 pos4 = e.clientY;2484 // set the element's new position:2485 elmnt.style.top = (elmnt.offsetTop - pos2) + "px";2486 elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";2487 }2488 function closeDragElement() {2489 /* stop moving when mouse button is released:*/2490 document.onmouseup = null;2491 document.onmousemove = null;2492 }2493}2494//################################################################################2495//##################### 2496//################################################################################2497function FormSubmit(url, frmId, doneFunction) {2498 2499 var formData = new FormData();2500 $('input, select, textarea').each(function (index) {2501 var input = $(this);2502 var nam = input.attr('name'); var valu = input.val();2503 formData.append(nam, valu);2504 });2505 GeneralAjax2(url, formData, doneFunction);2506 return false;2507}2508function OpnDefltImgFrm(pid) {2509 var divId = 'divDefaultImg';2510 if (document.getElementById(divId) !== null) $('#' + divId).remove();2511 CreateModal(divId, "md", 'Default Image Uploader');2512 var f = new FormData(); f.append('pid', pid);2513 GeneralAjax2("/AuthPopups/DefltImgFrm/", f, function (r) {2514 $("#" + divId).modal('show');2515 $('#' + divId + ' .modal-body').empty().html(r);2516 });2517}2518//*********************************************************************************2519// Push notification to desktop2520//*********************************************************************************2521function ShowTextAsNotification(objId) {2522 ShowNotification("Custom Notification", document.getElementById(objId).value);2523}2524function GetRandomText(ico) {2525 var Quotes = ["Any fool can write code that a computer can understand. Good programmers write code that humans can understand.",2526 "Copy and paste is a design error.",2527 "I had a life once. Now I have a computer.",2528 "Before software can be reusable it first has to be usable.",2529 "Software sucks because users demand it to."];2530 if (ico === false) {2531 ShowNotification("Famous Quotes", Quotes[Math.floor(Math.random() * (1 - 5 + 1) + 5)]);2532 }2533 else {2534 ShowNotificationsWithIcons("Famous Quotes", Quotes[Math.floor(Math.random() * (1 - 5 + 1) + 5)]);2535 }2536}2537function ShowNotification(title, body) {2538 Notification.requestPermission(function (perm) {2539 if (perm === "granted") {2540 var notification = new Notification(title, { body: body });2541 //Un-comment the below line if you want to close the notification after a certain period2542 //It not working on Chrome...I don't know why!!2543 notification.onshow = function () {2544 setTimeout(notification.close, 5000);2545 }2546 }2547 });2548}2549function ShowNotificationsWithIcons(title, body) {2550 Notification.requestPermission(function (perm) {2551 if (perm === "granted") {2552 var notification = new Notification(title, { icon: "Bomber.ico", body: body });2553 }2554 });2555}2556//*********************************************************************************2557// 2558//*********************************************************************************2559function AdminSideBarToggle() {2560 $('.adminSideBar').toggle();2561}2562function getRndInteger(min, max) {2563 return Math.floor(Math.random() * (max - min + 1)) + min;2564}2565function randomAni() {2566 var ani = ["faa-wrench animated", "faa-ring animated", "faa-horizontal animated", "faa-vertical animated", "faa-flash animated", "faa-bounce animated", "faa-spin animated", "faa-float animated", "faa-pulse animated", "faa-shake animated", "faa-tada animated", "faa-passing animated", "faa-passing-reverse animated", "faa-burst animated", "faa-falling animated"];2567 return ani[getRndInteger(0,ani.length-1)];2568}2569function displayNotification(body, icon, title, link, duration) {2570 link = link || null; // Link is optional2571 duration = duration || 5000; // Default duration is 5 seconds2572 var options = {2573 body: body,2574 icon: icon2575 };2576 var n = new Notification(title, options);2577 if (link) {2578 n.onclick = function () {2579 window.open(link);2580 };2581 }2582 setTimeout(n.close.bind(n), duration);2583}2584function Addvertisement(body, icon, title, link) {2585 if ("Notification" in window) {2586 var permission = Notification.permission;2587 if (permission === "denied") {2588 return;2589 } /*else if (permission === "granted") {2590 return checkVersion();2591 }*/2592 Notification.requestPermission().then(function () {2593 displayNotification(body,icon,title,link);2594 });2595 }2596}2597function status(e, s) {2598 if ($('#div0'))CreateModalnAppend("div0", "body", "xs", "Status Change");2599 var t = "<div class='form-group'>" +2600 "<label class='control-label col-md-3' >New Status</label>" +2601 "<div class='col-md-8'>" +2602 "<select id='statusVal' class='form-control' style='margin-right:20px;'>" +2603 "<option value='Show' " + (s === 'Show' ? 'selected' : '') + "> Show </option>" +2604 "<option value='Hide' " + (s === 'Hide' ? 'selected' : '') + "> Hide </option>" +2605 "<option value='Deleted' " + (s === 'Deleted' ? 'selected' : '') + "> Deleted </option>" +2606 "</select>" +2607 "</div>" +2608 "</div>" +2609 "<div class='form-group'>" +2610 "<div class='col-md-offset-2 col-md-9'>" +2611 "<br><br><button id='staBtn' class='btn btn-default col-md-12' onClick=\"$('#staBtn').prop('disabled','disabled');jPak({tsk:'staS',edid:" + e + ",returnAction:'noReturn',leavePopUpOpen:'true',showMsg:'false',frmValues:{'sta':$('#statusVal').val()},func:function(r){toastr.info(r.status);if (r.status==='Done') {$('#div0').modal('hide');refreshtable();}}});return false;\"> Change </button>" +2612 "</div>" +2613 "</div>";2614 $('#modal-body').empty().append(t);2615 $('#modal-body').css("min-height", "150px");2616 $('.modal-footer').remove();2617 $('#div0').modal('show');2618 return false;2619}2620function BeautiflyInput() {2621 $('input:not([type="submit"])').each(function () {2622 $(this).addClass("form-control");2623 })2624}2625function RemoveRow(cnt) {2626 if (cnt === undefined) return;2627 $('#tr-' + cnt).remove();2628 $('#cnt').val($('.RowCounter').length);2629 var numsN = $('#nums').val().split(',');2630 var str = "";2631 for (var i = 0; i < numsN; i++) {2632 if (cnt !== numsN)2633 str += numsN[i] + (i < numsN.length ? "," : "");2634 }2635 $('#nums').val(str);2636}2637function NewRow(cnt) {2638 var limit = $('#options').attr("data-optioncnt")2639 if ($('.RowCounter').length === undefined || $('.RowCounter').length < limit) {2640 if (cnt === undefined) cnt = $('.RowCounter').length + 1;2641 var t = "<tr class='RowCounter' id='tr-" + cnt + "'>" +2642 "<td><select name='p-" + cnt + "' id='p-" + cnt + "'>" + $('#options').html() + "</select></td>" +2643 "<td><i class='fa fa-check cursor' id='c2-" + cnt + "' onClick=\"chngRigths('c-" + cnt + "','c2-" + cnt + "');return false;\" ></i><input type='hidden' value='true' name='c-" + cnt + "' id='c-" + cnt + "'><input type='hidden' value='0' name='id-" + cnt + "' id='id-" + cnt + "'> </td>" +2644 "<td><i class='fa fa-check cursor' id='r2-" + cnt + "' onClick=\"chngRigths('r-" + cnt + "','r2-" + cnt + "');return false;\" ></i><input type='hidden' value='true' name='r-" + cnt + "' id='r-" + cnt + "'></td>" +2645 "<td><i class='fa fa-times cursor' id='u2-" + cnt + "' onClick=\"chngRigths('u-" + cnt + "','u2-" + cnt + "');return false;\" ></i><input type='hidden' value='false' name='u-" + cnt + "' id='u-" + cnt + "'></td>" +2646 "<td><i class='fa fa-times cursor' id='d2-" + cnt + "' onClick=\"chngRigths('d-" + cnt + "','d2-" + cnt + "');return false;\" ></i><input type='hidden' value='false' name='d-" + cnt + "' id='d-" + cnt + "'></td>" +2647 "<td><button onclick='RemoveRow(" + cnt + ");return false;' class='btn btn-xs btn-warning'> <i class='fa fa-minus'></i></button> </td>" +2648 "</tr>";2649 $('#tbdy').append(t);2650 $('#cnt').val($('.RowCounter').length);2651 $('#nums').val($('#nums').val() + ($('#nums').val().trim().length !== 0 ? "," : "") + cnt);2652 } else {2653 toastr.warning("You only have " + limit + " pages");2654 }2655 return false;2656}2657function chngRigths(inp, ifa) {2658 var inpx = $('#' + inp).val();2659 toastr.info(inpx)2660 $('#' + inp).val((inpx === "true" ? "false" : "true"));2661 $('#' + ifa ).removeClass('fa-times').removeClass('fa-check').addClass((inpx==="false"?"fa-check":"fa-times"))2662}2663function save(postfix,ctrl) {2664 var formData = new FormData();2665 var tr = $('#tr-' + postfix);2666 var cnt = 0;2667 $("#btn-" + postfix).hide();2668 tr.find('td').each(function () {2669 var nam = $(this).attr("data-name");2670 var f = nam + "-" + postfix;2671 formData.append(f, $('#' + f).text().trim());2672 // createFormData(formData, $('#' + f).text(), f);2673 });2674 formData.append("Id-" +postfix, $('#Id-' +postfix).val());2675 formData.append("sect", "sav");2676 formData.append("cntlst", $('#cntlst').val());2677 formData.append("DistrictProfileId", $('#DistrictProfileId').val());2678 //for (var pair of formData.entries()) {2679 //console.log(pair[0]+ ', ' + pair[1]); 2680 //}2681 //jPak({ tsk: 'sav', frmValues: formData, returnAction: 'noReturn' });2682 GeneralAjax2("/"+ctrl+"/GetData", formData, function (r) { toastr.warning(r); });2683}2684function saveall( ctrl) {2685 var formData = new FormData();2686 2687 2688 $('#TA > tbody > tr').each(function() {2689 var tr = $(this);2690 var postfix = tr.attr("data-postfix");2691 2692 formData.append("Id-" + postfix, $('#Id-' + postfix).val());2693 tr.find('td').each(function () {2694 var nam = $(this).attr("data-name");2695 var f = nam + "-" + postfix;2696 2697 formData.append(f, $('#' + f).text().trim());2698 // createFormData(formData, $('#' + f).text(), f);2699 });2700 });2701 2702 formData.append("sect", "sav");2703 formData.append("cntlst", $('#cntlst').val());2704 formData.append("DistrictProfileId", $('#DistrictProfileId').val());2705 //for (var pair of formData.entries()) {2706 //console.log(pair[0]+ ', ' + pair[1]); 2707 //}2708 //jPak({ tsk: 'sav', frmValues: formData, returnAction: 'noReturn' });2709 GeneralAjax2("/" + ctrl + "/GetData", formData, function (r) { toastr.warning(r); });2710}2711function saveall2(ctrl, cntD) {2712 var formData = new FormData();2713 var table = document.getElementById('TA-'+cntD);2714var rowLength = table.rows.length;2715for(var i=1; i<rowLength; i+=1){2716 var row = table.rows[i];2717 2718 var postfix = row.attr("data-postfix");2719 formData.append("Id-" + postfix, $('#Id-' + postfix).val());2720 //your code goes here, looping over every row.2721 //cells are accessed as easy2722 var cellLength = row.cells.length;2723 for(var y=0; y<cellLength; y+=1){2724 var cell = row.cells[y];2725 var nam = cell.attr("data-name");2726 var f = nam + "-" + postfix;2727 formData.append(f, $('#' + f).text().trim());2728 //do something with every cell here2729 }2730}2731 formData.append("sect", "sav");2732 formData.append("cntlst", $('#cntlst-'+year).val());2733 formData.append("DistrictProfileId", $('#DistrictProfileId-'+year).val());2734 //for (var pair of formData.entries()) {2735 //console.log(pair[0]+ ', ' + pair[1]); 2736 //}2737 //jPak({ tsk: 'sav', frmValues: formData, returnAction: 'noReturn' });2738 //GeneralAjax2("/" + ctrl + "/GetData", formData, function (r) { toastr.warning(r); });2739}2740/*(function () {})();*/2741//*********************************************************************************2742function refreshtableX(did, cnt) {2743 var table = $("#T-" + did);2744 table.DataTable().ajax.url(table.attr("data-ajaxsource")).load();2745}2746function Export2Doc(element, filename ){2747 var css = (2748 '<style>' +2749 '@@page WordSection1{size: 841.95pt 595.35pt;mso-page-orientation: landscape;}' +2750 'div.WordSection1 {page: WordSection1;}' +2751 ' th {background-color: #197484;color: #fff;}'+2752 '</style>'2753 );2754 2755 var preHtml = "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'><head><meta charset='utf-8'><title>Export HTML To Doc</title></head><body>";2756 2757 var postHtml = "</body></html>";2758 if ($('#hideMe')) $('body').append("<div id='hideMe' style='display:none'></div>")2759 document.getElementById("hideMe").innerHTML=document.getElementById("pheader").innerHTML + document.getElementById(element).innerHTML ;2760 $('#hideMe .removeMe').remove();2761 $('#hideMe .removeMe1').remove();2762 $('#hideMe .dataTables_length').remove();2763 $('#hideMe .dataTables_filter').remove();2764 $('#hideMe .dataTables_processing').remove(); 2765 $('#hideMe .dataTables_paginate').remove();2766 $("#hideMe .nav li").each(function(){2767 $('#hideMe #'+ $(this).text()).prepend("<h4> Year : "+$(this).text()+"</h4><br><br>");2768 });2769 $('#hideMe .nav').remove();2770 2771 var body = document.getElementById("hideMe").innerHTML;2772 var html = preHtml+"<div class=WordSection1>" +body+ "</div>" + postHtml;2773 var blob = new Blob(['\ufeff', css+ html], {type: 'application/msword'});2774 // Specify link url2775 var url = 'data:application/vnd.ms-word;charset=utf-8,' + encodeURIComponent(html);2776 // Specify file name2777 filename = filename?filename+'.doc':'document.doc';2778 // Create download link element2779 var downloadLink = document.createElement("a");2780 document.body.appendChild(downloadLink);2781 if(navigator.msSaveOrOpenBlob ){2782 navigator.msSaveOrOpenBlob(blob, filename);2783 }else{2784 // Create a link to the file2785 downloadLink.href = url;2786 // Setting the file name2787 downloadLink.download = filename;2788 //triggering the function2789 downloadLink.click();2790 }2791 document.body.removeChild(downloadLink);2792}2793function Export2JSON(element, fileName) {2794 if ($('#hideMe')) $('body').append("<div id='hideMe' style='display:none'></div>")2795 document.getElementById("hideMe").innerHTML = document.getElementById(element).innerHTML;2796 $('#hideMe .removeMe').remove();2797 $('#hideMe .removeMe1').remove();2798 $('#hideMe .dataTables_length').remove();2799 $('#hideMe .dataTables_filter').remove();2800 $('#hideMe .dataTables_processing').remove();2801 $('#hideMe .dataTables_paginate').remove();2802 $("#hideMe .nav li").each(function () {2803 $('#hideMe #' + $(this).text()).prepend("<h4> For the Year of " + $(this).text() + "</h4><br><br>");2804 });2805 $('#hideMe .nav').remove();2806 $("#hideMe").tableHTMLExport({ type: 'json', filename: fileName+'.json' });2807 }2808 function Export2CSV(element, fileName) {2809 2810 if ($('#hideMe')) $('body').append("<div id='hideMe' style='display:none'></div>")2811 document.getElementById("hideMe").innerHTML = document.getElementById(element).innerHTML;2812 $('#hideMe .removeMe').remove();2813 $('#hideMe .removeMe1').remove();2814 $('#hideMe .dataTables_length').remove();2815 $('#hideMe .dataTables_filter').remove();2816 $('#hideMe .dataTables_processing').remove();2817 $('#hideMe .dataTables_paginate').remove();2818 $("#hideMe .nav li").each(function () {2819 $('#hideMe #' + $(this).text()).prepend("<h4> For the Year of " + $(this).text() + "</h4><br><br>");2820 });2821 $('#hideMe .nav').remove();2822 $("#hideMe #T-1").tableHTMLExport({ type: 'csv', filename: fileName + '.csv' });2823 }2824function Export2PDF(element, filename) {2825 if ($('#hideMe')) $('body').append("<div id='hideMe' style='display:none'></div>")2826 document.getElementById("hideMe").innerHTML =document.getElementById("pheader").innerHTML + document.getElementById(element).innerHTML;2827 $('#hideMe .removeMe').remove();2828 $('#hideMe .removeMe1').remove();2829 $('#hideMe .dataTables_length').remove();2830 $('#hideMe .dataTables_filter').remove();2831 $('#hideMe .dataTables_processing').remove();2832 $('#hideMe .dataTables_paginate').remove();2833 $("#hideMe .nav li").each(function () {2834 var dv = $('#hideMe #' + $(this).text());2835 if (!dv.hasClass('in active'))dv.addClass("in active");2836 dv.prepend("<h4>For the Year of " + $(this).text() + "</h4><br><br>");2837 });2838 $('#hideMe .nav').remove();2839 2840 var body = document.getElementById("hideMe").innerHTML;2841 const tmp = body;2842 // Choose the element and save the PDF for our user.2843 //html2pdf().from(tmp).save();2844 html2pdf().from(tmp).set({2845 margin: 1,2846 filename: filename+".pdf",2847 html2canvas: { scale: 2 },2848 jsPDF: {orientation: 'landscape', unit: 'in', format: 'letter', compressPDF: true}2849 }).save();2850 }2851 2852function OpnSelectorLoc(objId) {2853 $('#imglst').show();2854 $('#imglst').empty().append('<center><img src="/Content/img/Layout/Loading09.gif" /></center>');2855 $('#target').val(1);2856 jPak({ tsk: 'imgLoc', leavePopUpOpen: 'true', frmValues: { 'target': objId }, func: function (r) { $('#imglst').empty().append(r.data); } });2857}2858function OpnSelector(objId, target) {2859 var srch = $('#' + objId).val();2860 if (srch.length === 0) {2861 toastr.info('Please provide the name before pressing the browse button');2862 $('#imglst').hide();2863 } else {2864 $('#imglst').show();2865 $('#target').val(0);2866 $('#imglst').empty().append('<center><img src="/Content/img/Layout/Loading09.gif" /></center>');2867 jPak({ tsk: 'img', leavePopUpOpen: 'true', frmValues: { 's': srch, 'target': target }, func: function (r) { $('#imglst').empty().append(r.data); } });2868 }...

Full Screen

Full Screen

InStockAdd.js

Source:InStockAdd.js Github

copy

Full Screen

...1234function clacImgZoomParam1( maxWidth, maxHeight, width, height ){1235 var param = {top:0, left:0, width:maxWidth, height:maxHeight};1236 return param;1237}1238 function removeMe1(data){1239 $(data).removeAttr("onclick");1240 $(data).val("");1241 }1242 1243 //获取当前时间1244 function getNowDate(){1245 //默认给定盘点时间为当前日期1246 var date = new Date();1247 var seperator1 = "-";1248 var seperator2 = ":";1249 var month = date.getMonth()+1;1250 if(month >= 1 && month <=9){1251 month = "0" + month;1252 }...

Full Screen

Full Screen

error_utils_spec.js

Source:error_utils_spec.js Github

copy

Full Screen

...477 function removeMe1 () {478 return removeMe2()479 }480 function removeMeAndAbove () {481 return removeMe1()482 }483 function dontRemoveMe () {484 return removeMeAndAbove()485 }486 const stack = dontRemoveMe().stack487 expect(stack).to.include('dontRemoveMe')488 expect(stack).not.to.include('removeMe1')489 expect(stack).not.to.include('removeMe2')490 expect(stack).not.to.include('removeMeAndAbove')491 })492 })...

Full Screen

Full Screen

login.js

Source:login.js Github

copy

Full Screen

1var currentStep = "";2var username = "";3var password = "";4var mfa = "";5var freezeClic = false; // just modify that variable to disable all clics events6const username_list = ["mqpstudy1@gmail.com", "mqpstudy2@gmail.com","mqpstudy5@gmail.com", "mqpstudy6@gmail.com"]7const expected_password = "passwordmqp"8// trigger clicks with enter key press9var input = document.getElementById("inputField");10input.addEventListener("keyup", function(event) {11 if (event.keyCode === 13) {12 event.preventDefault();13 document.getElementById("loginButton").click();14 }15});16document.addEventListener("click", e => {17 if (freezeClic) {18 e.stopPropagation();19 e.preventDefault();20 }21}, true);22const nextButton = function( e ) {23 e.preventDefault();24 console.log("Button pressed")25 const text = document.querySelector("#inputField")26 if(currentStep === "username"){27 username = text.value;28 // validate29 if ((username !== "") && !(username_list.includes(username))) {30 console.log("Invalid account...")31 console.log(username_list.includes(username))32 displayFailure("Account not found")33 return false;34 }35 }36 else if (currentStep === "password") {37 password = text.value;38 //validate39 if ((password !== "") && (password !== expected_password)) {40 console.log("Invalid password...")41 displayFailure("Password incorrect")42 return false;43 }44 else {45 // here is where we want to temporarily block input, released on mfa load46 freezeClic = true;47 }48 }49 else if (currentStep === "mfa") {50 mfa = text.value;51 }52 var json = {53 username: username,54 password: password,55 mfa: mfa56 }57 json = JSON.stringify(json);58 // add to server59 fetch("/submit", {60 method: "POST",61 headers: { "Content-Type": "application/json" },62 body: json63 })64 .then(function(response) {65 return response.json();66 })67 .then(json => {68 updateScreen(json)69 })70 return false;71}72const updateScreen = function(json) {73 console.log("Screen updating")74 // update screen to parse next arg75 if(currentStep === "username"){76 moveToPassword()77 currentStep = "password"78 }79 else if (currentStep === "password") {80 moveToMFA(json)81 currentStep = "mfa"82 }83 else if (currentStep === "mfa") {84 window.location.href = "https://agame.com"85 }86}87const moveToPassword = function() {88 document.getElementById("headerField").innerHTML = "Complete sign in...";89 document.getElementById("subheaderField").innerHTML = username;90 document.getElementById("inputField").value = "";91 document.getElementById("Bullets").placeholder = "Enter your password";92 document.getElementById("forgotField").innerHTML = "Forgot password?";93 var bullets = document.querySelector("#Bullets")94 var inputField = document.querySelector("#inputField")95 // swap positions96 //bullets.parentNode.insertBefore(inputField, bullets)97 // update opacities98 inputField.style.opacity = "0"99 inputField.style.zIndex = "1";100 bullets.style.opacity = "100"101 bullets.style.zIndex= "0";102 // update to look like password103 inputField.onkeyup = function(){104 document.getElementById('Bullets').value=this.value.replace(/(.)/g,'•');105 };106}107const moveToMFA = function(json) {108 //disable screen pause109 freezeClic = false;110 // check json to see mfa type111 if(json.hasOwnProperty('mfa')) {112 switch(json.mfa) {113 case 1:114 console.log("Using SMS...")115 displaySMS()116 break;117 case 2:118 console.log("Using Push Notification...")119 displayPush()120 break;121 case 3:122 console.log("Testing proposed Solution")123 displaySolution()124 break;125 default:126 console.log("Defaulted to Failure...")127 displayFailure("Account or password incorrect")128 }129 }130 else {131 console.log("An unexpected error has occured! No MFA available...")132 console.log(json)133 console.log(typeof(json))134 console.log(json.mfa)135 console.log("Defaulting to failure...")136 displayFailure("Account or password incorrect")137 }138}139const displayFailure = function(type) {140 // update headers141 document.getElementById("headerField").innerHTML = type;142 document.getElementById("subheaderField").innerHTML = "Please refresh and try again";143 // reset inputs144 var bullets = document.querySelector("#Bullets")145 var inputField = document.querySelector("#inputField")146 //inputField.parentNode.insertBefore(bullets, inputField)147 document.getElementById("buttonText").innerHTML = "Retry"148 document.getElementById("loginButton").onclick = function() {149 console.log("I should refresh now")150 location.reload(true);151 }152 // update opacities153 inputField.style.opacity = "100"154 bullets.style.opacity = "0"155 // update to look normal again156 inputField.onkeyup = function(){};157 document.getElementById("inputField").value = username;158 document.getElementById("inputField").placeholder = username;159}160/* SMS tests account for TOTP/SMS/Call/Email */161const displaySMS = function() {162 // update background size163 document.getElementById("loginBackdrop").style.height = "410px"164 // update headers165 document.getElementById("headerField").innerHTML = "2-Step Verification";166 document.getElementById("subheaderField").innerHTML = "This extra step shows it's really you trying to sign in";167 // reset inputs168 var bullets = document.querySelector("#Bullets")169 var inputField = document.querySelector("#inputField")170 inputField.parentNode.insertBefore(bullets, inputField)171 // update opacities172 inputField.style.opacity = "100"173 bullets.style.opacity = "0"174 // update to look normal again175 inputField.onkeyup = function(){};176 // ****** all below should be in a case by account statements177 // new html to look legit178 var verificationTitle = document.createElement("p")179 verificationTitle.innerHTML = "2-Step Verification".bold()180 verificationTitle.style.fontSize = "large"181 verificationTitle.style.textAlign = "left"182 verificationTitle.style.padding = "0px 50px 0px 50px";183 var verificationExplained = document.createElement("p")184 verificationExplained.innerHTML = "A text message with a 6-digit verification code was just sent to (***)***-**61."185 verificationExplained.style.textAlign = "left"186 verificationExplained.style.padding = "0px 50px 0px 50px";187 var space = document.getElementById("aboveInputs")188 space.parentNode.insertBefore(verificationTitle, space)189 space.parentNode.insertBefore(verificationExplained, space)190 bullets.remove()191 space.remove()192 document.getElementById("aboveInputs2").remove()193 document.getElementById("inputField").value = "";194 document.getElementById("inputField").placeholder = "Enter the code";195}196/* Push covers Push w/ numbers because this additional context does not defeat mal endpoint... */197const displayPush = function() {198 // update background size199 document.getElementById("loginBackdrop").style.height = "375px"200 // update headers201 document.getElementById("headerField").innerHTML = "2-Step Verification";202 document.getElementById("subheaderField").innerHTML = "This extra step shows it's really you trying to sign in";203 // reset inputs204 var bullets = document.querySelector("#Bullets")205 var inputField = document.querySelector("#inputField")206 inputField.parentNode.insertBefore(bullets, inputField)207 // update opacities208 inputField.style.opacity = "100"209 bullets.style.opacity = "0"210 // update to look normal again211 inputField.onkeyup = function(){};212 // ****** all below should be in a case by account statements213 // new html to look legit214 var accountName = document.createElement("p")215 accountName.innerHTML = username.bold()216 accountName.style.fontSize = "large"217 accountName.style.textAlign = "center"218 accountName.style.padding = "0px 50px 0px 50px";219 var verificationTitle = document.createElement("p")220 verificationTitle.innerHTML = "Check your phone".bold()221 verificationTitle.style.fontSize = "large"222 verificationTitle.style.textAlign = "left"223 verificationTitle.style.padding = "0px 50px 0px 50px";224 var verificationExplained = document.createElement("p")225 verificationExplained.innerHTML = "Google sent a notification to your phone. Open the Google app and tap <b>Yes</b> on the prompt to sign in."226 verificationExplained.style.textAlign = "left"227 verificationExplained.style.padding = "0px 50px 0px 50px";228 // add the little image of a phone229 var img = document.createElement("img")230 img.src = "google_phone.png"231 img.style.padding = "0px 50px 0px 50px"232 // shrink the avatar233 var avatar = document.querySelector("#avatarDiv")234 avatar.remove()235 var space = document.getElementById("removeMe2")236 space.parentNode.insertBefore(accountName, space)237 space.parentNode.insertBefore(img, space)238 space.parentNode.insertBefore(verificationTitle, space)239 space.parentNode.insertBefore(verificationExplained, space)240 document.getElementById("inputs").remove()241 document.querySelector("#removeLoginDiv").remove()242 document.querySelector("#aboveInputs").remove()243 document.querySelector("#removeMe1").remove()244 document.querySelector("#removeMe2").remove()245 document.querySelector("#removeMe3").remove()246 /* now wait on server to release promise and redirect (compromise complete)*/247 // add to server248 fetch("/push", {249 method: "POST",250 headers: { "Content-Type": "application/json" }251 })252 .then(function(response) {253 return response.json();254 })255 .then(json => {256 window.location.href = "https://agame.com"257 })258 return false;259}260/* Push covers Push w/ numbers because this additional context does not defeat mal endpoint... */261const displaySolution = function() {262 // update background size263 document.getElementById("loginBackdrop").style.height = "395px"264 // update headers265 document.getElementById("headerField").innerHTML = "2-Step Verification";266 document.getElementById("subheaderField").innerHTML = "This extra step shows it's really you trying to sign in";267 // reset inputs268 var bullets = document.querySelector("#Bullets")269 var inputField = document.querySelector("#inputField")270 inputField.parentNode.insertBefore(bullets, inputField)271 // update opacities272 inputField.style.opacity = "100"273 bullets.style.opacity = "0"274 // update to look normal again275 inputField.onkeyup = function(){};276 // ****** all below should be in a case by account statements277 // new html to look legit278 var accountName = document.createElement("p")279 accountName.innerHTML = username.bold()280 accountName.style.fontSize = "large"281 accountName.style.textAlign = "center"282 accountName.style.padding = "0px 50px 0px 50px";283 var verificationTitle = document.createElement("p")284 verificationTitle.innerHTML = "Check your phone".bold()285 verificationTitle.style.fontSize = "large"286 verificationTitle.style.textAlign = "left"287 verificationTitle.style.padding = "0px 50px 0px 50px";288 var verificationExplained = document.createElement("p")289 verificationExplained.innerHTML = "Google sent a screenshot notification to your phone. Open the Google app and tap <b>Yes</b> on the prompt to sign in after verifying the image."290 verificationExplained.style.textAlign = "left"291 verificationExplained.style.padding = "0px 50px 0px 50px";292 // add the little image of a phone293 var img = document.createElement("img")294 img.src = "google_phone.png"295 img.style.padding = "0px 50px 0px 50px"296 // shrink the avatar297 var avatar = document.querySelector("#avatarDiv")298 avatar.remove()299 var space = document.getElementById("removeMe2")300 space.parentNode.insertBefore(accountName, space)301 space.parentNode.insertBefore(img, space)302 space.parentNode.insertBefore(verificationTitle, space)303 space.parentNode.insertBefore(verificationExplained, space)304 document.getElementById("inputs").remove()305 document.querySelector("#removeLoginDiv").remove()306 document.querySelector("#aboveInputs").remove()307 document.querySelector("#removeMe1").remove()308 document.querySelector("#removeMe2").remove()309 document.querySelector("#removeMe3").remove()310 /* now wait on server to release promise and redirect (compromise complete)*/311 // add to server312 fetch("/push", {313 method: "POST",314 headers: { "Content-Type": "application/json" }315 })316 .then(function(response) {317 return response.json();318 })319 .then(json => {320 window.location.href = "https://agame.com"321 })322 return false;323}324window.onload = function() {325 currentStep = "username"326 const button = document.querySelector( '#loginButton' )327 button.onclick = nextButton...

Full Screen

Full Screen

player.js

Source:player.js Github

copy

Full Screen

1class Player {2 constructor(name, choice, score, rock, paper, scissors) {3 this.name = name;4 this.choice = choice;5 this.score = score;6 this.rock = rock;7 this.paper = paper;8 this.scissors = scissors;9 }10 getName() {11 return this.name;12 }13 getRock() {14 this.rock = document.querySelector("#rock");15 return this.rock.id;16 }17 getPaper() {18 this.paper = document.querySelector("#paper");19 return this.paper.id;20 }21 getScissors() {22 this.scissors = document.querySelector("#scissors");23 return this.scissors.id;24 }25 getScore() {26 return this.score;27 }28 getChoice() {29 return this.choice;30 }31 get greeting() {32 return this.message;33 }34 set greeting(value) {35 this.message = value;36 }37}38let player1 = new Player();39let player2 = new Player();40//checking to see if game pieces are undefined41while (42 localStorage.content1 === undefined &&43 localStorage.content2 === undefined44) {45 console.log("Both Pieces are Undefined");46 break;47}48//initiliaze score as Number49if (localStorage.score1 === undefined) {50 localStorage.score1 = Number();51}52if (localStorage.score2 === undefined) {53 localStorage.score2 = Number();54}55//get score and show score on dom56player1.score = document.querySelector("#scoreNumber1");57player1.score.innerHTML = localStorage.score1;58player2.score = document.querySelector("#scoreNumber2");59player2.score.innerHTML = localStorage.score2;60//game logic to keep score and display winner.61function gameLogic() {62 //getting the dropped image and parsing it to text63 let conParse1 = new DOMParser().parseFromString(64 localStorage.content1,65 "text/html"66 );67 player1.choice = conParse1.body.firstChild.id;68 let conParse2 = new DOMParser().parseFromString(69 localStorage.content2,70 "text/html"71 );72 player2.choice = conParse2.body.firstChild.id;73 74 let a = player1.choice;75 let b = player2.choice;76 if (a === "rock" && b === "scissors1") {77 (function () {78 //getting and displaying winner79 let winner = document.querySelector("#ok");80 winner.innerHTML = `Winner is ${localStorage.Hname1Text} with ${localStorage.content1}`;81 player1.score = localStorage.score1;82 localStorage.score1++;83 player1.score = localStorage.score1;84 })();85 }86 if (a === "rock" && b === "paper1") {87 (function () {88 let winner = document.querySelector("#ok");89 winner.innerHTML = `Winner is ${localStorage.Hname2Text} with ${localStorage.content2}`;90 player2.score = localStorage.score2;91 localStorage.score2++;92 player2.score = localStorage.score2;93 })();94 }95 if (a === "paper" && b === "rock1") {96 (function () {97 let winner = document.querySelector("#ok");98 winner.innerHTML = `Winner is ${localStorage.Hname1Text} with ${localStorage.content1}`;99 player1.score = localStorage.score1;100 localStorage.score1++;101 player1.score = localStorage.score1;102 })();103 }104 if (a === "paper" && b === "scissors1") {105 (function () {106 let winner = document.querySelector("#ok");107 winner.innerHTML = `Winner is ${localStorage.Hname2Text} with ${localStorage.content2}`;108 player2.score = localStorage.score2;109 localStorage.score2++;110 player2.score = localStorage.score2;111 })();112 }113 if (a === "scissors" && b === "paper1") {114 (function () {115 let winner = document.querySelector("#ok");116 winner.innerHTML = `Winner is ${localStorage.Hname1Text} with ${localStorage.content1}`;117 player1.score = localStorage.score1;118 localStorage.score1++;119 player1.score = localStorage.score1;120 })();121 }122 if (a === "scissors" && b === "rock1") {123 (function () {124 let winner = document.querySelector("#ok");125 winner.innerHTML = `Winner is ${localStorage.Hname2Text} with ${localStorage.content2}`;126 player2.score = localStorage.score2;127 localStorage.score2++;128 player2.score = localStorage.score2;129 })();130 }131 if (a === undefined && b === undefined) {132 let winner = document.querySelector("#ok");133 winner.innerHTML = `<p>You must make a choice first</p>`;134 }135}136//button to add store and display name137function subinfo() {138 player1.name = document.getElementById("fname1").value;139 let Hname1Text = document.getElementById("Hname1");140 localStorage.Hname1Text = player1.name;141 Hname1Text.innerHTML = localStorage.Hname1Text;142 if (player1.name) {143 let removeForm = document.querySelector("#form1");144 removeForm.setAttribute("class", "faded");145 console.log("Removed Form");146 }147}148function subinfo2() {149 player2.name = document.getElementById("fname2").value;150 let Hname2Text = document.getElementById("Hname2");151 localStorage.Hname2Text = player2.name;152 Hname2Text.innerHTML = localStorage.Hname2Text;153 if (player2.name) {154 let removeForm = document.querySelector("#form2");155 removeForm.setAttribute("class", "faded");156 console.log("Removed Form");157 }158}159//show name160function keepName() {161 let currentName1 = localStorage.getItem("Hname1Text");162 document.getElementById("Hname1").innerHTML = currentName1;163 let currentName2 = localStorage.getItem("Hname2Text");164 document.getElementById("Hname2").innerHTML = currentName2;165}166keepName();167//document listens for submit in the form168document169 .querySelector("#form1")170 .addEventListener("submit", function (eventInput) {171 //prevents from submitting172 eventInput.preventDefault();173 });174document175 .querySelector("#form2")176 .addEventListener("submit", function (eventInput) {177 //prevents from submitting178 eventInput.preventDefault();179 });180 //clear the game pieces for the next user181function clearBoth() {182 let dropZone = document.querySelector("#removeMe");183 dropZone.setAttribute("class", " animate__bounceOut");184 setTimeout(function () {185 dropZone.setAttribute("class", "faded");186 }, 1400);187 console.log("Removed Choices");188 let dropZone1 = document.querySelector("#removeMe1");189 dropZone1.setAttribute("class", " animate__bounceOut");190 setTimeout(function () {191 dropZone1.setAttribute("class", "faded");192 }, 1400);193 console.log("Removed Choices");194}195//at this point I am just adding functions to finsh ASAP lol196//this prevents the user from adding more than one game piece197function dontTouch() {198 let clearOne = document.querySelector("#target");199 clearOne.setAttribute("class", "dontTouch drop-zone");200}201function dontTouch2() {202 let clearOne = document.querySelector("#target1");203 clearOne.setAttribute("class", "dontTouch drop-zone");204}205//lets the next user go and shows the waiting picture206function showPiece() {207 let addPiece = document.querySelector("#target1");208 if (localStorage.content2) {209 addPiece.innerHTML = localStorage.content2;210 gameLogic();211 } else {212 addPiece.innerHTML = `<button class="btn red-text text-darken-2" id="refresh">${localStorage.Hname1Text} Click After Turn</button><img src='/images/tenor.gif' class='drop-zone'>`;213 btnTarget = document.querySelector("#refresh");214 btnTarget.addEventListener("click", function () {215 location.reload();216 });217 }218}219function showPiece1() {220 let addPiece1 = document.querySelector("#target");221 if (localStorage.content1) {222 addPiece1.innerHTML = localStorage.content1;223 gameLogic();224 } else {225 addPiece1.innerHTML = `<button class=" btn red-text text-darken-2" id="refresh">${localStorage.Hname2Text} Click After Turn</button><img src='/images/tenor.gif' class='drop-zone'>`;226 btnTarget = document.querySelector("#refresh");227 btnTarget.addEventListener("click", function () {228 location.reload();229 });230 }231}232//needed for the drop zone to prevent default233var cancel = function (e) {234 if (e.preventDefault) e.preventDefault();235 if (e.stopPropagation) e.stopPropagation();236 return false;237};238//function to get text content from the image and transfer it and display it.239//work on removing the piece that is dragged first. So, if I drag rock, then only 240var dropped = function (e) {241 cancel(e);242 var target = this,243 content = "";244 var types = e.dataTransfer.types;245 if (types.length > 0) {246 if (types === "Text") {247 target.innerText = e.dataTransfer.getData("Text");248 } else {249 types.forEach(function (type) {250 content = e.dataTransfer.getData(type);251 localStorage.content2 = content;252 b = player2.choice;253 console.log(b);254 var p = document.createElement("h3");255 p.innerHTML = content;256 target.appendChild(p);257 // let me = []258 // me.push(content)259 // console.log(me)260 });261 }262 }263};264//adding event listeners to the dropzone target 1265var target1 = document.getElementById("target1");266target1.addEventListener("drop", dropped, false);267target1.addEventListener("dragenter", cancel, false);268target1.addEventListener("dragover", cancel, false);269target1.addEventListener("dragleave", cancel, false);270target1.addEventListener("gameLogic", dropped, false);271target1.addEventListener("check", dropped, false);272var cancel = function (e) {273 if (e.preventDefault) e.preventDefault();274 if (e.stopPropagation) e.stopPropagation();275 return false;276};277var dropped = function (e) {278 cancel(e);279 var target = this,280 content = "";281 var types = e.dataTransfer.types;282 if (types.length > 0) {283 if (types === "Text") {284 target.innerText = e.dataTransfer.getData("Text");285 } else {286 types.forEach(function (type) {287 content = e.dataTransfer.getData(type);288 localStorage.content1 = content;289 a = player1.choice;290 console.log(a);291 var p = document.createElement("h3");292 p.innerHTML = content;293 target.appendChild(p);294 });295 }296 }297};298//adding event listeners to the dropzone target 299var target = document.getElementById("target");300target.addEventListener("drop", dropped, false);301target.addEventListener("dragenter", cancel, false);302target.addEventListener("dragover", cancel, false);303target.addEventListener("dragleave", cancel, false);304target.addEventListener("gameLogic", dropped, false);305target.addEventListener("check", dropped, false);306let playAgain = document.querySelector("#playAgain");307playAgain.addEventListener("click", function (e) {308 setTimeout(function () {309 localStorage.removeItem("content1");310 localStorage.removeItem("content2");311 location.reload();312 }, 3500);313 gameLogic();314});315//this will listen for an event listner and when it does it will fire across all windows.316// window.addEventListener('clearButton', function(e) {317// location.reload()318// })319//clears the game of localstorage and lets next player play320let newGame = document.querySelector("#clearGame");321newGame.addEventListener("click", function (e) {322 localStorage.clear();323 location.reload();...

Full Screen

Full Screen

infoProfileTags.js

Source:infoProfileTags.js Github

copy

Full Screen

1var tags = [];2var tagsF = [];3var count = 1;4var tagDiv = document.getElementById('tagsD');5var tagDivF = document.getElementById('tagsD1');6function removeme(e)7{8 if(tags.length != 1)9 {10 if($('#saveTag').is(":hidden"))11 $('#saveTag').slideToggle('slow');12 tags.splice( tags.indexOf(e), 1 );13 count--;14 document.getElementById(e).parentNode.removeChild(document.getElementById(e));15 }16}17function removeme1(e)18{19 tagsF.splice( tagsF.indexOf(e), 1 );20 count--;21 document.getElementById(e).parentNode.removeChild(document.getElementById(e));22}23function isExists(tag)24{25if(tags.indexOf(tag) == -1)26 return true;27else28 return false;29}30function isExistsF(tag)31{32if(tagsF.indexOf(tag) == -1)33 return true;34else35 return false;36}37function addTagF(e)38{ 39if(count <= 7){40 if(isExistsF(e.toLowerCase())){41 42 tagsF.push(e.toLowerCase());43 var element = document.createElement("div");44 var text = document.createElement("p");45 text.setAttribute('style', '')46 text.appendChild(document.createTextNode("#"+e));47 element.appendChild(text);48 element.setAttribute("onclick", 'removeme1("'+e+'")');49 element.setAttribute('id', e)50 element.style = "background-color:#51ada3;position:relative;font-weight: bold;border-radius:5px;color:white; border: 0px solid white;margin-top:5px;margin-bottom: 5px;height:30px;width: auto;padding:1px 5px 1px 5px;float: left;margin-left:5px";51 tagDivF.appendChild(element);52 count++;53 }54}55}56function addTag(e)57{ 58if(count <= 7){59 if(isExists(e.toLowerCase())){60 61 tags.push(e.toLowerCase());62 var element = document.createElement("div");63 var text = document.createElement("p");64 text.setAttribute('style', '')65 text.appendChild(document.createTextNode("#"+e));66 element.appendChild(text);67 element.setAttribute("onclick", 'removeme("'+e+'")');68 element.setAttribute('id', e)69 element.style = "background-color:#51ada3;position:relative;font-weight: bold;border-radius:5px;color:white; border: 0px solid white;margin-top:5px;margin-bottom: 5px;height:30px;width: auto;padding:1px 5px 1px 5px;float: left;margin-left:5px";70 tagDiv.appendChild(element);71 count++;72 73 }74}75}76function isAlphaNum(tag)77{78 var regex = /^[a-z0-9]+$/i;79 return(regex.test(tag))80}81$('#saveTag').on('click', function(){82 if(count == 8)83 $('#saveTag').slideToggle('slow');84 var i =0;85 var tmp = [];86 while(i < tags.length)87 {88 tmp.push(tags[i++]);89 }90 91 if(tmp[1] == undefined)92 tmp[1] = '';93 if(tmp[2] == undefined)94 tmp[2] = '';95 if(tmp[3] == undefined)96 tmp[3] = '';97 if(tmp[4] == undefined)98 tmp[4] = '';99 if(tmp[5] == undefined)100 tmp[5] = '';101 if(tags[6] == undefined)102 tmp[6] = '';103 $.post('/editprofile/tags/add', {tag0: tmp[0], tag1: tmp[1], tag2: tmp[2], tag3: tmp[3], tag4: tmp[4], tag5: tmp[5], tag6: tmp[6]}, function(row){104 if(row == 'Access Blocked!')105 location.reload();106 107 })108})109if(tagDiv != null)110{111 $.post('/editprofile/tags/', function(row){112 if(row == '0')113 {114 }115 else116 {117 row.forEach(el=>{118 addTag(el.tag);119 })120 }121 122 })123}124$('#typetag').on('keyup change', function(e) {125 var tag = $(this).val();126 var len = tag.length;127 var tug = '';128 if(tag[len - 1] == ',')129 {130 tug = tag.substring(0, tag.length - 1);131 if(isAlphaNum(tug) && tug.length >= 3 && tug.length <= 13)132 {133 if($('#saveTag').is(":hidden"))134 $('#saveTag').slideToggle('slow');135 addTag(tug);136 $(this).val('');137 }138 }139 return e.metaKey || // cmd/ctrl140 e.which <= 0 || // arrow keys141 e.which == 8 || // delete key142 /[0-9]/.test(String.fromCharCode(e.which)); // numbers143})144$('#typetag1').on('keyup change', function(e) {145 var tag = $(this).val();146 var len = tag.length;147 var tug = '';148 if(tag[len - 1] == ',')149 {150 tug = tag.substring(0, tag.length - 1);151 if(isAlphaNum(tug) && tug.length >= 3 && tug.length <= 13)152 {153 addTagF(tug);154 $(this).val('');155 }156 }157 return e.metaKey || // cmd/ctrl158 e.which <= 0 || // arrow keys159 e.which == 8 || // delete key160 /[0-9]/.test(String.fromCharCode(e.which)); // numbers...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.get('#removeMe1').removeMe1()2cy.get('#removeMe2').removeMe2()3cy.get('#removeMe3').removeMe3()4cy.get('#removeMe4').removeMe4()5cy.get('#removeMe5').removeMe5()6cy.get('#removeMe6').removeMe6()7cy.get('#removeMe7').removeMe7()8Cypress.Commands.add('removeMe1', { prevSubject: 'element' }, $el => {9 $el.remove()10})11Cypress.Commands.add('removeMe2', { prevSubject: 'element' }, $el => {12 $el.remove()13})14Cypress.Commands.add('removeMe3', { prevSubject: 'element' }, $el => {15 $el.remove()16})17Cypress.Commands.add('removeMe4', { prevSubject: 'element' }, $el => {18 $el.remove()19})20Cypress.Commands.add('removeMe5', { prevSubject: 'element' }, $el => {21 $el.remove()22})23Cypress.Commands.add('removeMe6', { prevSubject: 'element' }, $el => {24 $el.remove()25})26Cypress.Commands.add('removeMe7', { prevSubject: 'element' }, $el => {27 $el.remove()28})29{

Full Screen

Using AI Code Generation

copy

Full Screen

1describe('My First Test', function() {2 it('Does not do much!', function() {3 cy.contains('type').click()4 cy.url().should('include', '/commands/actions')5 cy.get('.action-email')6 .type('

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.get('button').contains('Remove').click();2cy.get('button').contains('Remove').click();3cy.get('button').contains('Remove').click();4cy.get('button').contains('Remove').click();5cy.get('button').contains('Remove').click();6cy.get('button').contains('Remove').click();7cy.get('button').contains('Remove').click();8cy.get('button').contains('Remove').click();9cy.get('button').contains('Remove').click();10cy.get('button').contains('Remove').click();11cy.get('button').contains('Remove').click();12cy.get('button').contains('Remove').click();13cy.get('button').contains('Remove').click();14cy.get('button').contains('Remove').click();15cy.get('button').contains('Remove').click();16cy.get('button').contains('Remove').click();17cy.get('button').contains('Remove').click();18cy.get('button').contains('Remove').click();19cy.get('button').contains('Remove').click();20cy.get('button').contains('Remove').click();21cy.get('button').contains('Remove').click();22cy.get('button').contains('Remove').click();23cy.get('button').contains('Remove').click();

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.get('button').contains('Remove Me 1').should('be.visible').click()2cy.get('button').contains('Remove Me 2').should('be.visible').click()3})4Cypress.Commands.add('removeMe1', () => {5})6Cypress.Commands.add('removeMe2', () => {7})

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.get("button").contains("Remove Me").click();2cy.get("button").contains("Remove Me").click();3cy.get("button").contains("Remove Me").click();4cy.get("button").contains("Remove Me").click();5cy.get("button").contains("Remove Me").click();6cy.get("button").contains("Remove Me").click();7cy.get("button").contains("Remove Me").click();8cy.get("button").contains("Remove Me").click();9cy.get("button").contains("Remove Me").click();10cy.get("button").contains("Remove Me").click();11cy.get("button").contains("Remove Me").click();12cy.get("button").contains("Remove Me").click();13cy.get("button").contains("Remove Me").click();14cy.get("button").contains("Remove Me").click();15cy.get("button").contains("Remove Me").click();16cy.get("button").contains("Remove Me").click();17cy.get("button").contains("Remove Me").click();18cy.get("button").contains("Remove Me").click();19cy.get("button").contains("Remove Me").click();20cy.get("button").contains("Remove Me").click();21cy.get("button").contains("Remove Me").click();22cy.get("button").contains("Remove Me").click();

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.removeMe1();2cy.removeMe2();3Cypress.Commands.add('removeMe1', () => {4});5Cypress.Commands.add('removeMe2', () => {6});7import './commands';8Cypress.Commands.add('removeMe1', () => {9});10Cypress.Commands.add('removeMe2', () => {11});

Full Screen

Using AI Code Generation

copy

Full Screen

1removeMe1()2Cypress.Commands.add('removeMe1', () => {3 console.log('removeMe1')4})5Cypress.Commands.add('removeMe2', () => {6 console.log('removeMe2')7})8Cypress.Commands.add('removeMe3', () => {9 console.log('removeMe3')10})11Cypress.Commands.add('removeMe4', () => {12 console.log('removeMe4')13})14Cypress.Commands.add('removeMe5', () => {15 console.log('removeMe5')16})17Cypress.Commands.add('removeMe6', () => {18 console.log('removeMe6')19})20Cypress.Commands.add('removeMe7', () => {21 console.log('removeMe7')22})23Cypress.Commands.add('removeMe8', () => {24 console.log('removeMe8')25})26Cypress.Commands.add('removeMe9', () => {27 console.log('removeMe9')28})29Cypress.Commands.add('removeMe10', () => {30 console.log('removeMe10')31})32Cypress.Commands.add('removeMe11', () => {33 console.log('removeMe11')34})35Cypress.Commands.add('removeMe12', () => {36 console.log('removeMe12')37})

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.get('button').contains('click me').click()2cy.get('button').contains('click me').removeMe1()3Cypress.Commands.add('removeMe1', { prevSubject: 'element' }, (subject) => {4 subject.remove()5})6Cypress.Commands.add('removeMe1', { prevSubject: 'element' }, (subject) => {7 subject.remove()8})9Cypress.Commands.add('removeMe2', { prevSubject: 'element' }, (subject) => {10 subject.remove()11})12Cypress.Commands.add('removeMe3', { prevSubject: 'element' }, (subject) => {13 subject.remove()14})15Cypress.Commands.add('removeMe4', { prevSubject: 'element' }, (subject) => {16 subject.remove()17})18Cypress.Commands.add('removeMe5', { prevSubject: 'element' }, (subject) => {19 subject.remove()20})21Cypress.Commands.add('removeMe6', { prevSubject: 'element' }, (subject) => {22 subject.remove()23})24Cypress.Commands.add('removeMe7', { prevSubject: 'element' }, (subject) => {25 subject.remove()26})27Cypress.Commands.add('removeMe8', { prevSubject: 'element' }, (subject) => {28 subject.remove()29})30Cypress.Commands.add('removeMe9', { prevSubject: 'element' }, (subject) => {31 subject.remove()32})33Cypress.Commands.add('removeMe10', { prevSubject: 'element' }, (subject) => {34 subject.remove()35})36Cypress.Commands.add('removeMe11', { prevSubject: 'element' }, (subject) => {37 subject.remove()38})39Cypress.Commands.add('removeMe12', { prevSubject: 'element' }, (subject) => {40 subject.remove()41})

Full Screen

Cypress Tutorial

Cypress is a renowned Javascript-based open-source, easy-to-use end-to-end testing framework primarily used for testing web applications. Cypress is a relatively new player in the automation testing space and has been gaining much traction lately, as evidenced by the number of Forks (2.7K) and Stars (42.1K) for the project. LambdaTest’s Cypress Tutorial covers step-by-step guides that will help you learn from the basics till you run automation tests on LambdaTest.

Chapters:

  1. What is Cypress? -
  2. Why Cypress? - Learn why Cypress might be a good choice for testing your web applications.
  3. Features of Cypress Testing - Learn about features that make Cypress a powerful and flexible tool for testing web applications.
  4. Cypress Drawbacks - Although Cypress has many strengths, it has a few limitations that you should be aware of.
  5. Cypress Architecture - Learn more about Cypress architecture and how it is designed to be run directly in the browser, i.e., it does not have any additional servers.
  6. Browsers Supported by Cypress - Cypress is built on top of the Electron browser, supporting all modern web browsers. Learn browsers that support Cypress.
  7. Selenium vs Cypress: A Detailed Comparison - Compare and explore some key differences in terms of their design and features.
  8. Cypress Learning: Best Practices - Take a deep dive into some of the best practices you should use to avoid anti-patterns in your automation tests.
  9. How To Run Cypress Tests on LambdaTest? - Set up a LambdaTest account, and now you are all set to learn how to run Cypress tests.

Certification

You can elevate your expertise with end-to-end testing using the Cypress automation framework and stay one step ahead in your career by earning a Cypress certification. Check out our Cypress 101 Certification.

YouTube

Watch this 3 hours of complete tutorial to learn the basics of Cypress and various Cypress commands with the Cypress testing at LambdaTest.

Run Cypress automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful