[{"data":1,"prerenderedAt":8013},["ShallowReactive",2],{"blog-troubleshooting-suitecommerce-15-common-errors-how-to-fix":3,"all-blog-posts":7815},{"id":4,"title":5,"author":6,"body":7,"categories":7793,"date":7796,"description":7797,"extension":7798,"heroImage":7799,"meta":7800,"navigation":192,"path":7806,"relatedArticles":7807,"seo":7808,"stem":7809,"tags":7810,"__hash__":7814},"content\u002Fblog\u002Ftroubleshooting-suitecommerce-15-common-errors-how-to-fix.md","Troubleshooting SuiteCommerce: 15 Common Errors and How to Fix Them","Stenbase Team",{"type":8,"value":9,"toc":7749},"minimark",[10,14,18,21,24,29,88,91,94,101,106,112,123,128,139,145,157,162,165,284,287,293,296,367,370,407,412,430,432,436,440,451,455,461,466,470,473,479,482,555,558,639,642,648,652,663,665,669,673,684,688,694,699,703,706,780,783,917,920,994,997,1036,1040,1051,1053,1056,1060,1064,1081,1085,1091,1096,1100,1103,1154,1157,1242,1245,1315,1318,1384,1388,1402,1404,1408,1412,1423,1427,1433,1438,1442,1445,1468,1471,1520,1523,1596,1599,1734,1738,1752,1754,1758,1762,1773,1777,1783,1788,1792,1795,1984,1987,2052,2055,2133,2136,2209,2213,2224,2226,2229,2233,2237,2248,2252,2258,2263,2267,2270,2297,2300,2350,2353,2424,2427,2508,2512,2523,2525,2529,2533,2544,2549,2554,2558,2561,2644,2647,2747,2750,2818,2821,3006,3010,3021,3023,3027,3031,3042,3046,3052,3057,3061,3064,3112,3115,3196,3199,3368,3371,3524,3528,3539,3541,3544,3548,3552,3563,3567,3573,3578,3582,3585,3591,3594,3600,3603,3665,3668,3674,3677,4043,4047,4058,4060,4064,4068,4079,4083,4089,4094,4098,4101,4341,4344,4711,4714,4861,4865,4876,4878,4881,4885,4889,4900,4904,4910,4915,4919,4922,5051,5054,5264,5267,5431,5434,5486,5490,5504,5506,5510,5514,5525,5529,5535,5540,5544,5547,5668,5671,5893,5896,6018,6022,6036,6038,6041,6047,6051,6055,6066,6071,6077,6082,6086,6089,6203,6206,6377,6380,6425,6428,6579,6583,6597,6599,6603,6607,6618,6622,6628,6633,6637,6640,6963,6966,7182,7185,7425,7428,7465,7469,7483,7485,7488,7492,7542,7546,7549,7557,7561,7567,7571,7637,7639,7642,7645,7677,7685,7687,7690,7694,7705,7709,7712,7716,7719,7723,7726,7730,7733,7735,7746],[11,12,5],"h1",{"id":13},"troubleshooting-suitecommerce-15-common-errors-and-how-to-fix-them",[15,16,17],"p",{},"You're staring at a cryptic error message. The deployment failed. The client is waiting. Your search results are showing you forum posts from 2019 that don't apply to your version.",[15,19,20],{},"We've been there. After years of SuiteCommerce development, we've catalogued the errors that actually happen in production—not the textbook scenarios, but the real problems that eat your hours.",[15,22,23],{},"This guide documents 15 common SuiteCommerce errors with their exact symptoms, root causes, and tested solutions. Bookmark it.",[25,26,28],"h2",{"id":27},"table-of-contents","Table of Contents",[30,31,32,40,46,52,58,64,70,76,82],"ul",{},[33,34,35],"li",{},[36,37,39],"a",{"href":38},"#deployment-errors","Deployment Errors",[33,41,42],{},[36,43,45],{"href":44},"#theme-compilation-issues","Theme Compilation Issues",[33,47,48],{},[36,49,51],{"href":50},"#extension-conflicts","Extension Conflicts",[33,53,54],{},[36,55,57],{"href":56},"#netsuite-sync-failures","NetSuite Sync Failures",[33,59,60],{},[36,61,63],{"href":62},"#payment-gateway-errors","Payment Gateway Errors",[33,65,66],{},[36,67,69],{"href":68},"#performance-degradation","Performance Degradation",[33,71,72],{},[36,73,75],{"href":74},"#debugging-best-practices","Debugging Best Practices",[33,77,78],{},[36,79,81],{"href":80},"#when-to-escalate","When to Escalate",[33,83,84],{},[36,85,87],{"href":86},"#faq","FAQ",[89,90],"hr",{},[25,92,39],{"id":93},"deployment-errors",[15,95,96],{},[97,98],"img",{"alt":99,"src":100},"Error message and warning display on screen","\u002Fimages\u002Fblog\u002Ftroubleshooting-errors-error-screen.webp",[102,103,105],"h3",{"id":104},"error-1-deployment-failed-ssp-application-bundle-error","Error #1: \"Deployment Failed: SSP Application Bundle Error\"",[15,107,108],{},[109,110,111],"strong",{},"Symptoms:",[30,113,114,117,120],{},[33,115,116],{},"Gulp deploy completes locally but NetSuite deployment fails",[33,118,119],{},"Error appears in SuiteCommerce Configuration > SSP Applications",[33,121,122],{},"Site returns 500 errors after attempted deployment",[15,124,125],{},[109,126,127],{},"Error Message:",[129,130,135],"pre",{"className":131,"code":133,"language":134},[132],"language-text","Error: Failed to deploy SSP Application bundle\nCode: SSP_APP_BUNDLE_ERROR\nDetails: Bundle validation failed - incompatible script version\n","text",[136,137,133],"code",{"__ignoreMap":138},"",[15,140,141,144],{},[109,142,143],{},"Root Cause:","\nThe SuiteScript version specified in your SSP application doesn't match the scripts in your bundle. This commonly happens when:",[146,147,148,151,154],"ol",{},[33,149,150],{},"Local development environment uses different SuiteScript API version than production",[33,152,153],{},"Custom scripts reference API modules not available in your NetSuite account version",[33,155,156],{},"Bundle was built against a different SuiteCommerce version",[15,158,159],{},[109,160,161],{},"Solution:",[15,163,164],{},"Step 1: Verify SuiteScript versions in your entry points",[129,166,170],{"className":167,"code":168,"language":169,"meta":138,"style":138},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F Check your service files (*.ss files)\n\u002F\u002F They should specify the correct API version\n\n\u002F**\n * @NApiVersion 2.1\n * @NModuleScope Public\n *\u002F\ndefine(['N\u002Frecord', 'N\u002Fsearch'], function(record, search) {\n  \u002F\u002F Ensure all N\u002F modules are available in your NetSuite version\n});\n","javascript",[136,171,172,181,187,194,200,213,224,230,272,278],{"__ignoreMap":138},[173,174,177],"span",{"class":175,"line":176},"line",1,[173,178,180],{"class":179},"sJ8bj","\u002F\u002F Check your service files (*.ss files)\n",[173,182,184],{"class":175,"line":183},2,[173,185,186],{"class":179},"\u002F\u002F They should specify the correct API version\n",[173,188,190],{"class":175,"line":189},3,[173,191,193],{"emptyLinePlaceholder":192},true,"\n",[173,195,197],{"class":175,"line":196},4,[173,198,199],{"class":179},"\u002F**\n",[173,201,203,206,210],{"class":175,"line":202},5,[173,204,205],{"class":179}," * ",[173,207,209],{"class":208},"szBVR","@NApiVersion",[173,211,212],{"class":179}," 2.1\n",[173,214,216,218,221],{"class":175,"line":215},6,[173,217,205],{"class":179},[173,219,220],{"class":208},"@NModuleScope",[173,222,223],{"class":179}," Public\n",[173,225,227],{"class":175,"line":226},7,[173,228,229],{"class":179}," *\u002F\n",[173,231,233,237,241,245,248,251,254,257,260,264,266,269],{"class":175,"line":232},8,[173,234,236],{"class":235},"sScJk","define",[173,238,240],{"class":239},"sVt8B","([",[173,242,244],{"class":243},"sZZnC","'N\u002Frecord'",[173,246,247],{"class":239},", ",[173,249,250],{"class":243},"'N\u002Fsearch'",[173,252,253],{"class":239},"], ",[173,255,256],{"class":208},"function",[173,258,259],{"class":239},"(",[173,261,263],{"class":262},"s4XuR","record",[173,265,247],{"class":239},[173,267,268],{"class":262},"search",[173,270,271],{"class":239},") {\n",[173,273,275],{"class":175,"line":274},9,[173,276,277],{"class":179},"  \u002F\u002F Ensure all N\u002F modules are available in your NetSuite version\n",[173,279,281],{"class":175,"line":280},10,[173,282,283],{"class":239},"});\n",[15,285,286],{},"Step 2: Check NetSuite account compatibility",[129,288,291],{"className":289,"code":290,"language":134},[132],"NetSuite > Setup > Company > Company Information\nNote your \"Version\" and \"Release\"\n\nCompare against SuiteCommerce reference documentation for API compatibility\n",[136,292,290],{"__ignoreMap":138},[15,294,295],{},"Step 3: Rebuild with correct target",[129,297,301],{"className":298,"code":299,"language":300,"meta":138,"style":138},"language-bash shiki shiki-themes github-light github-dark","# Clean build artifacts\ngulp clean\n\n# Rebuild with explicit version target\ngulp deploy --target production --source local\n\n# If using developer tools extension:\nsuitecommerce-cli deploy --account production\n","bash",[136,302,303,308,316,320,325,345,349,354],{"__ignoreMap":138},[173,304,305],{"class":175,"line":176},[173,306,307],{"class":179},"# Clean build artifacts\n",[173,309,310,313],{"class":175,"line":183},[173,311,312],{"class":235},"gulp",[173,314,315],{"class":243}," clean\n",[173,317,318],{"class":175,"line":189},[173,319,193],{"emptyLinePlaceholder":192},[173,321,322],{"class":175,"line":196},[173,323,324],{"class":179},"# Rebuild with explicit version target\n",[173,326,327,329,332,336,339,342],{"class":175,"line":202},[173,328,312],{"class":235},[173,330,331],{"class":243}," deploy",[173,333,335],{"class":334},"sj4cs"," --target",[173,337,338],{"class":243}," production",[173,340,341],{"class":334}," --source",[173,343,344],{"class":243}," local\n",[173,346,347],{"class":175,"line":215},[173,348,193],{"emptyLinePlaceholder":192},[173,350,351],{"class":175,"line":226},[173,352,353],{"class":179},"# If using developer tools extension:\n",[173,355,356,359,361,364],{"class":175,"line":232},[173,357,358],{"class":235},"suitecommerce-cli",[173,360,331],{"class":243},[173,362,363],{"class":334}," --account",[173,365,366],{"class":243}," production\n",[15,368,369],{},"Step 4: Validate bundle before deployment",[129,371,373],{"className":298,"code":372,"language":300,"meta":138,"style":138},"# Run local validation\ngulp validate\n\n# Check for any SuiteScript syntax errors\nnpm run lint:suitescript\n",[136,374,375,380,387,391,396],{"__ignoreMap":138},[173,376,377],{"class":175,"line":176},[173,378,379],{"class":179},"# Run local validation\n",[173,381,382,384],{"class":175,"line":183},[173,383,312],{"class":235},[173,385,386],{"class":243}," validate\n",[173,388,389],{"class":175,"line":189},[173,390,193],{"emptyLinePlaceholder":192},[173,392,393],{"class":175,"line":196},[173,394,395],{"class":179},"# Check for any SuiteScript syntax errors\n",[173,397,398,401,404],{"class":175,"line":202},[173,399,400],{"class":235},"npm",[173,402,403],{"class":243}," run",[173,405,406],{"class":243}," lint:suitescript\n",[15,408,409],{},[109,410,411],{},"Prevention:",[30,413,414,420,427],{},[33,415,416,417],{},"Lock your Node.js version in ",[136,418,419],{},".nvmrc",[33,421,422,423,426],{},"Use ",[136,424,425],{},"package-lock.json"," to freeze dependencies",[33,428,429],{},"Test deployments in sandbox before production",[89,431],{},[102,433,435],{"id":434},"error-2-insufficient_permission-you-do-not-have-permission-to-access-this-resource","Error #2: \"INSUFFICIENT_PERMISSION: You do not have permission to access this resource\"",[15,437,438],{},[109,439,111],{},[30,441,442,445,448],{},[33,443,444],{},"Deployment fails at the upload step",[33,446,447],{},"Web Services access denied errors",[33,449,450],{},"Sometimes works for one developer but not another",[15,452,453],{},[109,454,127],{},[129,456,459],{"className":457,"code":458,"language":134},[132],"INSUFFICIENT_PERMISSION\nYou do not have permission to deploy to this website.\nUser role does not have SuiteCommerce deployment permissions.\n",[136,460,458],{"__ignoreMap":138},[15,462,463,465],{},[109,464,143],{},"\nThe deploying user lacks required permissions. SuiteCommerce deployment requires specific role configurations that are often incomplete.",[15,467,468],{},[109,469,161],{},[15,471,472],{},"Step 1: Verify role permissions",[129,474,477],{"className":475,"code":476,"language":134},[132],"NetSuite > Setup > Users\u002FRoles > Manage Roles\n\nRequired permissions for deployment role:\n□ Lists > Documents and Files: Full\n□ Setup > SuiteScript: Full\n□ Setup > SuiteCommerce Advanced (or SCA): Full\n□ Setup > SSP Applications: Full\n□ Custom Records > (any custom records used): Full\n□ Web Services > SuiteScript: Full\n",[136,478,476],{"__ignoreMap":138},[15,480,481],{},"Step 2: Check deployment credentials",[129,483,485],{"className":167,"code":484,"language":169,"meta":138,"style":138},"\u002F\u002F In your deployment configuration (netsuite.json or distro.json)\n{\n  \"credentials\": {\n    \"email\": \"deployer@company.com\",\n    \"role\": \"1001\",  \u002F\u002F Verify this role ID exists and has permissions\n    \"account\": \"1234567\"\n  }\n}\n",[136,486,487,492,497,505,519,535,545,550],{"__ignoreMap":138},[173,488,489],{"class":175,"line":176},[173,490,491],{"class":179},"\u002F\u002F In your deployment configuration (netsuite.json or distro.json)\n",[173,493,494],{"class":175,"line":183},[173,495,496],{"class":239},"{\n",[173,498,499,502],{"class":175,"line":189},[173,500,501],{"class":243},"  \"credentials\"",[173,503,504],{"class":239},": {\n",[173,506,507,510,513,516],{"class":175,"line":196},[173,508,509],{"class":243},"    \"email\"",[173,511,512],{"class":239},": ",[173,514,515],{"class":243},"\"deployer@company.com\"",[173,517,518],{"class":239},",\n",[173,520,521,524,526,529,532],{"class":175,"line":202},[173,522,523],{"class":243},"    \"role\"",[173,525,512],{"class":239},[173,527,528],{"class":243},"\"1001\"",[173,530,531],{"class":239},",  ",[173,533,534],{"class":179},"\u002F\u002F Verify this role ID exists and has permissions\n",[173,536,537,540,542],{"class":175,"line":215},[173,538,539],{"class":243},"    \"account\"",[173,541,512],{"class":239},[173,543,544],{"class":243},"\"1234567\"\n",[173,546,547],{"class":175,"line":226},[173,548,549],{"class":239},"  }\n",[173,551,552],{"class":175,"line":232},[173,553,554],{"class":239},"}\n",[15,556,557],{},"Step 3: Verify token-based authentication (if using)",[129,559,561],{"className":298,"code":560,"language":300,"meta":138,"style":138},"# Token must be created with a role that has deployment permissions\n# Regenerate token if role permissions changed after token creation\n\nNetSuite > Setup > Users\u002FRoles > Access Tokens\nCreate new token with deployment role\nUpdate local configuration with new token\n",[136,562,563,568,573,577,601,621],{"__ignoreMap":138},[173,564,565],{"class":175,"line":176},[173,566,567],{"class":179},"# Token must be created with a role that has deployment permissions\n",[173,569,570],{"class":175,"line":183},[173,571,572],{"class":179},"# Regenerate token if role permissions changed after token creation\n",[173,574,575],{"class":175,"line":189},[173,576,193],{"emptyLinePlaceholder":192},[173,578,579,582,585,588,590,593,595,598],{"class":175,"line":196},[173,580,581],{"class":235},"NetSuite",[173,583,584],{"class":208}," >",[173,586,587],{"class":243}," Setup",[173,589,584],{"class":208},[173,591,592],{"class":243}," Users\u002FRoles",[173,594,584],{"class":208},[173,596,597],{"class":243}," Access",[173,599,600],{"class":243}," Tokens\n",[173,602,603,606,609,612,615,618],{"class":175,"line":202},[173,604,605],{"class":235},"Create",[173,607,608],{"class":243}," new",[173,610,611],{"class":243}," token",[173,613,614],{"class":243}," with",[173,616,617],{"class":243}," deployment",[173,619,620],{"class":243}," role\n",[173,622,623,626,629,632,634,636],{"class":175,"line":215},[173,624,625],{"class":235},"Update",[173,627,628],{"class":243}," local",[173,630,631],{"class":243}," configuration",[173,633,614],{"class":243},[173,635,608],{"class":243},[173,637,638],{"class":243}," token\n",[15,640,641],{},"Step 4: Check two-factor authentication",[129,643,646],{"className":644,"code":645,"language":134},[132],"If 2FA is enforced on the deployment account:\n- Use token-based authentication instead of email\u002Fpassword\n- Or create a dedicated service account with 2FA exemption\n",[136,647,645],{"__ignoreMap":138},[15,649,650],{},[109,651,411],{},[30,653,654,657,660],{},[33,655,656],{},"Create a dedicated deployment role (clone Administrator, remove unnecessary permissions)",[33,658,659],{},"Use token-based authentication for CI\u002FCD pipelines",[33,661,662],{},"Document the required permissions in your team wiki",[89,664],{},[102,666,668],{"id":667},"error-3-file-cabinet-upload-failed-maximum-file-size-exceeded","Error #3: \"File Cabinet Upload Failed: Maximum File Size Exceeded\"",[15,670,671],{},[109,672,111],{},[30,674,675,678,681],{},[33,676,677],{},"Deployment fails during file upload phase",[33,679,680],{},"Works with small changes, fails with large ones",[33,682,683],{},"Happens more often with image-heavy themes",[15,685,686],{},[109,687,127],{},[129,689,692],{"className":690,"code":691,"language":134},[132],"FILE_UPLOAD_ERROR\nMaximum file size exceeded for File Cabinet upload\nLimit: 10MB per file, 200MB per deployment bundle\n",[136,693,691],{"__ignoreMap":138},[15,695,696,698],{},[109,697,143],{},"\nNetSuite File Cabinet has strict size limits. Large images, unminified JavaScript bundles, or source maps can exceed these limits.",[15,700,701],{},[109,702,161],{},[15,704,705],{},"Step 1: Identify large files",[129,707,709],{"className":298,"code":708,"language":300,"meta":138,"style":138},"# Find files over 1MB in your deployment\nfind .\u002FDeployDistribution -type f -size +1M -exec ls -lh {} \\;\n\n# Common culprits:\n# - Unoptimized product images\n# - Source maps in production build\n# - Unminified vendor bundles\n# - Unused font files\n",[136,710,711,716,751,755,760,765,770,775],{"__ignoreMap":138},[173,712,713],{"class":175,"line":176},[173,714,715],{"class":179},"# Find files over 1MB in your deployment\n",[173,717,718,721,724,727,730,733,736,739,742,745,748],{"class":175,"line":183},[173,719,720],{"class":235},"find",[173,722,723],{"class":243}," .\u002FDeployDistribution",[173,725,726],{"class":334}," -type",[173,728,729],{"class":243}," f",[173,731,732],{"class":334}," -size",[173,734,735],{"class":243}," +1M",[173,737,738],{"class":334}," -exec",[173,740,741],{"class":243}," ls",[173,743,744],{"class":334}," -lh",[173,746,747],{"class":243}," {}",[173,749,750],{"class":334}," \\;\n",[173,752,753],{"class":175,"line":189},[173,754,193],{"emptyLinePlaceholder":192},[173,756,757],{"class":175,"line":196},[173,758,759],{"class":179},"# Common culprits:\n",[173,761,762],{"class":175,"line":202},[173,763,764],{"class":179},"# - Unoptimized product images\n",[173,766,767],{"class":175,"line":215},[173,768,769],{"class":179},"# - Source maps in production build\n",[173,771,772],{"class":175,"line":226},[173,773,774],{"class":179},"# - Unminified vendor bundles\n",[173,776,777],{"class":175,"line":232},[173,778,779],{"class":179},"# - Unused font files\n",[15,781,782],{},"Step 2: Optimize your build",[129,784,786],{"className":167,"code":785,"language":169,"meta":138,"style":138},"\u002F\u002F gulpfile.js - ensure production build excludes source maps\ngulp.task('deploy', function() {\n  return gulp.src(sources)\n    .pipe(gulpif(isProduction, uglify()))\n    .pipe(gulpif(isProduction, cleanCSS()))\n    .pipe(gulpif(!isProduction, sourcemaps.write('.'))) \u002F\u002F Only for dev\n    .pipe(gulp.dest(destination));\n});\n",[136,787,788,793,813,827,849,866,898,913],{"__ignoreMap":138},[173,789,790],{"class":175,"line":176},[173,791,792],{"class":179},"\u002F\u002F gulpfile.js - ensure production build excludes source maps\n",[173,794,795,798,801,803,806,808,810],{"class":175,"line":183},[173,796,797],{"class":239},"gulp.",[173,799,800],{"class":235},"task",[173,802,259],{"class":239},[173,804,805],{"class":243},"'deploy'",[173,807,247],{"class":239},[173,809,256],{"class":208},[173,811,812],{"class":239},"() {\n",[173,814,815,818,821,824],{"class":175,"line":189},[173,816,817],{"class":208},"  return",[173,819,820],{"class":239}," gulp.",[173,822,823],{"class":235},"src",[173,825,826],{"class":239},"(sources)\n",[173,828,829,832,835,837,840,843,846],{"class":175,"line":196},[173,830,831],{"class":239},"    .",[173,833,834],{"class":235},"pipe",[173,836,259],{"class":239},[173,838,839],{"class":235},"gulpif",[173,841,842],{"class":239},"(isProduction, ",[173,844,845],{"class":235},"uglify",[173,847,848],{"class":239},"()))\n",[173,850,851,853,855,857,859,861,864],{"class":175,"line":202},[173,852,831],{"class":239},[173,854,834],{"class":235},[173,856,259],{"class":239},[173,858,839],{"class":235},[173,860,842],{"class":239},[173,862,863],{"class":235},"cleanCSS",[173,865,848],{"class":239},[173,867,868,870,872,874,876,878,881,884,887,889,892,895],{"class":175,"line":215},[173,869,831],{"class":239},[173,871,834],{"class":235},[173,873,259],{"class":239},[173,875,839],{"class":235},[173,877,259],{"class":239},[173,879,880],{"class":208},"!",[173,882,883],{"class":239},"isProduction, sourcemaps.",[173,885,886],{"class":235},"write",[173,888,259],{"class":239},[173,890,891],{"class":243},"'.'",[173,893,894],{"class":239},"))) ",[173,896,897],{"class":179},"\u002F\u002F Only for dev\n",[173,899,900,902,904,907,910],{"class":175,"line":226},[173,901,831],{"class":239},[173,903,834],{"class":235},[173,905,906],{"class":239},"(gulp.",[173,908,909],{"class":235},"dest",[173,911,912],{"class":239},"(destination));\n",[173,914,915],{"class":175,"line":232},[173,916,283],{"class":239},[15,918,919],{},"Step 3: Split large bundles",[129,921,923],{"className":167,"code":922,"language":169,"meta":138,"style":138},"\u002F\u002F If using webpack, configure code splitting\nmodule.exports = {\n  optimization: {\n    splitChunks: {\n      chunks: 'all',\n      maxSize: 500000, \u002F\u002F 500KB max per chunk\n    }\n  }\n};\n",[136,924,925,930,947,952,957,967,980,985,989],{"__ignoreMap":138},[173,926,927],{"class":175,"line":176},[173,928,929],{"class":179},"\u002F\u002F If using webpack, configure code splitting\n",[173,931,932,935,938,941,944],{"class":175,"line":183},[173,933,934],{"class":334},"module",[173,936,937],{"class":239},".",[173,939,940],{"class":334},"exports",[173,942,943],{"class":208}," =",[173,945,946],{"class":239}," {\n",[173,948,949],{"class":175,"line":189},[173,950,951],{"class":239},"  optimization: {\n",[173,953,954],{"class":175,"line":196},[173,955,956],{"class":239},"    splitChunks: {\n",[173,958,959,962,965],{"class":175,"line":202},[173,960,961],{"class":239},"      chunks: ",[173,963,964],{"class":243},"'all'",[173,966,518],{"class":239},[173,968,969,972,975,977],{"class":175,"line":215},[173,970,971],{"class":239},"      maxSize: ",[173,973,974],{"class":334},"500000",[173,976,247],{"class":239},[173,978,979],{"class":179},"\u002F\u002F 500KB max per chunk\n",[173,981,982],{"class":175,"line":226},[173,983,984],{"class":239},"    }\n",[173,986,987],{"class":175,"line":232},[173,988,549],{"class":239},[173,990,991],{"class":175,"line":274},[173,992,993],{"class":239},"};\n",[15,995,996],{},"Step 4: Remove unused assets",[129,998,1000],{"className":298,"code":999,"language":300,"meta":138,"style":138},"# Find images not referenced in your code\ngrep -r \"\\.png\\|\\.jpg\\|\\.gif\" .\u002FModules\u002F > used_images.txt\n# Compare against actual images in your assets folder\n# Delete unused images\n",[136,1001,1002,1007,1026,1031],{"__ignoreMap":138},[173,1003,1004],{"class":175,"line":176},[173,1005,1006],{"class":179},"# Find images not referenced in your code\n",[173,1008,1009,1012,1015,1018,1021,1023],{"class":175,"line":183},[173,1010,1011],{"class":235},"grep",[173,1013,1014],{"class":334}," -r",[173,1016,1017],{"class":243}," \"\\.png\\|\\.jpg\\|\\.gif\"",[173,1019,1020],{"class":243}," .\u002FModules\u002F",[173,1022,584],{"class":208},[173,1024,1025],{"class":243}," used_images.txt\n",[173,1027,1028],{"class":175,"line":189},[173,1029,1030],{"class":179},"# Compare against actual images in your assets folder\n",[173,1032,1033],{"class":175,"line":196},[173,1034,1035],{"class":179},"# Delete unused images\n",[15,1037,1038],{},[109,1039,411],{},[30,1041,1042,1045,1048],{},[33,1043,1044],{},"Add file size checks to your CI pipeline",[33,1046,1047],{},"Use image optimization in your build process",[33,1049,1050],{},"Regularly audit and remove unused assets",[89,1052],{},[25,1054,45],{"id":1055},"theme-compilation-issues",[102,1057,1059],{"id":1058},"error-4-sass-compilation-error-undefined-variable","Error #4: \"SASS Compilation Error: Undefined Variable\"",[15,1061,1062],{},[109,1063,111],{},[30,1065,1066,1072,1075],{},[33,1067,1068,1071],{},[136,1069,1070],{},"gulp sass"," fails with variable not found error",[33,1073,1074],{},"Theme looks broken with missing styles",[33,1076,1077,1078],{},"Error points to line in ",[136,1079,1080],{},"_custom-theme.scss",[15,1082,1083],{},[109,1084,127],{},[129,1086,1089],{"className":1087,"code":1088,"language":134},[132],"Error: Undefined variable \"$primary-color\".\n       on line 47 of Modules\u002FTheme\u002Fsass\u002F_custom-theme.scss\n",[136,1090,1088],{"__ignoreMap":138},[15,1092,1093,1095],{},[109,1094,143],{},"\nSASS variable import order is wrong, or a required variables file is missing from the compilation path.",[15,1097,1098],{},[109,1099,161],{},[15,1101,1102],{},"Step 1: Check variable definition location",[129,1104,1108],{"className":1105,"code":1106,"language":1107,"meta":138,"style":138},"language-scss shiki shiki-themes github-light github-dark","\u002F\u002F Variables should be in _variables.scss or similar\n\u002F\u002F Usually at: Modules\u002F[Theme]\u002FSass\u002F_variables.scss\n\n$primary-color: #3498db !default;\n$secondary-color: #2c3e50 !default;\n","scss",[136,1109,1110,1115,1120,1124,1140],{"__ignoreMap":138},[173,1111,1112],{"class":175,"line":176},[173,1113,1114],{"class":179},"\u002F\u002F Variables should be in _variables.scss or similar\n",[173,1116,1117],{"class":175,"line":183},[173,1118,1119],{"class":179},"\u002F\u002F Usually at: Modules\u002F[Theme]\u002FSass\u002F_variables.scss\n",[173,1121,1122],{"class":175,"line":189},[173,1123,193],{"emptyLinePlaceholder":192},[173,1125,1126,1129,1131,1134,1137],{"class":175,"line":196},[173,1127,1128],{"class":262},"$primary-color",[173,1130,512],{"class":239},[173,1132,1133],{"class":334},"#3498db",[173,1135,1136],{"class":208}," !default",[173,1138,1139],{"class":239},";\n",[173,1141,1142,1145,1147,1150,1152],{"class":175,"line":202},[173,1143,1144],{"class":262},"$secondary-color",[173,1146,512],{"class":239},[173,1148,1149],{"class":334},"#2c3e50",[173,1151,1136],{"class":208},[173,1153,1139],{"class":239},[15,1155,1156],{},"Step 2: Verify import order in entry file",[129,1158,1160],{"className":1105,"code":1159,"language":1107,"meta":138,"style":138},"\u002F\u002F Modules\u002F[Theme]\u002FSass\u002F[entry-point].scss\n\n\u002F\u002F Variables MUST come first\n@import 'variables';        \u002F\u002F Define variables\n@import 'mixins';           \u002F\u002F Mixins can use variables\n@import 'base';             \u002F\u002F Base styles\n@import 'components';       \u002F\u002F Components\n@import 'custom-theme';     \u002F\u002F Custom overrides LAST\n",[136,1161,1162,1167,1171,1176,1190,1203,1216,1229],{"__ignoreMap":138},[173,1163,1164],{"class":175,"line":176},[173,1165,1166],{"class":179},"\u002F\u002F Modules\u002F[Theme]\u002FSass\u002F[entry-point].scss\n",[173,1168,1169],{"class":175,"line":183},[173,1170,193],{"emptyLinePlaceholder":192},[173,1172,1173],{"class":175,"line":189},[173,1174,1175],{"class":179},"\u002F\u002F Variables MUST come first\n",[173,1177,1178,1181,1184,1187],{"class":175,"line":196},[173,1179,1180],{"class":208},"@import",[173,1182,1183],{"class":243}," 'variables'",[173,1185,1186],{"class":239},";        ",[173,1188,1189],{"class":179},"\u002F\u002F Define variables\n",[173,1191,1192,1194,1197,1200],{"class":175,"line":202},[173,1193,1180],{"class":208},[173,1195,1196],{"class":243}," 'mixins'",[173,1198,1199],{"class":239},";           ",[173,1201,1202],{"class":179},"\u002F\u002F Mixins can use variables\n",[173,1204,1205,1207,1210,1213],{"class":175,"line":215},[173,1206,1180],{"class":208},[173,1208,1209],{"class":243}," 'base'",[173,1211,1212],{"class":239},";             ",[173,1214,1215],{"class":179},"\u002F\u002F Base styles\n",[173,1217,1218,1220,1223,1226],{"class":175,"line":226},[173,1219,1180],{"class":208},[173,1221,1222],{"class":243}," 'components'",[173,1224,1225],{"class":239},";       ",[173,1227,1228],{"class":179},"\u002F\u002F Components\n",[173,1230,1231,1233,1236,1239],{"class":175,"line":232},[173,1232,1180],{"class":208},[173,1234,1235],{"class":243}," 'custom-theme'",[173,1237,1238],{"class":239},";     ",[173,1240,1241],{"class":179},"\u002F\u002F Custom overrides LAST\n",[15,1243,1244],{},"Step 3: Check for circular imports",[129,1246,1248],{"className":1105,"code":1247,"language":1107,"meta":138,"style":138},"\u002F\u002F WRONG: _components.scss importing _variables.scss\n\u002F\u002F when _variables.scss imports _components.scss\n\n\u002F\u002F Use @use and @forward in newer SASS versions\n@use 'variables' as vars;\n\n.button {\n  background: vars.$primary-color;\n}\n",[136,1249,1250,1255,1260,1264,1269,1284,1288,1295,1311],{"__ignoreMap":138},[173,1251,1252],{"class":175,"line":176},[173,1253,1254],{"class":179},"\u002F\u002F WRONG: _components.scss importing _variables.scss\n",[173,1256,1257],{"class":175,"line":183},[173,1258,1259],{"class":179},"\u002F\u002F when _variables.scss imports _components.scss\n",[173,1261,1262],{"class":175,"line":189},[173,1263,193],{"emptyLinePlaceholder":192},[173,1265,1266],{"class":175,"line":196},[173,1267,1268],{"class":179},"\u002F\u002F Use @use and @forward in newer SASS versions\n",[173,1270,1271,1274,1276,1279,1282],{"class":175,"line":202},[173,1272,1273],{"class":208},"@use",[173,1275,1183],{"class":243},[173,1277,1278],{"class":208}," as",[173,1280,1281],{"class":262}," vars",[173,1283,1139],{"class":239},[173,1285,1286],{"class":175,"line":215},[173,1287,193],{"emptyLinePlaceholder":192},[173,1289,1290,1293],{"class":175,"line":226},[173,1291,1292],{"class":235},".button",[173,1294,946],{"class":239},[173,1296,1297,1300,1302,1305,1307,1309],{"class":175,"line":232},[173,1298,1299],{"class":334},"  background",[173,1301,512],{"class":239},[173,1303,1304],{"class":262},"vars",[173,1306,937],{"class":239},[173,1308,1128],{"class":262},[173,1310,1139],{"class":239},[173,1312,1313],{"class":175,"line":274},[173,1314,554],{"class":239},[15,1316,1317],{},"Step 4: Verify manifest.json sass entry points",[129,1319,1323],{"className":1320,"code":1321,"language":1322,"meta":138,"style":138},"language-json shiki shiki-themes github-light github-dark","{\n  \"sass\": {\n    \"entry_points\": {\n      \"application\": \"Modules\u002FTheme\u002FSass\u002Fapplication.scss\"\n    },\n    \"files\": [\n      \"Modules\u002FTheme\u002FSass\u002F**\u002F*.scss\"\n    ]\n  }\n}\n","json",[136,1324,1325,1329,1336,1343,1353,1358,1366,1371,1376,1380],{"__ignoreMap":138},[173,1326,1327],{"class":175,"line":176},[173,1328,496],{"class":239},[173,1330,1331,1334],{"class":175,"line":183},[173,1332,1333],{"class":334},"  \"sass\"",[173,1335,504],{"class":239},[173,1337,1338,1341],{"class":175,"line":189},[173,1339,1340],{"class":334},"    \"entry_points\"",[173,1342,504],{"class":239},[173,1344,1345,1348,1350],{"class":175,"line":196},[173,1346,1347],{"class":334},"      \"application\"",[173,1349,512],{"class":239},[173,1351,1352],{"class":243},"\"Modules\u002FTheme\u002FSass\u002Fapplication.scss\"\n",[173,1354,1355],{"class":175,"line":202},[173,1356,1357],{"class":239},"    },\n",[173,1359,1360,1363],{"class":175,"line":215},[173,1361,1362],{"class":334},"    \"files\"",[173,1364,1365],{"class":239},": [\n",[173,1367,1368],{"class":175,"line":226},[173,1369,1370],{"class":243},"      \"Modules\u002FTheme\u002FSass\u002F**\u002F*.scss\"\n",[173,1372,1373],{"class":175,"line":232},[173,1374,1375],{"class":239},"    ]\n",[173,1377,1378],{"class":175,"line":274},[173,1379,549],{"class":239},[173,1381,1382],{"class":175,"line":280},[173,1383,554],{"class":239},[15,1385,1386],{},[109,1387,411],{},[30,1389,1390,1393,1399],{},[33,1391,1392],{},"Establish a clear SASS architecture (7-1 pattern or similar)",[33,1394,422,1395,1398],{},[136,1396,1397],{},"!default"," flags on all variable definitions",[33,1400,1401],{},"Document the import order in your style guide",[89,1403],{},[102,1405,1407],{"id":1406},"error-5-javascript-compilation-error-unexpected-token","Error #5: \"JavaScript Compilation Error: Unexpected Token\"",[15,1409,1410],{},[109,1411,111],{},[30,1413,1414,1417,1420],{},[33,1415,1416],{},"Gulp compile fails with syntax error",[33,1418,1419],{},"Error message points to node_modules or vendor code",[33,1421,1422],{},"Works on one developer's machine, fails on another",[15,1424,1425],{},[109,1426,127],{},[129,1428,1431],{"className":1429,"code":1430,"language":134},[132],"SyntaxError: Unexpected token '...'\nat Module._compile (internal\u002Fmodules\u002Fcjs\u002Floader.js:895:18)\nFile: node_modules\u002Fsome-package\u002Fdist\u002Findex.js\n",[136,1432,1430],{"__ignoreMap":138},[15,1434,1435,1437],{},[109,1436,143],{},"\nNode.js version mismatch. Modern JavaScript syntax (spread operators, optional chaining) isn't recognized by older Node versions that some developers or CI pipelines still use.",[15,1439,1440],{},[109,1441,161],{},[15,1443,1444],{},"Step 1: Check Node.js version",[129,1446,1448],{"className":298,"code":1447,"language":300,"meta":138,"style":138},"node -v\n# SuiteCommerce 2024.x requires Node 18.x or 20.x\n# SuiteCommerce 2022.x may work with Node 14.x\n",[136,1449,1450,1458,1463],{"__ignoreMap":138},[173,1451,1452,1455],{"class":175,"line":176},[173,1453,1454],{"class":235},"node",[173,1456,1457],{"class":334}," -v\n",[173,1459,1460],{"class":175,"line":183},[173,1461,1462],{"class":179},"# SuiteCommerce 2024.x requires Node 18.x or 20.x\n",[173,1464,1465],{"class":175,"line":189},[173,1466,1467],{"class":179},"# SuiteCommerce 2022.x may work with Node 14.x\n",[15,1469,1470],{},"Step 2: Lock Node.js version",[129,1472,1474],{"className":298,"code":1473,"language":300,"meta":138,"style":138},"# Create .nvmrc in project root\necho \"18.19.0\" > .nvmrc\n\n# Team members run:\nnvm use\n\n# Or use volta for automatic version switching\n",[136,1475,1476,1481,1494,1498,1503,1511,1515],{"__ignoreMap":138},[173,1477,1478],{"class":175,"line":176},[173,1479,1480],{"class":179},"# Create .nvmrc in project root\n",[173,1482,1483,1486,1489,1491],{"class":175,"line":183},[173,1484,1485],{"class":334},"echo",[173,1487,1488],{"class":243}," \"18.19.0\"",[173,1490,584],{"class":208},[173,1492,1493],{"class":243}," .nvmrc\n",[173,1495,1496],{"class":175,"line":189},[173,1497,193],{"emptyLinePlaceholder":192},[173,1499,1500],{"class":175,"line":196},[173,1501,1502],{"class":179},"# Team members run:\n",[173,1504,1505,1508],{"class":175,"line":202},[173,1506,1507],{"class":235},"nvm",[173,1509,1510],{"class":243}," use\n",[173,1512,1513],{"class":175,"line":215},[173,1514,193],{"emptyLinePlaceholder":192},[173,1516,1517],{"class":175,"line":226},[173,1518,1519],{"class":179},"# Or use volta for automatic version switching\n",[15,1521,1522],{},"Step 3: Update Babel configuration (if using)",[129,1524,1526],{"className":167,"code":1525,"language":169,"meta":138,"style":138},"\u002F\u002F babel.config.js\nmodule.exports = {\n  presets: [\n    ['@babel\u002Fpreset-env', {\n      targets: {\n        node: '18'  \u002F\u002F Match your Node version\n      }\n    }]\n  ]\n};\n",[136,1527,1528,1533,1545,1550,1561,1566,1577,1582,1587,1592],{"__ignoreMap":138},[173,1529,1530],{"class":175,"line":176},[173,1531,1532],{"class":179},"\u002F\u002F babel.config.js\n",[173,1534,1535,1537,1539,1541,1543],{"class":175,"line":183},[173,1536,934],{"class":334},[173,1538,937],{"class":239},[173,1540,940],{"class":334},[173,1542,943],{"class":208},[173,1544,946],{"class":239},[173,1546,1547],{"class":175,"line":189},[173,1548,1549],{"class":239},"  presets: [\n",[173,1551,1552,1555,1558],{"class":175,"line":196},[173,1553,1554],{"class":239},"    [",[173,1556,1557],{"class":243},"'@babel\u002Fpreset-env'",[173,1559,1560],{"class":239},", {\n",[173,1562,1563],{"class":175,"line":202},[173,1564,1565],{"class":239},"      targets: {\n",[173,1567,1568,1571,1574],{"class":175,"line":215},[173,1569,1570],{"class":239},"        node: ",[173,1572,1573],{"class":243},"'18'",[173,1575,1576],{"class":179},"  \u002F\u002F Match your Node version\n",[173,1578,1579],{"class":175,"line":226},[173,1580,1581],{"class":239},"      }\n",[173,1583,1584],{"class":175,"line":232},[173,1585,1586],{"class":239},"    }]\n",[173,1588,1589],{"class":175,"line":274},[173,1590,1591],{"class":239},"  ]\n",[173,1593,1594],{"class":175,"line":280},[173,1595,993],{"class":239},[15,1597,1598],{},"Step 4: Transpile problematic dependencies",[129,1600,1602],{"className":167,"code":1601,"language":169,"meta":138,"style":138},"\u002F\u002F webpack.config.js\nmodule.exports = {\n  module: {\n    rules: [\n      {\n        test: \u002F\\.js$\u002F,\n        \u002F\u002F Include node_modules that need transpiling\n        exclude: \u002Fnode_modules\\\u002F(?!(problem-package)\\\u002F).*\u002F,\n        use: {\n          loader: 'babel-loader'\n        }\n      }\n    ]\n  }\n};\n",[136,1603,1604,1609,1621,1626,1631,1636,1660,1665,1695,1700,1708,1714,1719,1724,1729],{"__ignoreMap":138},[173,1605,1606],{"class":175,"line":176},[173,1607,1608],{"class":179},"\u002F\u002F webpack.config.js\n",[173,1610,1611,1613,1615,1617,1619],{"class":175,"line":183},[173,1612,934],{"class":334},[173,1614,937],{"class":239},[173,1616,940],{"class":334},[173,1618,943],{"class":208},[173,1620,946],{"class":239},[173,1622,1623],{"class":175,"line":189},[173,1624,1625],{"class":239},"  module: {\n",[173,1627,1628],{"class":175,"line":196},[173,1629,1630],{"class":239},"    rules: [\n",[173,1632,1633],{"class":175,"line":202},[173,1634,1635],{"class":239},"      {\n",[173,1637,1638,1641,1644,1648,1652,1655,1658],{"class":175,"line":215},[173,1639,1640],{"class":239},"        test:",[173,1642,1643],{"class":243}," \u002F",[173,1645,1647],{"class":1646},"snhLl","\\.",[173,1649,1651],{"class":1650},"sA_wV","js",[173,1653,1654],{"class":208},"$",[173,1656,1657],{"class":243},"\u002F",[173,1659,518],{"class":239},[173,1661,1662],{"class":175,"line":226},[173,1663,1664],{"class":179},"        \u002F\u002F Include node_modules that need transpiling\n",[173,1666,1667,1670,1672,1675,1678,1681,1683,1686,1688,1691,1693],{"class":175,"line":232},[173,1668,1669],{"class":239},"        exclude: ",[173,1671,1657],{"class":243},[173,1673,1674],{"class":1650},"node_modules",[173,1676,1677],{"class":1646},"\\\u002F",[173,1679,1680],{"class":1650},"(?!(problem-package)",[173,1682,1677],{"class":1646},[173,1684,1685],{"class":1650},")",[173,1687,937],{"class":334},[173,1689,1690],{"class":208},"*",[173,1692,1657],{"class":243},[173,1694,518],{"class":239},[173,1696,1697],{"class":175,"line":274},[173,1698,1699],{"class":239},"        use: {\n",[173,1701,1702,1705],{"class":175,"line":280},[173,1703,1704],{"class":239},"          loader: ",[173,1706,1707],{"class":243},"'babel-loader'\n",[173,1709,1711],{"class":175,"line":1710},11,[173,1712,1713],{"class":239},"        }\n",[173,1715,1717],{"class":175,"line":1716},12,[173,1718,1581],{"class":239},[173,1720,1722],{"class":175,"line":1721},13,[173,1723,1375],{"class":239},[173,1725,1727],{"class":175,"line":1726},14,[173,1728,549],{"class":239},[173,1730,1732],{"class":175,"line":1731},15,[173,1733,993],{"class":239},[15,1735,1736],{},[109,1737,411],{},[30,1739,1740,1743,1749],{},[33,1741,1742],{},"Require consistent Node.js version across team",[33,1744,422,1745,1748],{},[136,1746,1747],{},"engines"," field in package.json",[33,1750,1751],{},"CI pipeline should use same Node version as development",[89,1753],{},[102,1755,1757],{"id":1756},"error-6-template-compilation-error-unknown-helper","Error #6: \"Template Compilation Error: Unknown Helper\"",[15,1759,1760],{},[109,1761,111],{},[30,1763,1764,1767,1770],{},[33,1765,1766],{},"Handlebars template fails to compile",[33,1768,1769],{},"Error mentions undefined helper function",[33,1771,1772],{},"Template worked before a SuiteCommerce upgrade",[15,1774,1775],{},[109,1776,127],{},[129,1778,1781],{"className":1779,"code":1780,"language":134},[132],"Error: Missing helper: \"formatCurrency\"\nTemplate: product_details.tpl at line 34\n",[136,1782,1780],{"__ignoreMap":138},[15,1784,1785,1787],{},[109,1786,143],{},"\nCustom Handlebars helpers weren't registered, or a SuiteCommerce upgrade changed the available helpers.",[15,1789,1790],{},[109,1791,161],{},[15,1793,1794],{},"Step 1: Verify helper registration",[129,1796,1798],{"className":167,"code":1797,"language":169,"meta":138,"style":138},"\u002F\u002F Helpers must be registered before templates compile\n\u002F\u002F Usually in: Modules\u002F[Module]\u002FJavaScript\u002F[Module].js\n\ndefine([\n  'Handlebars'\n], function(Handlebars) {\n  'use strict';\n  \n  \u002F\u002F Register custom helper\n  Handlebars.registerHelper('formatCurrency', function(value, options) {\n    const currency = options.hash.currency || 'USD';\n    return new Handlebars.SafeString(\n      new Intl.NumberFormat('en-US', {\n        style: 'currency',\n        currency: currency\n      }).format(value)\n    );\n  });\n});\n",[136,1799,1800,1805,1810,1814,1821,1826,1839,1846,1851,1856,1885,1906,1922,1940,1950,1955,1967,1973,1979],{"__ignoreMap":138},[173,1801,1802],{"class":175,"line":176},[173,1803,1804],{"class":179},"\u002F\u002F Helpers must be registered before templates compile\n",[173,1806,1807],{"class":175,"line":183},[173,1808,1809],{"class":179},"\u002F\u002F Usually in: Modules\u002F[Module]\u002FJavaScript\u002F[Module].js\n",[173,1811,1812],{"class":175,"line":189},[173,1813,193],{"emptyLinePlaceholder":192},[173,1815,1816,1818],{"class":175,"line":196},[173,1817,236],{"class":235},[173,1819,1820],{"class":239},"([\n",[173,1822,1823],{"class":175,"line":202},[173,1824,1825],{"class":243},"  'Handlebars'\n",[173,1827,1828,1830,1832,1834,1837],{"class":175,"line":215},[173,1829,253],{"class":239},[173,1831,256],{"class":208},[173,1833,259],{"class":239},[173,1835,1836],{"class":262},"Handlebars",[173,1838,271],{"class":239},[173,1840,1841,1844],{"class":175,"line":226},[173,1842,1843],{"class":243},"  'use strict'",[173,1845,1139],{"class":239},[173,1847,1848],{"class":175,"line":232},[173,1849,1850],{"class":239},"  \n",[173,1852,1853],{"class":175,"line":274},[173,1854,1855],{"class":179},"  \u002F\u002F Register custom helper\n",[173,1857,1858,1861,1864,1866,1869,1871,1873,1875,1878,1880,1883],{"class":175,"line":280},[173,1859,1860],{"class":239},"  Handlebars.",[173,1862,1863],{"class":235},"registerHelper",[173,1865,259],{"class":239},[173,1867,1868],{"class":243},"'formatCurrency'",[173,1870,247],{"class":239},[173,1872,256],{"class":208},[173,1874,259],{"class":239},[173,1876,1877],{"class":262},"value",[173,1879,247],{"class":239},[173,1881,1882],{"class":262},"options",[173,1884,271],{"class":239},[173,1886,1887,1890,1893,1895,1898,1901,1904],{"class":175,"line":1710},[173,1888,1889],{"class":208},"    const",[173,1891,1892],{"class":334}," currency",[173,1894,943],{"class":208},[173,1896,1897],{"class":239}," options.hash.currency ",[173,1899,1900],{"class":208},"||",[173,1902,1903],{"class":243}," 'USD'",[173,1905,1139],{"class":239},[173,1907,1908,1911,1913,1916,1919],{"class":175,"line":1716},[173,1909,1910],{"class":208},"    return",[173,1912,608],{"class":208},[173,1914,1915],{"class":239}," Handlebars.",[173,1917,1918],{"class":235},"SafeString",[173,1920,1921],{"class":239},"(\n",[173,1923,1924,1927,1930,1933,1935,1938],{"class":175,"line":1721},[173,1925,1926],{"class":208},"      new",[173,1928,1929],{"class":239}," Intl.",[173,1931,1932],{"class":235},"NumberFormat",[173,1934,259],{"class":239},[173,1936,1937],{"class":243},"'en-US'",[173,1939,1560],{"class":239},[173,1941,1942,1945,1948],{"class":175,"line":1726},[173,1943,1944],{"class":239},"        style: ",[173,1946,1947],{"class":243},"'currency'",[173,1949,518],{"class":239},[173,1951,1952],{"class":175,"line":1731},[173,1953,1954],{"class":239},"        currency: currency\n",[173,1956,1958,1961,1964],{"class":175,"line":1957},16,[173,1959,1960],{"class":239},"      }).",[173,1962,1963],{"class":235},"format",[173,1965,1966],{"class":239},"(value)\n",[173,1968,1970],{"class":175,"line":1969},17,[173,1971,1972],{"class":239},"    );\n",[173,1974,1976],{"class":175,"line":1975},18,[173,1977,1978],{"class":239},"  });\n",[173,1980,1982],{"class":175,"line":1981},19,[173,1983,283],{"class":239},[15,1985,1986],{},"Step 2: Check module load order",[129,1988,1990],{"className":1320,"code":1989,"language":1322,"meta":138,"style":138},"\u002F\u002F distro.json or module manifest\n{\n  \"modules\": {\n    \"CustomHelpers\": {\n      \"path\": \"Modules\u002FCustomHelpers\",\n      \"loadPriority\": 1  \u002F\u002F Load early, before templates that use it\n    }\n  }\n}\n",[136,1991,1992,1997,2001,2008,2015,2027,2040,2044,2048],{"__ignoreMap":138},[173,1993,1994],{"class":175,"line":176},[173,1995,1996],{"class":179},"\u002F\u002F distro.json or module manifest\n",[173,1998,1999],{"class":175,"line":183},[173,2000,496],{"class":239},[173,2002,2003,2006],{"class":175,"line":189},[173,2004,2005],{"class":334},"  \"modules\"",[173,2007,504],{"class":239},[173,2009,2010,2013],{"class":175,"line":196},[173,2011,2012],{"class":334},"    \"CustomHelpers\"",[173,2014,504],{"class":239},[173,2016,2017,2020,2022,2025],{"class":175,"line":202},[173,2018,2019],{"class":334},"      \"path\"",[173,2021,512],{"class":239},[173,2023,2024],{"class":243},"\"Modules\u002FCustomHelpers\"",[173,2026,518],{"class":239},[173,2028,2029,2032,2034,2037],{"class":175,"line":215},[173,2030,2031],{"class":334},"      \"loadPriority\"",[173,2033,512],{"class":239},[173,2035,2036],{"class":334},"1",[173,2038,2039],{"class":179},"  \u002F\u002F Load early, before templates that use it\n",[173,2041,2042],{"class":175,"line":226},[173,2043,984],{"class":239},[173,2045,2046],{"class":175,"line":232},[173,2047,549],{"class":239},[173,2049,2050],{"class":175,"line":274},[173,2051,554],{"class":239},[15,2053,2054],{},"Step 3: Use built-in helpers when available",[129,2056,2060],{"className":2057,"code":2058,"language":2059,"meta":138,"style":138},"language-handlebars shiki shiki-themes github-light github-dark","{{!-- SuiteCommerce built-in helpers --}}\n\n{{!-- Currency formatting --}}\n{{currency price format='$0,0.00'}}\n\n{{!-- Date formatting --}}\n{{date orderDate format='MMM DD, YYYY'}}\n\n{{!-- Translation --}}\n{{translate 'Add to Cart'}}\n\n{{!-- Conditional --}}\n{{#if inStock}}\n  \u003Cspan class=\"in-stock\">{{translate 'In Stock'}}\u003C\u002Fspan>\n{{\u002Fif}}\n","handlebars",[136,2061,2062,2067,2071,2076,2081,2085,2090,2095,2099,2104,2109,2113,2118,2123,2128],{"__ignoreMap":138},[173,2063,2064],{"class":175,"line":176},[173,2065,2066],{},"{{!-- SuiteCommerce built-in helpers --}}\n",[173,2068,2069],{"class":175,"line":183},[173,2070,193],{"emptyLinePlaceholder":192},[173,2072,2073],{"class":175,"line":189},[173,2074,2075],{},"{{!-- Currency formatting --}}\n",[173,2077,2078],{"class":175,"line":196},[173,2079,2080],{},"{{currency price format='$0,0.00'}}\n",[173,2082,2083],{"class":175,"line":202},[173,2084,193],{"emptyLinePlaceholder":192},[173,2086,2087],{"class":175,"line":215},[173,2088,2089],{},"{{!-- Date formatting --}}\n",[173,2091,2092],{"class":175,"line":226},[173,2093,2094],{},"{{date orderDate format='MMM DD, YYYY'}}\n",[173,2096,2097],{"class":175,"line":232},[173,2098,193],{"emptyLinePlaceholder":192},[173,2100,2101],{"class":175,"line":274},[173,2102,2103],{},"{{!-- Translation --}}\n",[173,2105,2106],{"class":175,"line":280},[173,2107,2108],{},"{{translate 'Add to Cart'}}\n",[173,2110,2111],{"class":175,"line":1710},[173,2112,193],{"emptyLinePlaceholder":192},[173,2114,2115],{"class":175,"line":1716},[173,2116,2117],{},"{{!-- Conditional --}}\n",[173,2119,2120],{"class":175,"line":1721},[173,2121,2122],{},"{{#if inStock}}\n",[173,2124,2125],{"class":175,"line":1726},[173,2126,2127],{},"  \u003Cspan class=\"in-stock\">{{translate 'In Stock'}}\u003C\u002Fspan>\n",[173,2129,2130],{"class":175,"line":1731},[173,2131,2132],{},"{{\u002Fif}}\n",[15,2134,2135],{},"Step 4: List available helpers for debugging",[129,2137,2139],{"className":167,"code":2138,"language":169,"meta":138,"style":138},"\u002F\u002F Debug: List all registered helpers\nconsole.log('Registered Handlebars helpers:');\nObject.keys(Handlebars.helpers).forEach(function(helper) {\n  console.log('  - ' + helper);\n});\n",[136,2140,2141,2146,2162,2187,2205],{"__ignoreMap":138},[173,2142,2143],{"class":175,"line":176},[173,2144,2145],{"class":179},"\u002F\u002F Debug: List all registered helpers\n",[173,2147,2148,2151,2154,2156,2159],{"class":175,"line":183},[173,2149,2150],{"class":239},"console.",[173,2152,2153],{"class":235},"log",[173,2155,259],{"class":239},[173,2157,2158],{"class":243},"'Registered Handlebars helpers:'",[173,2160,2161],{"class":239},");\n",[173,2163,2164,2167,2170,2173,2176,2178,2180,2182,2185],{"class":175,"line":189},[173,2165,2166],{"class":239},"Object.",[173,2168,2169],{"class":235},"keys",[173,2171,2172],{"class":239},"(Handlebars.helpers).",[173,2174,2175],{"class":235},"forEach",[173,2177,259],{"class":239},[173,2179,256],{"class":208},[173,2181,259],{"class":239},[173,2183,2184],{"class":262},"helper",[173,2186,271],{"class":239},[173,2188,2189,2192,2194,2196,2199,2202],{"class":175,"line":196},[173,2190,2191],{"class":239},"  console.",[173,2193,2153],{"class":235},[173,2195,259],{"class":239},[173,2197,2198],{"class":243},"'  - '",[173,2200,2201],{"class":208}," +",[173,2203,2204],{"class":239}," helper);\n",[173,2206,2207],{"class":175,"line":202},[173,2208,283],{"class":239},[15,2210,2211],{},[109,2212,411],{},[30,2214,2215,2218,2221],{},[33,2216,2217],{},"Document all custom helpers",[33,2219,2220],{},"Review SuiteCommerce release notes for helper changes",[33,2222,2223],{},"Create unit tests for custom helpers",[89,2225],{},[25,2227,51],{"id":2228},"extension-conflicts",[102,2230,2232],{"id":2231},"error-7-module-not-found-cannot-resolve-dependency","Error #7: \"Module Not Found: Cannot Resolve Dependency\"",[15,2234,2235],{},[109,2236,111],{},[30,2238,2239,2242,2245],{},[33,2240,2241],{},"Site loads but specific feature doesn't work",[33,2243,2244],{},"Console shows module resolution error",[33,2246,2247],{},"Extension worked before installing another extension",[15,2249,2250],{},[109,2251,127],{},[129,2253,2256],{"className":2254,"code":2255,"language":134},[132],"Error: Module 'CustomExtension.Model' not found\nCannot resolve dependency at runtime\nRequireJS: Script error for: CustomExtension.Model\n",[136,2257,2255],{"__ignoreMap":138},[15,2259,2260,2262],{},[109,2261,143],{},"\nModule naming collision between extensions, or dependency not properly declared in manifest.",[15,2264,2265],{},[109,2266,161],{},[15,2268,2269],{},"Step 1: Check for naming collisions",[129,2271,2273],{"className":298,"code":2272,"language":300,"meta":138,"style":138},"# Search for duplicate module definitions\ngrep -r \"define('CustomExtension.Model'\" .\u002FModules\u002F\n# Should return only ONE result\n",[136,2274,2275,2280,2292],{"__ignoreMap":138},[173,2276,2277],{"class":175,"line":176},[173,2278,2279],{"class":179},"# Search for duplicate module definitions\n",[173,2281,2282,2284,2286,2289],{"class":175,"line":183},[173,2283,1011],{"class":235},[173,2285,1014],{"class":334},[173,2287,2288],{"class":243}," \"define('CustomExtension.Model'\"",[173,2290,2291],{"class":243}," .\u002FModules\u002F\n",[173,2293,2294],{"class":175,"line":189},[173,2295,2296],{"class":179},"# Should return only ONE result\n",[15,2298,2299],{},"Step 2: Use unique namespace prefixes",[129,2301,2303],{"className":167,"code":2302,"language":169,"meta":138,"style":138},"\u002F\u002F WRONG: Generic naming\ndefine('ProductConfigurator.View', ...);\n\n\u002F\u002F RIGHT: Vendor-prefixed naming\ndefine('Stenbase.ProductConfigurator.View', ...);\n",[136,2304,2305,2310,2326,2330,2335],{"__ignoreMap":138},[173,2306,2307],{"class":175,"line":176},[173,2308,2309],{"class":179},"\u002F\u002F WRONG: Generic naming\n",[173,2311,2312,2314,2316,2319,2321,2324],{"class":175,"line":183},[173,2313,236],{"class":235},[173,2315,259],{"class":239},[173,2317,2318],{"class":243},"'ProductConfigurator.View'",[173,2320,247],{"class":239},[173,2322,2323],{"class":208},"...",[173,2325,2161],{"class":239},[173,2327,2328],{"class":175,"line":189},[173,2329,193],{"emptyLinePlaceholder":192},[173,2331,2332],{"class":175,"line":196},[173,2333,2334],{"class":179},"\u002F\u002F RIGHT: Vendor-prefixed naming\n",[173,2336,2337,2339,2341,2344,2346,2348],{"class":175,"line":202},[173,2338,236],{"class":235},[173,2340,259],{"class":239},[173,2342,2343],{"class":243},"'Stenbase.ProductConfigurator.View'",[173,2345,247],{"class":239},[173,2347,2323],{"class":208},[173,2349,2161],{"class":239},[15,2351,2352],{},"Step 3: Verify manifest dependencies",[129,2354,2356],{"className":1320,"code":2355,"language":1322,"meta":138,"style":138},"\u002F\u002F Module manifest (ns.package.json)\n{\n  \"name\": \"Stenbase.ProductConfigurator\",\n  \"dependencies\": [\n    \"Product\",           \u002F\u002F Built-in module\n    \"Backbone\",          \u002F\u002F Library\n    \"Stenbase.Common\"    \u002F\u002F Your other module\n  ]\n}\n",[136,2357,2358,2363,2367,2379,2386,2397,2408,2416,2420],{"__ignoreMap":138},[173,2359,2360],{"class":175,"line":176},[173,2361,2362],{"class":179},"\u002F\u002F Module manifest (ns.package.json)\n",[173,2364,2365],{"class":175,"line":183},[173,2366,496],{"class":239},[173,2368,2369,2372,2374,2377],{"class":175,"line":189},[173,2370,2371],{"class":334},"  \"name\"",[173,2373,512],{"class":239},[173,2375,2376],{"class":243},"\"Stenbase.ProductConfigurator\"",[173,2378,518],{"class":239},[173,2380,2381,2384],{"class":175,"line":196},[173,2382,2383],{"class":334},"  \"dependencies\"",[173,2385,1365],{"class":239},[173,2387,2388,2391,2394],{"class":175,"line":202},[173,2389,2390],{"class":243},"    \"Product\"",[173,2392,2393],{"class":239},",           ",[173,2395,2396],{"class":179},"\u002F\u002F Built-in module\n",[173,2398,2399,2402,2405],{"class":175,"line":215},[173,2400,2401],{"class":243},"    \"Backbone\"",[173,2403,2404],{"class":239},",          ",[173,2406,2407],{"class":179},"\u002F\u002F Library\n",[173,2409,2410,2413],{"class":175,"line":226},[173,2411,2412],{"class":243},"    \"Stenbase.Common\"",[173,2414,2415],{"class":179},"    \u002F\u002F Your other module\n",[173,2417,2418],{"class":175,"line":232},[173,2419,1591],{"class":239},[173,2421,2422],{"class":175,"line":274},[173,2423,554],{"class":239},[15,2425,2426],{},"Step 4: Check load order in distro.json",[129,2428,2430],{"className":1320,"code":2429,"language":1322,"meta":138,"style":138},"{\n  \"modules\": {\n    \"Stenbase.Common\": {\n      \"path\": \"Modules\u002FStenbase.Common\"\n    },\n    \"Stenbase.ProductConfigurator\": {\n      \"path\": \"Modules\u002FStenbase.ProductConfigurator\",\n      \"requires\": [\"Stenbase.Common\"]  \u002F\u002F Explicit dependency\n    }\n  }\n}\n",[136,2431,2432,2436,2442,2448,2457,2461,2468,2479,2496,2500,2504],{"__ignoreMap":138},[173,2433,2434],{"class":175,"line":176},[173,2435,496],{"class":239},[173,2437,2438,2440],{"class":175,"line":183},[173,2439,2005],{"class":334},[173,2441,504],{"class":239},[173,2443,2444,2446],{"class":175,"line":189},[173,2445,2412],{"class":334},[173,2447,504],{"class":239},[173,2449,2450,2452,2454],{"class":175,"line":196},[173,2451,2019],{"class":334},[173,2453,512],{"class":239},[173,2455,2456],{"class":243},"\"Modules\u002FStenbase.Common\"\n",[173,2458,2459],{"class":175,"line":202},[173,2460,1357],{"class":239},[173,2462,2463,2466],{"class":175,"line":215},[173,2464,2465],{"class":334},"    \"Stenbase.ProductConfigurator\"",[173,2467,504],{"class":239},[173,2469,2470,2472,2474,2477],{"class":175,"line":226},[173,2471,2019],{"class":334},[173,2473,512],{"class":239},[173,2475,2476],{"class":243},"\"Modules\u002FStenbase.ProductConfigurator\"",[173,2478,518],{"class":239},[173,2480,2481,2484,2487,2490,2493],{"class":175,"line":232},[173,2482,2483],{"class":334},"      \"requires\"",[173,2485,2486],{"class":239},": [",[173,2488,2489],{"class":243},"\"Stenbase.Common\"",[173,2491,2492],{"class":239},"]  ",[173,2494,2495],{"class":179},"\u002F\u002F Explicit dependency\n",[173,2497,2498],{"class":175,"line":274},[173,2499,984],{"class":239},[173,2501,2502],{"class":175,"line":280},[173,2503,549],{"class":239},[173,2505,2506],{"class":175,"line":1710},[173,2507,554],{"class":239},[15,2509,2510],{},[109,2511,411],{},[30,2513,2514,2517,2520],{},[33,2515,2516],{},"Always use vendor prefixes in module names",[33,2518,2519],{},"Document inter-module dependencies",[33,2521,2522],{},"Test extensions in isolation before combining",[89,2524],{},[102,2526,2528],{"id":2527},"error-8-event-handler-conflict-multiple-handlers-registered","Error #8: \"Event Handler Conflict: Multiple Handlers Registered\"",[15,2530,2531],{},[109,2532,111],{},[30,2534,2535,2538,2541],{},[33,2536,2537],{},"Button click triggers action multiple times",[33,2539,2540],{},"Form submits duplicate data",[33,2542,2543],{},"Checkout processes multiple payments",[15,2545,2546,2548],{},[109,2547,127],{},"\nUsually no error—just duplicate behavior visible in network tab or console logs.",[15,2550,2551,2553],{},[109,2552,143],{},"\nMultiple extensions registering handlers for the same event without proper cleanup, or event handlers not being unbound when views are destroyed.",[15,2555,2556],{},[109,2557,161],{},[15,2559,2560],{},"Step 1: Identify duplicate handlers",[129,2562,2564],{"className":167,"code":2563,"language":169,"meta":138,"style":138},"\u002F\u002F Debug: Check event bindings\nvar $element = jQuery('[data-action=\"add-to-cart\"]');\nvar events = jQuery._data($element[0], 'events');\nconsole.log('Click handlers:', events.click.length);\n\u002F\u002F Should be 1, not 2+\n",[136,2565,2566,2571,2592,2620,2639],{"__ignoreMap":138},[173,2567,2568],{"class":175,"line":176},[173,2569,2570],{"class":179},"\u002F\u002F Debug: Check event bindings\n",[173,2572,2573,2576,2579,2582,2585,2587,2590],{"class":175,"line":183},[173,2574,2575],{"class":208},"var",[173,2577,2578],{"class":239}," $element ",[173,2580,2581],{"class":208},"=",[173,2583,2584],{"class":235}," jQuery",[173,2586,259],{"class":239},[173,2588,2589],{"class":243},"'[data-action=\"add-to-cart\"]'",[173,2591,2161],{"class":239},[173,2593,2594,2596,2599,2601,2604,2607,2610,2613,2615,2618],{"class":175,"line":189},[173,2595,2575],{"class":208},[173,2597,2598],{"class":239}," events ",[173,2600,2581],{"class":208},[173,2602,2603],{"class":239}," jQuery.",[173,2605,2606],{"class":235},"_data",[173,2608,2609],{"class":239},"($element[",[173,2611,2612],{"class":334},"0",[173,2614,253],{"class":239},[173,2616,2617],{"class":243},"'events'",[173,2619,2161],{"class":239},[173,2621,2622,2624,2626,2628,2631,2634,2637],{"class":175,"line":196},[173,2623,2150],{"class":239},[173,2625,2153],{"class":235},[173,2627,259],{"class":239},[173,2629,2630],{"class":243},"'Click handlers:'",[173,2632,2633],{"class":239},", events.click.",[173,2635,2636],{"class":334},"length",[173,2638,2161],{"class":239},[173,2640,2641],{"class":175,"line":202},[173,2642,2643],{"class":179},"\u002F\u002F Should be 1, not 2+\n",[15,2645,2646],{},"Step 2: Use namespaced events",[129,2648,2650],{"className":167,"code":2649,"language":169,"meta":138,"style":138},"\u002F\u002F Extension A\nthis.$el.on('click.extensionA', '[data-action=\"submit\"]', this.handleSubmit);\n\n\u002F\u002F Extension B\nthis.$el.on('click.extensionB', '[data-action=\"submit\"]', this.handleOther);\n\n\u002F\u002F Clean up properly\nthis.$el.off('.extensionA');  \u002F\u002F Removes only Extension A handlers\n",[136,2651,2652,2657,2685,2689,2694,2718,2722,2727],{"__ignoreMap":138},[173,2653,2654],{"class":175,"line":176},[173,2655,2656],{"class":179},"\u002F\u002F Extension A\n",[173,2658,2659,2662,2665,2668,2670,2673,2675,2678,2680,2682],{"class":175,"line":183},[173,2660,2661],{"class":334},"this",[173,2663,2664],{"class":239},".$el.",[173,2666,2667],{"class":235},"on",[173,2669,259],{"class":239},[173,2671,2672],{"class":243},"'click.extensionA'",[173,2674,247],{"class":239},[173,2676,2677],{"class":243},"'[data-action=\"submit\"]'",[173,2679,247],{"class":239},[173,2681,2661],{"class":334},[173,2683,2684],{"class":239},".handleSubmit);\n",[173,2686,2687],{"class":175,"line":189},[173,2688,193],{"emptyLinePlaceholder":192},[173,2690,2691],{"class":175,"line":196},[173,2692,2693],{"class":179},"\u002F\u002F Extension B\n",[173,2695,2696,2698,2700,2702,2704,2707,2709,2711,2713,2715],{"class":175,"line":202},[173,2697,2661],{"class":334},[173,2699,2664],{"class":239},[173,2701,2667],{"class":235},[173,2703,259],{"class":239},[173,2705,2706],{"class":243},"'click.extensionB'",[173,2708,247],{"class":239},[173,2710,2677],{"class":243},[173,2712,247],{"class":239},[173,2714,2661],{"class":334},[173,2716,2717],{"class":239},".handleOther);\n",[173,2719,2720],{"class":175,"line":215},[173,2721,193],{"emptyLinePlaceholder":192},[173,2723,2724],{"class":175,"line":226},[173,2725,2726],{"class":179},"\u002F\u002F Clean up properly\n",[173,2728,2729,2731,2733,2736,2738,2741,2744],{"class":175,"line":232},[173,2730,2661],{"class":334},[173,2732,2664],{"class":239},[173,2734,2735],{"class":235},"off",[173,2737,259],{"class":239},[173,2739,2740],{"class":243},"'.extensionA'",[173,2742,2743],{"class":239},");  ",[173,2745,2746],{"class":179},"\u002F\u002F Removes only Extension A handlers\n",[15,2748,2749],{},"Step 3: Use one-time handlers where appropriate",[129,2751,2753],{"className":167,"code":2752,"language":169,"meta":138,"style":138},"\u002F\u002F For events that should only fire once\nthis.$el.one('click', '[data-action=\"place-order\"]', function() {\n  \u002F\u002F This handler automatically unbinds after first trigger\n  this.placeOrder();\n}.bind(this));\n",[136,2754,2755,2760,2785,2790,2803],{"__ignoreMap":138},[173,2756,2757],{"class":175,"line":176},[173,2758,2759],{"class":179},"\u002F\u002F For events that should only fire once\n",[173,2761,2762,2764,2766,2769,2771,2774,2776,2779,2781,2783],{"class":175,"line":183},[173,2763,2661],{"class":334},[173,2765,2664],{"class":239},[173,2767,2768],{"class":235},"one",[173,2770,259],{"class":239},[173,2772,2773],{"class":243},"'click'",[173,2775,247],{"class":239},[173,2777,2778],{"class":243},"'[data-action=\"place-order\"]'",[173,2780,247],{"class":239},[173,2782,256],{"class":208},[173,2784,812],{"class":239},[173,2786,2787],{"class":175,"line":189},[173,2788,2789],{"class":179},"  \u002F\u002F This handler automatically unbinds after first trigger\n",[173,2791,2792,2795,2797,2800],{"class":175,"line":196},[173,2793,2794],{"class":334},"  this",[173,2796,937],{"class":239},[173,2798,2799],{"class":235},"placeOrder",[173,2801,2802],{"class":239},"();\n",[173,2804,2805,2808,2811,2813,2815],{"class":175,"line":202},[173,2806,2807],{"class":239},"}.",[173,2809,2810],{"class":235},"bind",[173,2812,259],{"class":239},[173,2814,2661],{"class":334},[173,2816,2817],{"class":239},"));\n",[15,2819,2820],{},"Step 4: Implement proper view cleanup",[129,2822,2824],{"className":167,"code":2823,"language":169,"meta":138,"style":138},"var CustomView = Backbone.View.extend({\n  initialize: function() {\n    \u002F\u002F Store references for cleanup\n    this._boundHandler = this.handleEvent.bind(this);\n    GlobalEvents.on('cart:updated', this._boundHandler);\n  },\n  \n  destroy: function() {\n    \u002F\u002F Clean up global event bindings\n    GlobalEvents.off('cart:updated', this._boundHandler);\n    \n    \u002F\u002F Clean up DOM event bindings\n    this.$el.off();\n    \n    \u002F\u002F Call parent destroy\n    Backbone.View.prototype.destroy.apply(this, arguments);\n  }\n});\n",[136,2825,2826,2844,2855,2860,2884,2903,2908,2912,2923,2928,2944,2949,2954,2964,2968,2973,2998,3002],{"__ignoreMap":138},[173,2827,2828,2830,2833,2835,2838,2841],{"class":175,"line":176},[173,2829,2575],{"class":208},[173,2831,2832],{"class":239}," CustomView ",[173,2834,2581],{"class":208},[173,2836,2837],{"class":239}," Backbone.View.",[173,2839,2840],{"class":235},"extend",[173,2842,2843],{"class":239},"({\n",[173,2845,2846,2849,2851,2853],{"class":175,"line":183},[173,2847,2848],{"class":235},"  initialize",[173,2850,512],{"class":239},[173,2852,256],{"class":208},[173,2854,812],{"class":239},[173,2856,2857],{"class":175,"line":189},[173,2858,2859],{"class":179},"    \u002F\u002F Store references for cleanup\n",[173,2861,2862,2865,2868,2870,2873,2876,2878,2880,2882],{"class":175,"line":196},[173,2863,2864],{"class":334},"    this",[173,2866,2867],{"class":239},"._boundHandler ",[173,2869,2581],{"class":208},[173,2871,2872],{"class":334}," this",[173,2874,2875],{"class":239},".handleEvent.",[173,2877,2810],{"class":235},[173,2879,259],{"class":239},[173,2881,2661],{"class":334},[173,2883,2161],{"class":239},[173,2885,2886,2889,2891,2893,2896,2898,2900],{"class":175,"line":202},[173,2887,2888],{"class":239},"    GlobalEvents.",[173,2890,2667],{"class":235},[173,2892,259],{"class":239},[173,2894,2895],{"class":243},"'cart:updated'",[173,2897,247],{"class":239},[173,2899,2661],{"class":334},[173,2901,2902],{"class":239},"._boundHandler);\n",[173,2904,2905],{"class":175,"line":215},[173,2906,2907],{"class":239},"  },\n",[173,2909,2910],{"class":175,"line":226},[173,2911,1850],{"class":239},[173,2913,2914,2917,2919,2921],{"class":175,"line":232},[173,2915,2916],{"class":235},"  destroy",[173,2918,512],{"class":239},[173,2920,256],{"class":208},[173,2922,812],{"class":239},[173,2924,2925],{"class":175,"line":274},[173,2926,2927],{"class":179},"    \u002F\u002F Clean up global event bindings\n",[173,2929,2930,2932,2934,2936,2938,2940,2942],{"class":175,"line":280},[173,2931,2888],{"class":239},[173,2933,2735],{"class":235},[173,2935,259],{"class":239},[173,2937,2895],{"class":243},[173,2939,247],{"class":239},[173,2941,2661],{"class":334},[173,2943,2902],{"class":239},[173,2945,2946],{"class":175,"line":1710},[173,2947,2948],{"class":239},"    \n",[173,2950,2951],{"class":175,"line":1716},[173,2952,2953],{"class":179},"    \u002F\u002F Clean up DOM event bindings\n",[173,2955,2956,2958,2960,2962],{"class":175,"line":1721},[173,2957,2864],{"class":334},[173,2959,2664],{"class":239},[173,2961,2735],{"class":235},[173,2963,2802],{"class":239},[173,2965,2966],{"class":175,"line":1726},[173,2967,2948],{"class":239},[173,2969,2970],{"class":175,"line":1731},[173,2971,2972],{"class":179},"    \u002F\u002F Call parent destroy\n",[173,2974,2975,2978,2981,2984,2987,2989,2991,2993,2996],{"class":175,"line":1957},[173,2976,2977],{"class":239},"    Backbone.View.",[173,2979,2980],{"class":334},"prototype",[173,2982,2983],{"class":239},".destroy.",[173,2985,2986],{"class":235},"apply",[173,2988,259],{"class":239},[173,2990,2661],{"class":334},[173,2992,247],{"class":239},[173,2994,2995],{"class":334},"arguments",[173,2997,2161],{"class":239},[173,2999,3000],{"class":175,"line":1969},[173,3001,549],{"class":239},[173,3003,3004],{"class":175,"line":1975},[173,3005,283],{"class":239},[15,3007,3008],{},[109,3009,411],{},[30,3011,3012,3015,3018],{},[33,3013,3014],{},"Always implement destroy\u002Fcleanup methods",[33,3016,3017],{},"Use namespaced events",[33,3019,3020],{},"Audit event bindings during code review",[89,3022],{},[102,3024,3026],{"id":3025},"error-9-child-view-render-error-container-not-found","Error #9: \"Child View Render Error: Container Not Found\"",[15,3028,3029],{},[109,3030,111],{},[30,3032,3033,3036,3039],{},[33,3034,3035],{},"Extension child view doesn't appear",[33,3037,3038],{},"Console error about missing container",[33,3040,3041],{},"Parent view renders, child view is empty",[15,3043,3044],{},[109,3045,127],{},[129,3047,3050],{"className":3048,"code":3049,"language":134},[132],"Error: Child view container '[data-view=\"CustomWidget\"]' not found in parent template\nCannot render child view: CustomWidget.View\n",[136,3051,3049],{"__ignoreMap":138},[15,3053,3054,3056],{},[109,3055,143],{},"\nThe child view's placeholder element doesn't exist in the parent template, usually due to a template override or version mismatch.",[15,3058,3059],{},[109,3060,161],{},[15,3062,3063],{},"Step 1: Verify placeholder exists in template",[129,3065,3067],{"className":2057,"code":3066,"language":2059,"meta":138,"style":138},"{{!-- Parent template must have the data-view placeholder --}}\n\u003Cdiv class=\"product-details\">\n  \u003Ch1>{{itemName}}\u003C\u002Fh1>\n  \n  {{!-- This placeholder is required for child view --}}\n  \u003Cdiv data-view=\"CustomWidget\">\u003C\u002Fdiv>\n  \n  \u003Cdiv data-view=\"Product.Price\">\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n",[136,3068,3069,3074,3079,3084,3088,3093,3098,3102,3107],{"__ignoreMap":138},[173,3070,3071],{"class":175,"line":176},[173,3072,3073],{},"{{!-- Parent template must have the data-view placeholder --}}\n",[173,3075,3076],{"class":175,"line":183},[173,3077,3078],{},"\u003Cdiv class=\"product-details\">\n",[173,3080,3081],{"class":175,"line":189},[173,3082,3083],{},"  \u003Ch1>{{itemName}}\u003C\u002Fh1>\n",[173,3085,3086],{"class":175,"line":196},[173,3087,1850],{},[173,3089,3090],{"class":175,"line":202},[173,3091,3092],{},"  {{!-- This placeholder is required for child view --}}\n",[173,3094,3095],{"class":175,"line":215},[173,3096,3097],{},"  \u003Cdiv data-view=\"CustomWidget\">\u003C\u002Fdiv>\n",[173,3099,3100],{"class":175,"line":226},[173,3101,1850],{},[173,3103,3104],{"class":175,"line":232},[173,3105,3106],{},"  \u003Cdiv data-view=\"Product.Price\">\u003C\u002Fdiv>\n",[173,3108,3109],{"class":175,"line":274},[173,3110,3111],{},"\u003C\u002Fdiv>\n",[15,3113,3114],{},"Step 2: Check child view registration",[129,3116,3118],{"className":167,"code":3117,"language":169,"meta":138,"style":138},"\u002F\u002F In your view's childViews definition\nvar ProductDetailsView = BaseView.extend({\n  childViews: {\n    'CustomWidget': function() {\n      return new CustomWidgetView({\n        model: this.model\n      });\n    }\n  }\n});\n",[136,3119,3120,3125,3141,3146,3157,3169,3179,3184,3188,3192],{"__ignoreMap":138},[173,3121,3122],{"class":175,"line":176},[173,3123,3124],{"class":179},"\u002F\u002F In your view's childViews definition\n",[173,3126,3127,3129,3132,3134,3137,3139],{"class":175,"line":183},[173,3128,2575],{"class":208},[173,3130,3131],{"class":239}," ProductDetailsView ",[173,3133,2581],{"class":208},[173,3135,3136],{"class":239}," BaseView.",[173,3138,2840],{"class":235},[173,3140,2843],{"class":239},[173,3142,3143],{"class":175,"line":189},[173,3144,3145],{"class":239},"  childViews: {\n",[173,3147,3148,3151,3153,3155],{"class":175,"line":196},[173,3149,3150],{"class":243},"    'CustomWidget'",[173,3152,512],{"class":239},[173,3154,256],{"class":208},[173,3156,812],{"class":239},[173,3158,3159,3162,3164,3167],{"class":175,"line":202},[173,3160,3161],{"class":208},"      return",[173,3163,608],{"class":208},[173,3165,3166],{"class":235}," CustomWidgetView",[173,3168,2843],{"class":239},[173,3170,3171,3174,3176],{"class":175,"line":215},[173,3172,3173],{"class":239},"        model: ",[173,3175,2661],{"class":334},[173,3177,3178],{"class":239},".model\n",[173,3180,3181],{"class":175,"line":226},[173,3182,3183],{"class":239},"      });\n",[173,3185,3186],{"class":175,"line":232},[173,3187,984],{"class":239},[173,3189,3190],{"class":175,"line":274},[173,3191,549],{"class":239},[173,3193,3194],{"class":175,"line":280},[173,3195,283],{"class":239},[15,3197,3198],{},"Step 3: Use correct extension pattern",[129,3200,3202],{"className":167,"code":3201,"language":169,"meta":138,"style":138},"\u002F\u002F Properly extend existing view's child views\ndefine([\n  'ProductDetails.View',\n  'CustomWidget.View'\n], function(ProductDetailsView, CustomWidgetView) {\n  'use strict';\n  \n  \u002F\u002F Store original childViews\n  var originalChildViews = ProductDetailsView.prototype.childViews;\n  \n  \u002F\u002F Extend with new child view\n  ProductDetailsView.prototype.childViews = _.extend({}, originalChildViews, {\n    'CustomWidget': function() {\n      return new CustomWidgetView({\n        model: this.model\n      });\n    }\n  });\n  \n  return ProductDetailsView;\n});\n",[136,3203,3204,3209,3215,3222,3227,3245,3251,3255,3260,3280,3284,3289,3311,3321,3331,3339,3343,3347,3351,3355,3363],{"__ignoreMap":138},[173,3205,3206],{"class":175,"line":176},[173,3207,3208],{"class":179},"\u002F\u002F Properly extend existing view's child views\n",[173,3210,3211,3213],{"class":175,"line":183},[173,3212,236],{"class":235},[173,3214,1820],{"class":239},[173,3216,3217,3220],{"class":175,"line":189},[173,3218,3219],{"class":243},"  'ProductDetails.View'",[173,3221,518],{"class":239},[173,3223,3224],{"class":175,"line":196},[173,3225,3226],{"class":243},"  'CustomWidget.View'\n",[173,3228,3229,3231,3233,3235,3238,3240,3243],{"class":175,"line":202},[173,3230,253],{"class":239},[173,3232,256],{"class":208},[173,3234,259],{"class":239},[173,3236,3237],{"class":262},"ProductDetailsView",[173,3239,247],{"class":239},[173,3241,3242],{"class":262},"CustomWidgetView",[173,3244,271],{"class":239},[173,3246,3247,3249],{"class":175,"line":215},[173,3248,1843],{"class":243},[173,3250,1139],{"class":239},[173,3252,3253],{"class":175,"line":226},[173,3254,1850],{"class":239},[173,3256,3257],{"class":175,"line":232},[173,3258,3259],{"class":179},"  \u002F\u002F Store original childViews\n",[173,3261,3262,3265,3268,3270,3273,3275,3277],{"class":175,"line":274},[173,3263,3264],{"class":208},"  var",[173,3266,3267],{"class":239}," originalChildViews ",[173,3269,2581],{"class":208},[173,3271,3272],{"class":334}," ProductDetailsView",[173,3274,937],{"class":239},[173,3276,2980],{"class":334},[173,3278,3279],{"class":239},".childViews;\n",[173,3281,3282],{"class":175,"line":280},[173,3283,1850],{"class":239},[173,3285,3286],{"class":175,"line":1710},[173,3287,3288],{"class":179},"  \u002F\u002F Extend with new child view\n",[173,3290,3291,3294,3296,3298,3301,3303,3306,3308],{"class":175,"line":1716},[173,3292,3293],{"class":334},"  ProductDetailsView",[173,3295,937],{"class":239},[173,3297,2980],{"class":334},[173,3299,3300],{"class":239},".childViews ",[173,3302,2581],{"class":208},[173,3304,3305],{"class":239}," _.",[173,3307,2840],{"class":235},[173,3309,3310],{"class":239},"({}, originalChildViews, {\n",[173,3312,3313,3315,3317,3319],{"class":175,"line":1721},[173,3314,3150],{"class":243},[173,3316,512],{"class":239},[173,3318,256],{"class":208},[173,3320,812],{"class":239},[173,3322,3323,3325,3327,3329],{"class":175,"line":1726},[173,3324,3161],{"class":208},[173,3326,608],{"class":208},[173,3328,3166],{"class":235},[173,3330,2843],{"class":239},[173,3332,3333,3335,3337],{"class":175,"line":1731},[173,3334,3173],{"class":239},[173,3336,2661],{"class":334},[173,3338,3178],{"class":239},[173,3340,3341],{"class":175,"line":1957},[173,3342,3183],{"class":239},[173,3344,3345],{"class":175,"line":1969},[173,3346,984],{"class":239},[173,3348,3349],{"class":175,"line":1975},[173,3350,1978],{"class":239},[173,3352,3353],{"class":175,"line":1981},[173,3354,1850],{"class":239},[173,3356,3358,3360],{"class":175,"line":3357},20,[173,3359,817],{"class":208},[173,3361,3362],{"class":239}," ProductDetailsView;\n",[173,3364,3366],{"class":175,"line":3365},21,[173,3367,283],{"class":239},[15,3369,3370],{},"Step 4: Debug child view rendering",[129,3372,3374],{"className":167,"code":3373,"language":169,"meta":138,"style":138},"\u002F\u002F Add logging to see what's happening\nvar CustomWidgetView = BaseView.extend({\n  template: customWidgetTemplate,\n  \n  initialize: function() {\n    console.log('CustomWidgetView initialized');\n    console.log('Container exists:', !!document.querySelector('[data-view=\"CustomWidget\"]'));\n  },\n  \n  render: function() {\n    console.log('CustomWidgetView render called');\n    return BaseView.prototype.render.apply(this, arguments);\n  }\n});\n",[136,3375,3376,3381,3396,3401,3405,3415,3429,3458,3462,3466,3477,3490,3516,3520],{"__ignoreMap":138},[173,3377,3378],{"class":175,"line":176},[173,3379,3380],{"class":179},"\u002F\u002F Add logging to see what's happening\n",[173,3382,3383,3385,3388,3390,3392,3394],{"class":175,"line":183},[173,3384,2575],{"class":208},[173,3386,3387],{"class":239}," CustomWidgetView ",[173,3389,2581],{"class":208},[173,3391,3136],{"class":239},[173,3393,2840],{"class":235},[173,3395,2843],{"class":239},[173,3397,3398],{"class":175,"line":189},[173,3399,3400],{"class":239},"  template: customWidgetTemplate,\n",[173,3402,3403],{"class":175,"line":196},[173,3404,1850],{"class":239},[173,3406,3407,3409,3411,3413],{"class":175,"line":202},[173,3408,2848],{"class":235},[173,3410,512],{"class":239},[173,3412,256],{"class":208},[173,3414,812],{"class":239},[173,3416,3417,3420,3422,3424,3427],{"class":175,"line":215},[173,3418,3419],{"class":239},"    console.",[173,3421,2153],{"class":235},[173,3423,259],{"class":239},[173,3425,3426],{"class":243},"'CustomWidgetView initialized'",[173,3428,2161],{"class":239},[173,3430,3431,3433,3435,3437,3440,3442,3445,3448,3451,3453,3456],{"class":175,"line":226},[173,3432,3419],{"class":239},[173,3434,2153],{"class":235},[173,3436,259],{"class":239},[173,3438,3439],{"class":243},"'Container exists:'",[173,3441,247],{"class":239},[173,3443,3444],{"class":208},"!!",[173,3446,3447],{"class":239},"document.",[173,3449,3450],{"class":235},"querySelector",[173,3452,259],{"class":239},[173,3454,3455],{"class":243},"'[data-view=\"CustomWidget\"]'",[173,3457,2817],{"class":239},[173,3459,3460],{"class":175,"line":232},[173,3461,2907],{"class":239},[173,3463,3464],{"class":175,"line":274},[173,3465,1850],{"class":239},[173,3467,3468,3471,3473,3475],{"class":175,"line":280},[173,3469,3470],{"class":235},"  render",[173,3472,512],{"class":239},[173,3474,256],{"class":208},[173,3476,812],{"class":239},[173,3478,3479,3481,3483,3485,3488],{"class":175,"line":1710},[173,3480,3419],{"class":239},[173,3482,2153],{"class":235},[173,3484,259],{"class":239},[173,3486,3487],{"class":243},"'CustomWidgetView render called'",[173,3489,2161],{"class":239},[173,3491,3492,3494,3497,3499,3501,3504,3506,3508,3510,3512,3514],{"class":175,"line":1716},[173,3493,1910],{"class":208},[173,3495,3496],{"class":334}," BaseView",[173,3498,937],{"class":239},[173,3500,2980],{"class":334},[173,3502,3503],{"class":239},".render.",[173,3505,2986],{"class":235},[173,3507,259],{"class":239},[173,3509,2661],{"class":334},[173,3511,247],{"class":239},[173,3513,2995],{"class":334},[173,3515,2161],{"class":239},[173,3517,3518],{"class":175,"line":1721},[173,3519,549],{"class":239},[173,3521,3522],{"class":175,"line":1726},[173,3523,283],{"class":239},[15,3525,3526],{},[109,3527,411],{},[30,3529,3530,3533,3536],{},[33,3531,3532],{},"Test template modifications thoroughly",[33,3534,3535],{},"Document required placeholders for extensions",[33,3537,3538],{},"Use integration tests that verify child view rendering",[89,3540],{},[25,3542,57],{"id":3543},"netsuite-sync-failures",[102,3545,3547],{"id":3546},"error-10-order-sync-failed-invalid-field-reference","Error #10: \"Order Sync Failed: Invalid Field Reference\"",[15,3549,3550],{},[109,3551,111],{},[30,3553,3554,3557,3560],{},[33,3555,3556],{},"Orders placed on SuiteCommerce don't appear in NetSuite",[33,3558,3559],{},"Sync queue shows failed orders",[33,3561,3562],{},"Error mentions invalid field or record reference",[15,3564,3565],{},[109,3566,127],{},[129,3568,3571],{"className":3569,"code":3570,"language":134},[132],"INVALID_FLD_VALUE\nInvalid field reference 'custbody_custom_field' on record type 'salesorder'\nOrder ID: WEB-123456 failed to sync\n",[136,3572,3570],{"__ignoreMap":138},[15,3574,3575,3577],{},[109,3576,143],{},"\nA custom field referenced by SuiteCommerce doesn't exist in NetSuite, was renamed, or has incorrect permissions.",[15,3579,3580],{},[109,3581,161],{},[15,3583,3584],{},"Step 1: Verify custom field exists",[129,3586,3589],{"className":3587,"code":3588,"language":134},[132],"NetSuite > Customization > Lists, Records, & Fields > Transaction Body Fields\nSearch for: custbody_custom_field\nConfirm it exists and is applied to Sales Order\n",[136,3590,3588],{"__ignoreMap":138},[15,3592,3593],{},"Step 2: Check field permissions",[129,3595,3598],{"className":3596,"code":3597,"language":134},[132],"Custom field > Access tab\nVerify the integration role has Edit permission\nCheck \"Store Value\" is enabled\n",[136,3599,3597],{"__ignoreMap":138},[15,3601,3602],{},"Step 3: Verify field ID matches exactly",[129,3604,3606],{"className":167,"code":3605,"language":169,"meta":138,"style":138},"\u002F\u002F In your SuiteCommerce customization or SuiteScript\n\u002F\u002F Field IDs are case-sensitive in some contexts\n\n\u002F\u002F WRONG: Inconsistent casing\norder.setValue('custbody_Custom_Field', value);\n\n\u002F\u002F RIGHT: Exact match to NetSuite field ID\norder.setValue('custbody_custom_field', value);\n",[136,3607,3608,3613,3618,3622,3627,3643,3647,3652],{"__ignoreMap":138},[173,3609,3610],{"class":175,"line":176},[173,3611,3612],{"class":179},"\u002F\u002F In your SuiteCommerce customization or SuiteScript\n",[173,3614,3615],{"class":175,"line":183},[173,3616,3617],{"class":179},"\u002F\u002F Field IDs are case-sensitive in some contexts\n",[173,3619,3620],{"class":175,"line":189},[173,3621,193],{"emptyLinePlaceholder":192},[173,3623,3624],{"class":175,"line":196},[173,3625,3626],{"class":179},"\u002F\u002F WRONG: Inconsistent casing\n",[173,3628,3629,3632,3635,3637,3640],{"class":175,"line":202},[173,3630,3631],{"class":239},"order.",[173,3633,3634],{"class":235},"setValue",[173,3636,259],{"class":239},[173,3638,3639],{"class":243},"'custbody_Custom_Field'",[173,3641,3642],{"class":239},", value);\n",[173,3644,3645],{"class":175,"line":215},[173,3646,193],{"emptyLinePlaceholder":192},[173,3648,3649],{"class":175,"line":226},[173,3650,3651],{"class":179},"\u002F\u002F RIGHT: Exact match to NetSuite field ID\n",[173,3653,3654,3656,3658,3660,3663],{"class":175,"line":232},[173,3655,3631],{"class":239},[173,3657,3634],{"class":235},[173,3659,259],{"class":239},[173,3661,3662],{"class":243},"'custbody_custom_field'",[173,3664,3642],{"class":239},[15,3666,3667],{},"Step 4: Check for field dependency issues",[129,3669,3672],{"className":3670,"code":3671,"language":134},[132],"If custbody_custom_field depends on another field:\n- That dependency field must be set first\n- Verify the dependency value is valid\n\nNetSuite > Customization > Transaction Body Fields > [Field]\nCheck \"Dependency\" and \"Filter Using\" settings\n",[136,3673,3671],{"__ignoreMap":138},[15,3675,3676],{},"Step 5: Reprocess failed orders",[129,3678,3680],{"className":167,"code":3679,"language":169,"meta":138,"style":138},"\u002F\u002F SuiteScript to reprocess failed web orders\n\u002F**\n * @NApiVersion 2.1\n * @NScriptType ScheduledScript\n *\u002F\ndefine(['N\u002Fsearch', 'N\u002Frecord', 'N\u002Flog'], function(search, record, log) {\n  function execute(context) {\n    var failedOrders = search.create({\n      type: 'salesorder',\n      filters: [\n        ['custbody_sync_status', 'is', 'Failed'],\n        'AND',\n        ['mainline', 'is', 'T']\n      ]\n    });\n    \n    failedOrders.run().each(function(result) {\n      try {\n        var order = record.load({\n          type: 'salesorder',\n          id: result.id\n        });\n        \u002F\u002F Fix and resave\n        order.save();\n        log.audit('Reprocessed', result.id);\n      } catch (e) {\n        log.error('Failed to reprocess', result.id + ': ' + e.message);\n      }\n      return true;\n    });\n  }\n  \n  return { execute: execute };\n});\n",[136,3681,3682,3687,3691,3699,3709,3713,3748,3763,3781,3791,3796,3817,3824,3843,3848,3853,3857,3882,3889,3907,3916,3921,3927,3933,3944,3961,3973,4000,4005,4015,4020,4025,4030,4038],{"__ignoreMap":138},[173,3683,3684],{"class":175,"line":176},[173,3685,3686],{"class":179},"\u002F\u002F SuiteScript to reprocess failed web orders\n",[173,3688,3689],{"class":175,"line":183},[173,3690,199],{"class":179},[173,3692,3693,3695,3697],{"class":175,"line":189},[173,3694,205],{"class":179},[173,3696,209],{"class":208},[173,3698,212],{"class":179},[173,3700,3701,3703,3706],{"class":175,"line":196},[173,3702,205],{"class":179},[173,3704,3705],{"class":208},"@NScriptType",[173,3707,3708],{"class":179}," ScheduledScript\n",[173,3710,3711],{"class":175,"line":202},[173,3712,229],{"class":179},[173,3714,3715,3717,3719,3721,3723,3725,3727,3730,3732,3734,3736,3738,3740,3742,3744,3746],{"class":175,"line":215},[173,3716,236],{"class":235},[173,3718,240],{"class":239},[173,3720,250],{"class":243},[173,3722,247],{"class":239},[173,3724,244],{"class":243},[173,3726,247],{"class":239},[173,3728,3729],{"class":243},"'N\u002Flog'",[173,3731,253],{"class":239},[173,3733,256],{"class":208},[173,3735,259],{"class":239},[173,3737,268],{"class":262},[173,3739,247],{"class":239},[173,3741,263],{"class":262},[173,3743,247],{"class":239},[173,3745,2153],{"class":262},[173,3747,271],{"class":239},[173,3749,3750,3753,3756,3758,3761],{"class":175,"line":226},[173,3751,3752],{"class":208},"  function",[173,3754,3755],{"class":235}," execute",[173,3757,259],{"class":239},[173,3759,3760],{"class":262},"context",[173,3762,271],{"class":239},[173,3764,3765,3768,3771,3773,3776,3779],{"class":175,"line":232},[173,3766,3767],{"class":208},"    var",[173,3769,3770],{"class":239}," failedOrders ",[173,3772,2581],{"class":208},[173,3774,3775],{"class":239}," search.",[173,3777,3778],{"class":235},"create",[173,3780,2843],{"class":239},[173,3782,3783,3786,3789],{"class":175,"line":274},[173,3784,3785],{"class":239},"      type: ",[173,3787,3788],{"class":243},"'salesorder'",[173,3790,518],{"class":239},[173,3792,3793],{"class":175,"line":280},[173,3794,3795],{"class":239},"      filters: [\n",[173,3797,3798,3801,3804,3806,3809,3811,3814],{"class":175,"line":1710},[173,3799,3800],{"class":239},"        [",[173,3802,3803],{"class":243},"'custbody_sync_status'",[173,3805,247],{"class":239},[173,3807,3808],{"class":243},"'is'",[173,3810,247],{"class":239},[173,3812,3813],{"class":243},"'Failed'",[173,3815,3816],{"class":239},"],\n",[173,3818,3819,3822],{"class":175,"line":1716},[173,3820,3821],{"class":243},"        'AND'",[173,3823,518],{"class":239},[173,3825,3826,3828,3831,3833,3835,3837,3840],{"class":175,"line":1721},[173,3827,3800],{"class":239},[173,3829,3830],{"class":243},"'mainline'",[173,3832,247],{"class":239},[173,3834,3808],{"class":243},[173,3836,247],{"class":239},[173,3838,3839],{"class":243},"'T'",[173,3841,3842],{"class":239},"]\n",[173,3844,3845],{"class":175,"line":1726},[173,3846,3847],{"class":239},"      ]\n",[173,3849,3850],{"class":175,"line":1731},[173,3851,3852],{"class":239},"    });\n",[173,3854,3855],{"class":175,"line":1957},[173,3856,2948],{"class":239},[173,3858,3859,3862,3865,3868,3871,3873,3875,3877,3880],{"class":175,"line":1969},[173,3860,3861],{"class":239},"    failedOrders.",[173,3863,3864],{"class":235},"run",[173,3866,3867],{"class":239},"().",[173,3869,3870],{"class":235},"each",[173,3872,259],{"class":239},[173,3874,256],{"class":208},[173,3876,259],{"class":239},[173,3878,3879],{"class":262},"result",[173,3881,271],{"class":239},[173,3883,3884,3887],{"class":175,"line":1975},[173,3885,3886],{"class":208},"      try",[173,3888,946],{"class":239},[173,3890,3891,3894,3897,3899,3902,3905],{"class":175,"line":1981},[173,3892,3893],{"class":208},"        var",[173,3895,3896],{"class":239}," order ",[173,3898,2581],{"class":208},[173,3900,3901],{"class":239}," record.",[173,3903,3904],{"class":235},"load",[173,3906,2843],{"class":239},[173,3908,3909,3912,3914],{"class":175,"line":3357},[173,3910,3911],{"class":239},"          type: ",[173,3913,3788],{"class":243},[173,3915,518],{"class":239},[173,3917,3918],{"class":175,"line":3365},[173,3919,3920],{"class":239},"          id: result.id\n",[173,3922,3924],{"class":175,"line":3923},22,[173,3925,3926],{"class":239},"        });\n",[173,3928,3930],{"class":175,"line":3929},23,[173,3931,3932],{"class":179},"        \u002F\u002F Fix and resave\n",[173,3934,3936,3939,3942],{"class":175,"line":3935},24,[173,3937,3938],{"class":239},"        order.",[173,3940,3941],{"class":235},"save",[173,3943,2802],{"class":239},[173,3945,3947,3950,3953,3955,3958],{"class":175,"line":3946},25,[173,3948,3949],{"class":239},"        log.",[173,3951,3952],{"class":235},"audit",[173,3954,259],{"class":239},[173,3956,3957],{"class":243},"'Reprocessed'",[173,3959,3960],{"class":239},", result.id);\n",[173,3962,3964,3967,3970],{"class":175,"line":3963},26,[173,3965,3966],{"class":239},"      } ",[173,3968,3969],{"class":208},"catch",[173,3971,3972],{"class":239}," (e) {\n",[173,3974,3976,3978,3981,3983,3986,3989,3992,3995,3997],{"class":175,"line":3975},27,[173,3977,3949],{"class":239},[173,3979,3980],{"class":235},"error",[173,3982,259],{"class":239},[173,3984,3985],{"class":243},"'Failed to reprocess'",[173,3987,3988],{"class":239},", result.id ",[173,3990,3991],{"class":208},"+",[173,3993,3994],{"class":243}," ': '",[173,3996,2201],{"class":208},[173,3998,3999],{"class":239}," e.message);\n",[173,4001,4003],{"class":175,"line":4002},28,[173,4004,1581],{"class":239},[173,4006,4008,4010,4013],{"class":175,"line":4007},29,[173,4009,3161],{"class":208},[173,4011,4012],{"class":334}," true",[173,4014,1139],{"class":239},[173,4016,4018],{"class":175,"line":4017},30,[173,4019,3852],{"class":239},[173,4021,4023],{"class":175,"line":4022},31,[173,4024,549],{"class":239},[173,4026,4028],{"class":175,"line":4027},32,[173,4029,1850],{"class":239},[173,4031,4033,4035],{"class":175,"line":4032},33,[173,4034,817],{"class":208},[173,4036,4037],{"class":239}," { execute: execute };\n",[173,4039,4041],{"class":175,"line":4040},34,[173,4042,283],{"class":239},[15,4044,4045],{},[109,4046,411],{},[30,4048,4049,4052,4055],{},[33,4050,4051],{},"Test custom field mapping in sandbox first",[33,4053,4054],{},"Create field validation in your sync scripts",[33,4056,4057],{},"Monitor sync queue with alerts for failures",[89,4059],{},[102,4061,4063],{"id":4062},"error-11-inventory-sync-timeout-search-exceeded-governance","Error #11: \"Inventory Sync Timeout: Search Exceeded Governance\"",[15,4065,4066],{},[109,4067,111],{},[30,4069,4070,4073,4076],{},[33,4071,4072],{},"Inventory levels outdated on SuiteCommerce",[33,4074,4075],{},"Scheduled inventory sync fails",[33,4077,4078],{},"Products show wrong stock status",[15,4080,4081],{},[109,4082,127],{},[129,4084,4087],{"className":4085,"code":4086,"language":134},[132],"SSS_SEARCH_TIMEOUT\nSearch exceeded maximum execution time\nScript: mr_inventory_sync.js\nRemaining governance: 0 units\n",[136,4088,4086],{"__ignoreMap":138},[15,4090,4091,4093],{},[109,4092,143],{},"\nInventory sync saved search or map\u002Freduce script is processing too many records inefficiently.",[15,4095,4096],{},[109,4097,161],{},[15,4099,4100],{},"Step 1: Optimize the saved search",[129,4102,4104],{"className":167,"code":4103,"language":169,"meta":138,"style":138},"\u002F\u002F WRONG: Broad search returning all items\nvar itemSearch = search.create({\n  type: 'item',\n  filters: [\n    ['isinactive', 'is', 'F']\n  ],\n  columns: ['itemid', 'quantityavailable', 'custitem_web_available']\n});\n\n\u002F\u002F RIGHT: Targeted search with date filter\nvar lastSyncDate = runtime.getCurrentScript().getParameter('custscript_last_sync');\n\nvar itemSearch = search.create({\n  type: 'item',\n  filters: [\n    ['isinactive', 'is', 'F'],\n    'AND',\n    ['modified', 'onorafter', lastSyncDate],  \u002F\u002F Only changed items\n    'AND',\n    ['isonline', 'is', 'T']  \u002F\u002F Only web items\n  ],\n  columns: ['itemid', 'quantityavailable']\n});\n",[136,4105,4106,4111,4126,4136,4141,4159,4164,4184,4188,4192,4197,4224,4228,4242,4250,4254,4270,4277,4295,4301,4321,4325,4337],{"__ignoreMap":138},[173,4107,4108],{"class":175,"line":176},[173,4109,4110],{"class":179},"\u002F\u002F WRONG: Broad search returning all items\n",[173,4112,4113,4115,4118,4120,4122,4124],{"class":175,"line":183},[173,4114,2575],{"class":208},[173,4116,4117],{"class":239}," itemSearch ",[173,4119,2581],{"class":208},[173,4121,3775],{"class":239},[173,4123,3778],{"class":235},[173,4125,2843],{"class":239},[173,4127,4128,4131,4134],{"class":175,"line":189},[173,4129,4130],{"class":239},"  type: ",[173,4132,4133],{"class":243},"'item'",[173,4135,518],{"class":239},[173,4137,4138],{"class":175,"line":196},[173,4139,4140],{"class":239},"  filters: [\n",[173,4142,4143,4145,4148,4150,4152,4154,4157],{"class":175,"line":202},[173,4144,1554],{"class":239},[173,4146,4147],{"class":243},"'isinactive'",[173,4149,247],{"class":239},[173,4151,3808],{"class":243},[173,4153,247],{"class":239},[173,4155,4156],{"class":243},"'F'",[173,4158,3842],{"class":239},[173,4160,4161],{"class":175,"line":215},[173,4162,4163],{"class":239},"  ],\n",[173,4165,4166,4169,4172,4174,4177,4179,4182],{"class":175,"line":226},[173,4167,4168],{"class":239},"  columns: [",[173,4170,4171],{"class":243},"'itemid'",[173,4173,247],{"class":239},[173,4175,4176],{"class":243},"'quantityavailable'",[173,4178,247],{"class":239},[173,4180,4181],{"class":243},"'custitem_web_available'",[173,4183,3842],{"class":239},[173,4185,4186],{"class":175,"line":232},[173,4187,283],{"class":239},[173,4189,4190],{"class":175,"line":274},[173,4191,193],{"emptyLinePlaceholder":192},[173,4193,4194],{"class":175,"line":280},[173,4195,4196],{"class":179},"\u002F\u002F RIGHT: Targeted search with date filter\n",[173,4198,4199,4201,4204,4206,4209,4212,4214,4217,4219,4222],{"class":175,"line":1710},[173,4200,2575],{"class":208},[173,4202,4203],{"class":239}," lastSyncDate ",[173,4205,2581],{"class":208},[173,4207,4208],{"class":239}," runtime.",[173,4210,4211],{"class":235},"getCurrentScript",[173,4213,3867],{"class":239},[173,4215,4216],{"class":235},"getParameter",[173,4218,259],{"class":239},[173,4220,4221],{"class":243},"'custscript_last_sync'",[173,4223,2161],{"class":239},[173,4225,4226],{"class":175,"line":1716},[173,4227,193],{"emptyLinePlaceholder":192},[173,4229,4230,4232,4234,4236,4238,4240],{"class":175,"line":1721},[173,4231,2575],{"class":208},[173,4233,4117],{"class":239},[173,4235,2581],{"class":208},[173,4237,3775],{"class":239},[173,4239,3778],{"class":235},[173,4241,2843],{"class":239},[173,4243,4244,4246,4248],{"class":175,"line":1726},[173,4245,4130],{"class":239},[173,4247,4133],{"class":243},[173,4249,518],{"class":239},[173,4251,4252],{"class":175,"line":1731},[173,4253,4140],{"class":239},[173,4255,4256,4258,4260,4262,4264,4266,4268],{"class":175,"line":1957},[173,4257,1554],{"class":239},[173,4259,4147],{"class":243},[173,4261,247],{"class":239},[173,4263,3808],{"class":243},[173,4265,247],{"class":239},[173,4267,4156],{"class":243},[173,4269,3816],{"class":239},[173,4271,4272,4275],{"class":175,"line":1969},[173,4273,4274],{"class":243},"    'AND'",[173,4276,518],{"class":239},[173,4278,4279,4281,4284,4286,4289,4292],{"class":175,"line":1975},[173,4280,1554],{"class":239},[173,4282,4283],{"class":243},"'modified'",[173,4285,247],{"class":239},[173,4287,4288],{"class":243},"'onorafter'",[173,4290,4291],{"class":239},", lastSyncDate],  ",[173,4293,4294],{"class":179},"\u002F\u002F Only changed items\n",[173,4296,4297,4299],{"class":175,"line":1981},[173,4298,4274],{"class":243},[173,4300,518],{"class":239},[173,4302,4303,4305,4308,4310,4312,4314,4316,4318],{"class":175,"line":3357},[173,4304,1554],{"class":239},[173,4306,4307],{"class":243},"'isonline'",[173,4309,247],{"class":239},[173,4311,3808],{"class":243},[173,4313,247],{"class":239},[173,4315,3839],{"class":243},[173,4317,2492],{"class":239},[173,4319,4320],{"class":179},"\u002F\u002F Only web items\n",[173,4322,4323],{"class":175,"line":3365},[173,4324,4163],{"class":239},[173,4326,4327,4329,4331,4333,4335],{"class":175,"line":3923},[173,4328,4168],{"class":239},[173,4330,4171],{"class":243},[173,4332,247],{"class":239},[173,4334,4176],{"class":243},[173,4336,3842],{"class":239},[173,4338,4339],{"class":175,"line":3929},[173,4340,283],{"class":239},[15,4342,4343],{},"Step 2: Use Map\u002FReduce for large datasets",[129,4345,4347],{"className":167,"code":4346,"language":169,"meta":138,"style":138},"\u002F**\n * @NApiVersion 2.1\n * @NScriptType MapReduceScript\n *\u002F\ndefine(['N\u002Fsearch', 'N\u002Frecord'], function(search, record) {\n  \n  function getInputData() {\n    return search.create({\n      type: 'item',\n      filters: [\u002F* optimized filters *\u002F],\n      columns: ['itemid', 'quantityavailable']\n    });\n  }\n  \n  function map(context) {\n    var item = JSON.parse(context.value);\n    \u002F\u002F Process single item\n    context.write({\n      key: item.id,\n      value: item.values.quantityavailable\n    });\n  }\n  \n  function reduce(context) {\n    \u002F\u002F Batch updates\n    var itemId = context.key;\n    var quantity = context.values[0];\n    \n    record.submitFields({\n      type: 'item',\n      id: itemId,\n      values: {\n        'custitem_sc_quantity': quantity\n      }\n    });\n  }\n  \n  function summarize(summary) {\n    log.audit('Inventory sync complete', {\n      processed: summary.inputSummary.totalRecords,\n      errors: summary.inputSummary.error\n    });\n  }\n  \n  return { getInputData, map, reduce, summarize };\n});\n",[136,4348,4349,4353,4361,4370,4374,4400,4404,4413,4423,4431,4441,4454,4458,4462,4466,4479,4499,4504,4513,4518,4523,4527,4531,4535,4548,4553,4565,4582,4586,4596,4604,4609,4614,4622,4626,4631,4636,4641,4656,4671,4677,4683,4688,4693,4698,4706],{"__ignoreMap":138},[173,4350,4351],{"class":175,"line":176},[173,4352,199],{"class":179},[173,4354,4355,4357,4359],{"class":175,"line":183},[173,4356,205],{"class":179},[173,4358,209],{"class":208},[173,4360,212],{"class":179},[173,4362,4363,4365,4367],{"class":175,"line":189},[173,4364,205],{"class":179},[173,4366,3705],{"class":208},[173,4368,4369],{"class":179}," MapReduceScript\n",[173,4371,4372],{"class":175,"line":196},[173,4373,229],{"class":179},[173,4375,4376,4378,4380,4382,4384,4386,4388,4390,4392,4394,4396,4398],{"class":175,"line":202},[173,4377,236],{"class":235},[173,4379,240],{"class":239},[173,4381,250],{"class":243},[173,4383,247],{"class":239},[173,4385,244],{"class":243},[173,4387,253],{"class":239},[173,4389,256],{"class":208},[173,4391,259],{"class":239},[173,4393,268],{"class":262},[173,4395,247],{"class":239},[173,4397,263],{"class":262},[173,4399,271],{"class":239},[173,4401,4402],{"class":175,"line":215},[173,4403,1850],{"class":239},[173,4405,4406,4408,4411],{"class":175,"line":226},[173,4407,3752],{"class":208},[173,4409,4410],{"class":235}," getInputData",[173,4412,812],{"class":239},[173,4414,4415,4417,4419,4421],{"class":175,"line":232},[173,4416,1910],{"class":208},[173,4418,3775],{"class":239},[173,4420,3778],{"class":235},[173,4422,2843],{"class":239},[173,4424,4425,4427,4429],{"class":175,"line":274},[173,4426,3785],{"class":239},[173,4428,4133],{"class":243},[173,4430,518],{"class":239},[173,4432,4433,4436,4439],{"class":175,"line":280},[173,4434,4435],{"class":239},"      filters: [",[173,4437,4438],{"class":179},"\u002F* optimized filters *\u002F",[173,4440,3816],{"class":239},[173,4442,4443,4446,4448,4450,4452],{"class":175,"line":1710},[173,4444,4445],{"class":239},"      columns: [",[173,4447,4171],{"class":243},[173,4449,247],{"class":239},[173,4451,4176],{"class":243},[173,4453,3842],{"class":239},[173,4455,4456],{"class":175,"line":1716},[173,4457,3852],{"class":239},[173,4459,4460],{"class":175,"line":1721},[173,4461,549],{"class":239},[173,4463,4464],{"class":175,"line":1726},[173,4465,1850],{"class":239},[173,4467,4468,4470,4473,4475,4477],{"class":175,"line":1731},[173,4469,3752],{"class":208},[173,4471,4472],{"class":235}," map",[173,4474,259],{"class":239},[173,4476,3760],{"class":262},[173,4478,271],{"class":239},[173,4480,4481,4483,4486,4488,4491,4493,4496],{"class":175,"line":1957},[173,4482,3767],{"class":208},[173,4484,4485],{"class":239}," item ",[173,4487,2581],{"class":208},[173,4489,4490],{"class":334}," JSON",[173,4492,937],{"class":239},[173,4494,4495],{"class":235},"parse",[173,4497,4498],{"class":239},"(context.value);\n",[173,4500,4501],{"class":175,"line":1969},[173,4502,4503],{"class":179},"    \u002F\u002F Process single item\n",[173,4505,4506,4509,4511],{"class":175,"line":1975},[173,4507,4508],{"class":239},"    context.",[173,4510,886],{"class":235},[173,4512,2843],{"class":239},[173,4514,4515],{"class":175,"line":1981},[173,4516,4517],{"class":239},"      key: item.id,\n",[173,4519,4520],{"class":175,"line":3357},[173,4521,4522],{"class":239},"      value: item.values.quantityavailable\n",[173,4524,4525],{"class":175,"line":3365},[173,4526,3852],{"class":239},[173,4528,4529],{"class":175,"line":3923},[173,4530,549],{"class":239},[173,4532,4533],{"class":175,"line":3929},[173,4534,1850],{"class":239},[173,4536,4537,4539,4542,4544,4546],{"class":175,"line":3935},[173,4538,3752],{"class":208},[173,4540,4541],{"class":235}," reduce",[173,4543,259],{"class":239},[173,4545,3760],{"class":262},[173,4547,271],{"class":239},[173,4549,4550],{"class":175,"line":3946},[173,4551,4552],{"class":179},"    \u002F\u002F Batch updates\n",[173,4554,4555,4557,4560,4562],{"class":175,"line":3963},[173,4556,3767],{"class":208},[173,4558,4559],{"class":239}," itemId ",[173,4561,2581],{"class":208},[173,4563,4564],{"class":239}," context.key;\n",[173,4566,4567,4569,4572,4574,4577,4579],{"class":175,"line":3975},[173,4568,3767],{"class":208},[173,4570,4571],{"class":239}," quantity ",[173,4573,2581],{"class":208},[173,4575,4576],{"class":239}," context.values[",[173,4578,2612],{"class":334},[173,4580,4581],{"class":239},"];\n",[173,4583,4584],{"class":175,"line":4002},[173,4585,2948],{"class":239},[173,4587,4588,4591,4594],{"class":175,"line":4007},[173,4589,4590],{"class":239},"    record.",[173,4592,4593],{"class":235},"submitFields",[173,4595,2843],{"class":239},[173,4597,4598,4600,4602],{"class":175,"line":4017},[173,4599,3785],{"class":239},[173,4601,4133],{"class":243},[173,4603,518],{"class":239},[173,4605,4606],{"class":175,"line":4022},[173,4607,4608],{"class":239},"      id: itemId,\n",[173,4610,4611],{"class":175,"line":4027},[173,4612,4613],{"class":239},"      values: {\n",[173,4615,4616,4619],{"class":175,"line":4032},[173,4617,4618],{"class":243},"        'custitem_sc_quantity'",[173,4620,4621],{"class":239},": quantity\n",[173,4623,4624],{"class":175,"line":4040},[173,4625,1581],{"class":239},[173,4627,4629],{"class":175,"line":4628},35,[173,4630,3852],{"class":239},[173,4632,4634],{"class":175,"line":4633},36,[173,4635,549],{"class":239},[173,4637,4639],{"class":175,"line":4638},37,[173,4640,1850],{"class":239},[173,4642,4644,4646,4649,4651,4654],{"class":175,"line":4643},38,[173,4645,3752],{"class":208},[173,4647,4648],{"class":235}," summarize",[173,4650,259],{"class":239},[173,4652,4653],{"class":262},"summary",[173,4655,271],{"class":239},[173,4657,4659,4662,4664,4666,4669],{"class":175,"line":4658},39,[173,4660,4661],{"class":239},"    log.",[173,4663,3952],{"class":235},[173,4665,259],{"class":239},[173,4667,4668],{"class":243},"'Inventory sync complete'",[173,4670,1560],{"class":239},[173,4672,4674],{"class":175,"line":4673},40,[173,4675,4676],{"class":239},"      processed: summary.inputSummary.totalRecords,\n",[173,4678,4680],{"class":175,"line":4679},41,[173,4681,4682],{"class":239},"      errors: summary.inputSummary.error\n",[173,4684,4686],{"class":175,"line":4685},42,[173,4687,3852],{"class":239},[173,4689,4691],{"class":175,"line":4690},43,[173,4692,549],{"class":239},[173,4694,4696],{"class":175,"line":4695},44,[173,4697,1850],{"class":239},[173,4699,4701,4703],{"class":175,"line":4700},45,[173,4702,817],{"class":208},[173,4704,4705],{"class":239}," { getInputData, map, reduce, summarize };\n",[173,4707,4709],{"class":175,"line":4708},46,[173,4710,283],{"class":239},[15,4712,4713],{},"Step 3: Implement incremental sync",[129,4715,4717],{"className":167,"code":4716,"language":169,"meta":138,"style":138},"\u002F\u002F Only sync items modified since last run\nfunction getModifiedItemsSince(lastSyncTimestamp) {\n  return search.create({\n    type: 'inventoryitem',\n    filters: [\n      ['lastmodifieddate', 'onorafter', lastSyncTimestamp],\n      'AND',\n      ['isonline', 'is', 'T']\n    ]\n  });\n}\n\n\u002F\u002F Store last sync timestamp\nfunction updateLastSyncTimestamp() {\n  var now = new Date().toISOString();\n  \u002F\u002F Store in custom record or script parameter\n}\n",[136,4718,4719,4724,4738,4748,4758,4763,4778,4785,4801,4805,4809,4813,4817,4822,4831,4852,4857],{"__ignoreMap":138},[173,4720,4721],{"class":175,"line":176},[173,4722,4723],{"class":179},"\u002F\u002F Only sync items modified since last run\n",[173,4725,4726,4728,4731,4733,4736],{"class":175,"line":183},[173,4727,256],{"class":208},[173,4729,4730],{"class":235}," getModifiedItemsSince",[173,4732,259],{"class":239},[173,4734,4735],{"class":262},"lastSyncTimestamp",[173,4737,271],{"class":239},[173,4739,4740,4742,4744,4746],{"class":175,"line":189},[173,4741,817],{"class":208},[173,4743,3775],{"class":239},[173,4745,3778],{"class":235},[173,4747,2843],{"class":239},[173,4749,4750,4753,4756],{"class":175,"line":196},[173,4751,4752],{"class":239},"    type: ",[173,4754,4755],{"class":243},"'inventoryitem'",[173,4757,518],{"class":239},[173,4759,4760],{"class":175,"line":202},[173,4761,4762],{"class":239},"    filters: [\n",[173,4764,4765,4768,4771,4773,4775],{"class":175,"line":215},[173,4766,4767],{"class":239},"      [",[173,4769,4770],{"class":243},"'lastmodifieddate'",[173,4772,247],{"class":239},[173,4774,4288],{"class":243},[173,4776,4777],{"class":239},", lastSyncTimestamp],\n",[173,4779,4780,4783],{"class":175,"line":226},[173,4781,4782],{"class":243},"      'AND'",[173,4784,518],{"class":239},[173,4786,4787,4789,4791,4793,4795,4797,4799],{"class":175,"line":232},[173,4788,4767],{"class":239},[173,4790,4307],{"class":243},[173,4792,247],{"class":239},[173,4794,3808],{"class":243},[173,4796,247],{"class":239},[173,4798,3839],{"class":243},[173,4800,3842],{"class":239},[173,4802,4803],{"class":175,"line":274},[173,4804,1375],{"class":239},[173,4806,4807],{"class":175,"line":280},[173,4808,1978],{"class":239},[173,4810,4811],{"class":175,"line":1710},[173,4812,554],{"class":239},[173,4814,4815],{"class":175,"line":1716},[173,4816,193],{"emptyLinePlaceholder":192},[173,4818,4819],{"class":175,"line":1721},[173,4820,4821],{"class":179},"\u002F\u002F Store last sync timestamp\n",[173,4823,4824,4826,4829],{"class":175,"line":1726},[173,4825,256],{"class":208},[173,4827,4828],{"class":235}," updateLastSyncTimestamp",[173,4830,812],{"class":239},[173,4832,4833,4835,4838,4840,4842,4845,4847,4850],{"class":175,"line":1731},[173,4834,3264],{"class":208},[173,4836,4837],{"class":239}," now ",[173,4839,2581],{"class":208},[173,4841,608],{"class":208},[173,4843,4844],{"class":235}," Date",[173,4846,3867],{"class":239},[173,4848,4849],{"class":235},"toISOString",[173,4851,2802],{"class":239},[173,4853,4854],{"class":175,"line":1957},[173,4855,4856],{"class":179},"  \u002F\u002F Store in custom record or script parameter\n",[173,4858,4859],{"class":175,"line":1969},[173,4860,554],{"class":239},[15,4862,4863],{},[109,4864,411],{},[30,4866,4867,4870,4873],{},[33,4868,4869],{},"Implement incremental (delta) sync instead of full sync",[33,4871,4872],{},"Monitor governance usage and set alerts",[33,4874,4875],{},"Schedule sync during off-peak hours",[89,4877],{},[25,4879,63],{"id":4880},"payment-gateway-errors",[102,4882,4884],{"id":4883},"error-12-payment-processing-failed-gateway-timeout","Error #12: \"Payment Processing Failed: Gateway Timeout\"",[15,4886,4887],{},[109,4888,111],{},[30,4890,4891,4894,4897],{},[33,4892,4893],{},"Checkout hangs at payment step",[33,4895,4896],{},"Order submits but payment status unclear",[33,4898,4899],{},"Customer charged but order shows failed",[15,4901,4902],{},[109,4903,127],{},[129,4905,4908],{"className":4906,"code":4907,"language":134},[132],"GATEWAY_TIMEOUT\nPayment gateway did not respond within timeout period (30000ms)\nTransaction ID: TXN-789012\nStatus: Unknown\n",[136,4909,4907],{"__ignoreMap":138},[15,4911,4912,4914],{},[109,4913,143],{},"\nPayment gateway response time exceeded SuiteCommerce timeout limits. The payment may have actually succeeded.",[15,4916,4917],{},[109,4918,161],{},[15,4920,4921],{},"Step 1: Implement idempotent payment requests",[129,4923,4925],{"className":167,"code":4924,"language":169,"meta":138,"style":138},"\u002F\u002F Generate unique idempotency key BEFORE payment attempt\nfunction generateIdempotencyKey(orderId, attemptNumber) {\n  return 'PAY_' + orderId + '_' + attemptNumber + '_' + Date.now();\n}\n\n\u002F\u002F Use in payment request\nvar paymentRequest = {\n  amount: order.total,\n  currency: 'USD',\n  idempotency_key: generateIdempotencyKey(order.id, 1),\n  \u002F\u002F ... other params\n};\n",[136,4926,4927,4932,4951,4987,4991,4995,5000,5011,5016,5026,5042,5047],{"__ignoreMap":138},[173,4928,4929],{"class":175,"line":176},[173,4930,4931],{"class":179},"\u002F\u002F Generate unique idempotency key BEFORE payment attempt\n",[173,4933,4934,4936,4939,4941,4944,4946,4949],{"class":175,"line":183},[173,4935,256],{"class":208},[173,4937,4938],{"class":235}," generateIdempotencyKey",[173,4940,259],{"class":239},[173,4942,4943],{"class":262},"orderId",[173,4945,247],{"class":239},[173,4947,4948],{"class":262},"attemptNumber",[173,4950,271],{"class":239},[173,4952,4953,4955,4958,4960,4963,4965,4968,4970,4973,4975,4977,4979,4982,4985],{"class":175,"line":189},[173,4954,817],{"class":208},[173,4956,4957],{"class":243}," 'PAY_'",[173,4959,2201],{"class":208},[173,4961,4962],{"class":239}," orderId ",[173,4964,3991],{"class":208},[173,4966,4967],{"class":243}," '_'",[173,4969,2201],{"class":208},[173,4971,4972],{"class":239}," attemptNumber ",[173,4974,3991],{"class":208},[173,4976,4967],{"class":243},[173,4978,2201],{"class":208},[173,4980,4981],{"class":239}," Date.",[173,4983,4984],{"class":235},"now",[173,4986,2802],{"class":239},[173,4988,4989],{"class":175,"line":196},[173,4990,554],{"class":239},[173,4992,4993],{"class":175,"line":202},[173,4994,193],{"emptyLinePlaceholder":192},[173,4996,4997],{"class":175,"line":215},[173,4998,4999],{"class":179},"\u002F\u002F Use in payment request\n",[173,5001,5002,5004,5007,5009],{"class":175,"line":226},[173,5003,2575],{"class":208},[173,5005,5006],{"class":239}," paymentRequest ",[173,5008,2581],{"class":208},[173,5010,946],{"class":239},[173,5012,5013],{"class":175,"line":232},[173,5014,5015],{"class":239},"  amount: order.total,\n",[173,5017,5018,5021,5024],{"class":175,"line":274},[173,5019,5020],{"class":239},"  currency: ",[173,5022,5023],{"class":243},"'USD'",[173,5025,518],{"class":239},[173,5027,5028,5031,5034,5037,5039],{"class":175,"line":280},[173,5029,5030],{"class":239},"  idempotency_key: ",[173,5032,5033],{"class":235},"generateIdempotencyKey",[173,5035,5036],{"class":239},"(order.id, ",[173,5038,2036],{"class":334},[173,5040,5041],{"class":239},"),\n",[173,5043,5044],{"class":175,"line":1710},[173,5045,5046],{"class":179},"  \u002F\u002F ... other params\n",[173,5048,5049],{"class":175,"line":1716},[173,5050,993],{"class":239},[15,5052,5053],{},"Step 2: Add retry with exponential backoff",[129,5055,5057],{"className":167,"code":5056,"language":169,"meta":138,"style":138},"async function processPaymentWithRetry(paymentData, maxRetries = 3) {\n  for (let attempt = 1; attempt \u003C= maxRetries; attempt++) {\n    try {\n      const result = await paymentGateway.charge(paymentData);\n      return result;\n    } catch (error) {\n      if (error.code === 'TIMEOUT' && attempt \u003C maxRetries) {\n        \u002F\u002F Exponential backoff: 1s, 2s, 4s\n        await sleep(Math.pow(2, attempt - 1) * 1000);\n        continue;\n      }\n      throw error;\n    }\n  }\n}\n",[136,5058,5059,5087,5120,5127,5149,5156,5166,5191,5196,5233,5240,5244,5252,5256,5260],{"__ignoreMap":138},[173,5060,5061,5064,5067,5070,5072,5075,5077,5080,5082,5085],{"class":175,"line":176},[173,5062,5063],{"class":208},"async",[173,5065,5066],{"class":208}," function",[173,5068,5069],{"class":235}," processPaymentWithRetry",[173,5071,259],{"class":239},[173,5073,5074],{"class":262},"paymentData",[173,5076,247],{"class":239},[173,5078,5079],{"class":262},"maxRetries",[173,5081,943],{"class":208},[173,5083,5084],{"class":334}," 3",[173,5086,271],{"class":239},[173,5088,5089,5092,5095,5098,5101,5103,5106,5109,5112,5115,5118],{"class":175,"line":183},[173,5090,5091],{"class":208},"  for",[173,5093,5094],{"class":239}," (",[173,5096,5097],{"class":208},"let",[173,5099,5100],{"class":239}," attempt ",[173,5102,2581],{"class":208},[173,5104,5105],{"class":334}," 1",[173,5107,5108],{"class":239},"; attempt ",[173,5110,5111],{"class":208},"\u003C=",[173,5113,5114],{"class":239}," maxRetries; attempt",[173,5116,5117],{"class":208},"++",[173,5119,271],{"class":239},[173,5121,5122,5125],{"class":175,"line":189},[173,5123,5124],{"class":208},"    try",[173,5126,946],{"class":239},[173,5128,5129,5132,5135,5137,5140,5143,5146],{"class":175,"line":196},[173,5130,5131],{"class":208},"      const",[173,5133,5134],{"class":334}," result",[173,5136,943],{"class":208},[173,5138,5139],{"class":208}," await",[173,5141,5142],{"class":239}," paymentGateway.",[173,5144,5145],{"class":235},"charge",[173,5147,5148],{"class":239},"(paymentData);\n",[173,5150,5151,5153],{"class":175,"line":202},[173,5152,3161],{"class":208},[173,5154,5155],{"class":239}," result;\n",[173,5157,5158,5161,5163],{"class":175,"line":215},[173,5159,5160],{"class":239},"    } ",[173,5162,3969],{"class":208},[173,5164,5165],{"class":239}," (error) {\n",[173,5167,5168,5171,5174,5177,5180,5183,5185,5188],{"class":175,"line":226},[173,5169,5170],{"class":208},"      if",[173,5172,5173],{"class":239}," (error.code ",[173,5175,5176],{"class":208},"===",[173,5178,5179],{"class":243}," 'TIMEOUT'",[173,5181,5182],{"class":208}," &&",[173,5184,5100],{"class":239},[173,5186,5187],{"class":208},"\u003C",[173,5189,5190],{"class":239}," maxRetries) {\n",[173,5192,5193],{"class":175,"line":232},[173,5194,5195],{"class":179},"        \u002F\u002F Exponential backoff: 1s, 2s, 4s\n",[173,5197,5198,5201,5204,5207,5210,5212,5215,5218,5221,5223,5226,5228,5231],{"class":175,"line":274},[173,5199,5200],{"class":208},"        await",[173,5202,5203],{"class":235}," sleep",[173,5205,5206],{"class":239},"(Math.",[173,5208,5209],{"class":235},"pow",[173,5211,259],{"class":239},[173,5213,5214],{"class":334},"2",[173,5216,5217],{"class":239},", attempt ",[173,5219,5220],{"class":208},"-",[173,5222,5105],{"class":334},[173,5224,5225],{"class":239},") ",[173,5227,1690],{"class":208},[173,5229,5230],{"class":334}," 1000",[173,5232,2161],{"class":239},[173,5234,5235,5238],{"class":175,"line":280},[173,5236,5237],{"class":208},"        continue",[173,5239,1139],{"class":239},[173,5241,5242],{"class":175,"line":1710},[173,5243,1581],{"class":239},[173,5245,5246,5249],{"class":175,"line":1716},[173,5247,5248],{"class":208},"      throw",[173,5250,5251],{"class":239}," error;\n",[173,5253,5254],{"class":175,"line":1721},[173,5255,984],{"class":239},[173,5257,5258],{"class":175,"line":1726},[173,5259,549],{"class":239},[173,5261,5262],{"class":175,"line":1731},[173,5263,554],{"class":239},[15,5265,5266],{},"Step 3: Implement payment status check",[129,5268,5270],{"className":167,"code":5269,"language":169,"meta":138,"style":138},"\u002F\u002F If timeout occurs, check if payment actually succeeded\nasync function verifyPaymentStatus(transactionId) {\n  const status = await paymentGateway.getTransaction(transactionId);\n  \n  if (status.state === 'COMPLETED') {\n    \u002F\u002F Payment succeeded despite timeout\n    return { success: true, captured: true };\n  } else if (status.state === 'PENDING') {\n    \u002F\u002F Payment in progress\n    return { success: false, pending: true };\n  } else {\n    \u002F\u002F Payment failed\n    return { success: false, captured: false };\n  }\n}\n",[136,5271,5272,5277,5293,5313,5317,5332,5337,5355,5375,5380,5396,5404,5409,5423,5427],{"__ignoreMap":138},[173,5273,5274],{"class":175,"line":176},[173,5275,5276],{"class":179},"\u002F\u002F If timeout occurs, check if payment actually succeeded\n",[173,5278,5279,5281,5283,5286,5288,5291],{"class":175,"line":183},[173,5280,5063],{"class":208},[173,5282,5066],{"class":208},[173,5284,5285],{"class":235}," verifyPaymentStatus",[173,5287,259],{"class":239},[173,5289,5290],{"class":262},"transactionId",[173,5292,271],{"class":239},[173,5294,5295,5298,5301,5303,5305,5307,5310],{"class":175,"line":189},[173,5296,5297],{"class":208},"  const",[173,5299,5300],{"class":334}," status",[173,5302,943],{"class":208},[173,5304,5139],{"class":208},[173,5306,5142],{"class":239},[173,5308,5309],{"class":235},"getTransaction",[173,5311,5312],{"class":239},"(transactionId);\n",[173,5314,5315],{"class":175,"line":196},[173,5316,1850],{"class":239},[173,5318,5319,5322,5325,5327,5330],{"class":175,"line":202},[173,5320,5321],{"class":208},"  if",[173,5323,5324],{"class":239}," (status.state ",[173,5326,5176],{"class":208},[173,5328,5329],{"class":243}," 'COMPLETED'",[173,5331,271],{"class":239},[173,5333,5334],{"class":175,"line":215},[173,5335,5336],{"class":179},"    \u002F\u002F Payment succeeded despite timeout\n",[173,5338,5339,5341,5344,5347,5350,5352],{"class":175,"line":226},[173,5340,1910],{"class":208},[173,5342,5343],{"class":239}," { success: ",[173,5345,5346],{"class":334},"true",[173,5348,5349],{"class":239},", captured: ",[173,5351,5346],{"class":334},[173,5353,5354],{"class":239}," };\n",[173,5356,5357,5360,5363,5366,5368,5370,5373],{"class":175,"line":232},[173,5358,5359],{"class":239},"  } ",[173,5361,5362],{"class":208},"else",[173,5364,5365],{"class":208}," if",[173,5367,5324],{"class":239},[173,5369,5176],{"class":208},[173,5371,5372],{"class":243}," 'PENDING'",[173,5374,271],{"class":239},[173,5376,5377],{"class":175,"line":274},[173,5378,5379],{"class":179},"    \u002F\u002F Payment in progress\n",[173,5381,5382,5384,5386,5389,5392,5394],{"class":175,"line":280},[173,5383,1910],{"class":208},[173,5385,5343],{"class":239},[173,5387,5388],{"class":334},"false",[173,5390,5391],{"class":239},", pending: ",[173,5393,5346],{"class":334},[173,5395,5354],{"class":239},[173,5397,5398,5400,5402],{"class":175,"line":1710},[173,5399,5359],{"class":239},[173,5401,5362],{"class":208},[173,5403,946],{"class":239},[173,5405,5406],{"class":175,"line":1716},[173,5407,5408],{"class":179},"    \u002F\u002F Payment failed\n",[173,5410,5411,5413,5415,5417,5419,5421],{"class":175,"line":1721},[173,5412,1910],{"class":208},[173,5414,5343],{"class":239},[173,5416,5388],{"class":334},[173,5418,5349],{"class":239},[173,5420,5388],{"class":334},[173,5422,5354],{"class":239},[173,5424,5425],{"class":175,"line":1726},[173,5426,549],{"class":239},[173,5428,5429],{"class":175,"line":1731},[173,5430,554],{"class":239},[15,5432,5433],{},"Step 4: Increase timeout for slow gateways",[129,5435,5437],{"className":167,"code":5436,"language":169,"meta":138,"style":138},"\u002F\u002F In your payment integration configuration\nvar gatewayConfig = {\n  timeout: 60000,  \u002F\u002F 60 seconds instead of default 30\n  retries: 2,\n  \u002F\u002F Ensure your server supports this timeout\n};\n",[136,5438,5439,5444,5455,5468,5477,5482],{"__ignoreMap":138},[173,5440,5441],{"class":175,"line":176},[173,5442,5443],{"class":179},"\u002F\u002F In your payment integration configuration\n",[173,5445,5446,5448,5451,5453],{"class":175,"line":183},[173,5447,2575],{"class":208},[173,5449,5450],{"class":239}," gatewayConfig ",[173,5452,2581],{"class":208},[173,5454,946],{"class":239},[173,5456,5457,5460,5463,5465],{"class":175,"line":189},[173,5458,5459],{"class":239},"  timeout: ",[173,5461,5462],{"class":334},"60000",[173,5464,531],{"class":239},[173,5466,5467],{"class":179},"\u002F\u002F 60 seconds instead of default 30\n",[173,5469,5470,5473,5475],{"class":175,"line":196},[173,5471,5472],{"class":239},"  retries: ",[173,5474,5214],{"class":334},[173,5476,518],{"class":239},[173,5478,5479],{"class":175,"line":202},[173,5480,5481],{"class":179},"  \u002F\u002F Ensure your server supports this timeout\n",[173,5483,5484],{"class":175,"line":215},[173,5485,993],{"class":239},[15,5487,5488],{},[109,5489,411],{},[30,5491,5492,5495,5498,5501],{},[33,5493,5494],{},"Use idempotency keys for all payment requests",[33,5496,5497],{},"Implement comprehensive payment status checking",[33,5499,5500],{},"Log all payment attempts for reconciliation",[33,5502,5503],{},"Set up alerts for gateway timeout spikes",[89,5505],{},[102,5507,5509],{"id":5508},"error-13-payment-failed-invalid-card-token","Error #13: \"Payment Failed: Invalid Card Token\"",[15,5511,5512],{},[109,5513,111],{},[30,5515,5516,5519,5522],{},[33,5517,5518],{},"Customer enters card, payment fails immediately",[33,5520,5521],{},"Error occurs before gateway is contacted",[33,5523,5524],{},"Works for some customers, fails for others",[15,5526,5527],{},[109,5528,127],{},[129,5530,5533],{"className":5531,"code":5532,"language":134},[132],"INVALID_TOKEN\nPayment token has expired or is invalid\nToken: tok_xxxxxx\n",[136,5534,5532],{"__ignoreMap":138},[15,5536,5537,5539],{},[109,5538,143],{},"\nThe payment token (from client-side tokenization) expired before the order was submitted. This happens when customers take too long at checkout or when there's a token\u002Fsession mismatch.",[15,5541,5542],{},[109,5543,161],{},[15,5545,5546],{},"Step 1: Verify token lifecycle",[129,5548,5550],{"className":167,"code":5549,"language":169,"meta":138,"style":138},"\u002F\u002F Tokens typically expire in 10-15 minutes\n\u002F\u002F Check when token was created vs. when order is submitted\n\nvar tokenCreatedAt = paymentForm.getTokenTimestamp();\nvar now = Date.now();\nvar tokenAge = (now - tokenCreatedAt) \u002F 1000 \u002F 60; \u002F\u002F minutes\n\nif (tokenAge > 10) {\n  \u002F\u002F Token likely expired, request new one\n  paymentForm.reTokenize();\n}\n",[136,5551,5552,5557,5562,5566,5583,5597,5629,5633,5649,5654,5664],{"__ignoreMap":138},[173,5553,5554],{"class":175,"line":176},[173,5555,5556],{"class":179},"\u002F\u002F Tokens typically expire in 10-15 minutes\n",[173,5558,5559],{"class":175,"line":183},[173,5560,5561],{"class":179},"\u002F\u002F Check when token was created vs. when order is submitted\n",[173,5563,5564],{"class":175,"line":189},[173,5565,193],{"emptyLinePlaceholder":192},[173,5567,5568,5570,5573,5575,5578,5581],{"class":175,"line":196},[173,5569,2575],{"class":208},[173,5571,5572],{"class":239}," tokenCreatedAt ",[173,5574,2581],{"class":208},[173,5576,5577],{"class":239}," paymentForm.",[173,5579,5580],{"class":235},"getTokenTimestamp",[173,5582,2802],{"class":239},[173,5584,5585,5587,5589,5591,5593,5595],{"class":175,"line":202},[173,5586,2575],{"class":208},[173,5588,4837],{"class":239},[173,5590,2581],{"class":208},[173,5592,4981],{"class":239},[173,5594,4984],{"class":235},[173,5596,2802],{"class":239},[173,5598,5599,5601,5604,5606,5609,5611,5614,5616,5618,5620,5623,5626],{"class":175,"line":215},[173,5600,2575],{"class":208},[173,5602,5603],{"class":239}," tokenAge ",[173,5605,2581],{"class":208},[173,5607,5608],{"class":239}," (now ",[173,5610,5220],{"class":208},[173,5612,5613],{"class":239}," tokenCreatedAt) ",[173,5615,1657],{"class":208},[173,5617,5230],{"class":334},[173,5619,1643],{"class":208},[173,5621,5622],{"class":334}," 60",[173,5624,5625],{"class":239},"; ",[173,5627,5628],{"class":179},"\u002F\u002F minutes\n",[173,5630,5631],{"class":175,"line":226},[173,5632,193],{"emptyLinePlaceholder":192},[173,5634,5635,5638,5641,5644,5647],{"class":175,"line":232},[173,5636,5637],{"class":208},"if",[173,5639,5640],{"class":239}," (tokenAge ",[173,5642,5643],{"class":208},">",[173,5645,5646],{"class":334}," 10",[173,5648,271],{"class":239},[173,5650,5651],{"class":175,"line":274},[173,5652,5653],{"class":179},"  \u002F\u002F Token likely expired, request new one\n",[173,5655,5656,5659,5662],{"class":175,"line":280},[173,5657,5658],{"class":239},"  paymentForm.",[173,5660,5661],{"class":235},"reTokenize",[173,5663,2802],{"class":239},[173,5665,5666],{"class":175,"line":1710},[173,5667,554],{"class":239},[15,5669,5670],{},"Step 2: Implement pre-submit token validation",[129,5672,5674],{"className":167,"code":5673,"language":169,"meta":138,"style":138},"\u002F\u002F Before submitting order, verify token is still valid\nasync function validateTokenBeforeSubmit(token) {\n  try {\n    const validation = await paymentGateway.validateToken(token);\n    return validation.valid;\n  } catch (e) {\n    \u002F\u002F Token invalid, need new one\n    return false;\n  }\n}\n\n\u002F\u002F In checkout flow\nvar submitOrder = async function() {\n  var token = this.model.get('paymentToken');\n  \n  if (!await validateTokenBeforeSubmit(token)) {\n    \u002F\u002F Show message and re-collect payment\n    this.showMessage('Please re-enter your payment information.');\n    this.reloadPaymentForm();\n    return;\n  }\n  \n  \u002F\u002F Proceed with order\n  this.model.submit();\n};\n",[136,5675,5676,5681,5697,5704,5723,5730,5738,5743,5752,5756,5760,5764,5769,5785,5809,5813,5827,5832,5848,5859,5865,5869,5873,5878,5889],{"__ignoreMap":138},[173,5677,5678],{"class":175,"line":176},[173,5679,5680],{"class":179},"\u002F\u002F Before submitting order, verify token is still valid\n",[173,5682,5683,5685,5687,5690,5692,5695],{"class":175,"line":183},[173,5684,5063],{"class":208},[173,5686,5066],{"class":208},[173,5688,5689],{"class":235}," validateTokenBeforeSubmit",[173,5691,259],{"class":239},[173,5693,5694],{"class":262},"token",[173,5696,271],{"class":239},[173,5698,5699,5702],{"class":175,"line":189},[173,5700,5701],{"class":208},"  try",[173,5703,946],{"class":239},[173,5705,5706,5708,5711,5713,5715,5717,5720],{"class":175,"line":196},[173,5707,1889],{"class":208},[173,5709,5710],{"class":334}," validation",[173,5712,943],{"class":208},[173,5714,5139],{"class":208},[173,5716,5142],{"class":239},[173,5718,5719],{"class":235},"validateToken",[173,5721,5722],{"class":239},"(token);\n",[173,5724,5725,5727],{"class":175,"line":202},[173,5726,1910],{"class":208},[173,5728,5729],{"class":239}," validation.valid;\n",[173,5731,5732,5734,5736],{"class":175,"line":215},[173,5733,5359],{"class":239},[173,5735,3969],{"class":208},[173,5737,3972],{"class":239},[173,5739,5740],{"class":175,"line":226},[173,5741,5742],{"class":179},"    \u002F\u002F Token invalid, need new one\n",[173,5744,5745,5747,5750],{"class":175,"line":232},[173,5746,1910],{"class":208},[173,5748,5749],{"class":334}," false",[173,5751,1139],{"class":239},[173,5753,5754],{"class":175,"line":274},[173,5755,549],{"class":239},[173,5757,5758],{"class":175,"line":280},[173,5759,554],{"class":239},[173,5761,5762],{"class":175,"line":1710},[173,5763,193],{"emptyLinePlaceholder":192},[173,5765,5766],{"class":175,"line":1716},[173,5767,5768],{"class":179},"\u002F\u002F In checkout flow\n",[173,5770,5771,5773,5776,5778,5781,5783],{"class":175,"line":1721},[173,5772,2575],{"class":208},[173,5774,5775],{"class":235}," submitOrder",[173,5777,943],{"class":208},[173,5779,5780],{"class":208}," async",[173,5782,5066],{"class":208},[173,5784,812],{"class":239},[173,5786,5787,5789,5792,5794,5796,5799,5802,5804,5807],{"class":175,"line":1726},[173,5788,3264],{"class":208},[173,5790,5791],{"class":239}," token ",[173,5793,2581],{"class":208},[173,5795,2872],{"class":334},[173,5797,5798],{"class":239},".model.",[173,5800,5801],{"class":235},"get",[173,5803,259],{"class":239},[173,5805,5806],{"class":243},"'paymentToken'",[173,5808,2161],{"class":239},[173,5810,5811],{"class":175,"line":1731},[173,5812,1850],{"class":239},[173,5814,5815,5817,5819,5822,5824],{"class":175,"line":1957},[173,5816,5321],{"class":208},[173,5818,5094],{"class":239},[173,5820,5821],{"class":208},"!await",[173,5823,5689],{"class":235},[173,5825,5826],{"class":239},"(token)) {\n",[173,5828,5829],{"class":175,"line":1969},[173,5830,5831],{"class":179},"    \u002F\u002F Show message and re-collect payment\n",[173,5833,5834,5836,5838,5841,5843,5846],{"class":175,"line":1975},[173,5835,2864],{"class":334},[173,5837,937],{"class":239},[173,5839,5840],{"class":235},"showMessage",[173,5842,259],{"class":239},[173,5844,5845],{"class":243},"'Please re-enter your payment information.'",[173,5847,2161],{"class":239},[173,5849,5850,5852,5854,5857],{"class":175,"line":1981},[173,5851,2864],{"class":334},[173,5853,937],{"class":239},[173,5855,5856],{"class":235},"reloadPaymentForm",[173,5858,2802],{"class":239},[173,5860,5861,5863],{"class":175,"line":3357},[173,5862,1910],{"class":208},[173,5864,1139],{"class":239},[173,5866,5867],{"class":175,"line":3365},[173,5868,549],{"class":239},[173,5870,5871],{"class":175,"line":3923},[173,5872,1850],{"class":239},[173,5874,5875],{"class":175,"line":3929},[173,5876,5877],{"class":179},"  \u002F\u002F Proceed with order\n",[173,5879,5880,5882,5884,5887],{"class":175,"line":3935},[173,5881,2794],{"class":334},[173,5883,5798],{"class":239},[173,5885,5886],{"class":235},"submit",[173,5888,2802],{"class":239},[173,5890,5891],{"class":175,"line":3946},[173,5892,993],{"class":239},[15,5894,5895],{},"Step 3: Handle session timeout gracefully",[129,5897,5899],{"className":167,"code":5898,"language":169,"meta":138,"style":138},"\u002F\u002F Show warning before token expires\nvar tokenWarningTimer = setTimeout(function() {\n  showMessage('Your session is about to expire. Please complete your purchase.');\n}, 8 * 60 * 1000); \u002F\u002F 8 minutes\n\nvar tokenExpireTimer = setTimeout(function() {\n  showMessage('Session expired. Please refresh to continue.');\n  disableSubmitButton();\n}, 12 * 60 * 1000); \u002F\u002F 12 minutes\n",[136,5900,5901,5906,5924,5936,5959,5963,5980,5991,5998],{"__ignoreMap":138},[173,5902,5903],{"class":175,"line":176},[173,5904,5905],{"class":179},"\u002F\u002F Show warning before token expires\n",[173,5907,5908,5910,5913,5915,5918,5920,5922],{"class":175,"line":183},[173,5909,2575],{"class":208},[173,5911,5912],{"class":239}," tokenWarningTimer ",[173,5914,2581],{"class":208},[173,5916,5917],{"class":235}," setTimeout",[173,5919,259],{"class":239},[173,5921,256],{"class":208},[173,5923,812],{"class":239},[173,5925,5926,5929,5931,5934],{"class":175,"line":189},[173,5927,5928],{"class":235},"  showMessage",[173,5930,259],{"class":239},[173,5932,5933],{"class":243},"'Your session is about to expire. Please complete your purchase.'",[173,5935,2161],{"class":239},[173,5937,5938,5941,5944,5947,5949,5951,5953,5956],{"class":175,"line":196},[173,5939,5940],{"class":239},"}, ",[173,5942,5943],{"class":334},"8",[173,5945,5946],{"class":208}," *",[173,5948,5622],{"class":334},[173,5950,5946],{"class":208},[173,5952,5230],{"class":334},[173,5954,5955],{"class":239},"); ",[173,5957,5958],{"class":179},"\u002F\u002F 8 minutes\n",[173,5960,5961],{"class":175,"line":202},[173,5962,193],{"emptyLinePlaceholder":192},[173,5964,5965,5967,5970,5972,5974,5976,5978],{"class":175,"line":215},[173,5966,2575],{"class":208},[173,5968,5969],{"class":239}," tokenExpireTimer ",[173,5971,2581],{"class":208},[173,5973,5917],{"class":235},[173,5975,259],{"class":239},[173,5977,256],{"class":208},[173,5979,812],{"class":239},[173,5981,5982,5984,5986,5989],{"class":175,"line":226},[173,5983,5928],{"class":235},[173,5985,259],{"class":239},[173,5987,5988],{"class":243},"'Session expired. Please refresh to continue.'",[173,5990,2161],{"class":239},[173,5992,5993,5996],{"class":175,"line":232},[173,5994,5995],{"class":235},"  disableSubmitButton",[173,5997,2802],{"class":239},[173,5999,6000,6002,6005,6007,6009,6011,6013,6015],{"class":175,"line":274},[173,6001,5940],{"class":239},[173,6003,6004],{"class":334},"12",[173,6006,5946],{"class":208},[173,6008,5622],{"class":334},[173,6010,5946],{"class":208},[173,6012,5230],{"class":334},[173,6014,5955],{"class":239},[173,6016,6017],{"class":179},"\u002F\u002F 12 minutes\n",[15,6019,6020],{},[109,6021,411],{},[30,6023,6024,6027,6030,6033],{},[33,6025,6026],{},"Keep checkout flow fast (reduce friction)",[33,6028,6029],{},"Show session expiration warnings",[33,6031,6032],{},"Implement automatic token refresh",[33,6034,6035],{},"Log token age at submission for analytics",[89,6037],{},[25,6039,69],{"id":6040},"performance-degradation",[15,6042,6043],{},[97,6044],{"alt":6045,"src":6046},"Developer problem solving and technical support","\u002Fimages\u002Fblog\u002Ftroubleshooting-errors-problem-solving.webp",[102,6048,6050],{"id":6049},"error-14-page-load-timeout-resource-loading-failed","Error #14: \"Page Load Timeout: Resource Loading Failed\"",[15,6052,6053],{},[109,6054,111],{},[30,6056,6057,6060,6063],{},[33,6058,6059],{},"Pages load slowly or partially",[33,6061,6062],{},"Browser shows \"resource loading failed\" errors",[33,6064,6065],{},"Performance degrades over time",[15,6067,6068],{},[109,6069,6070],{},"Error Message (Browser Console):",[129,6072,6075],{"className":6073,"code":6074,"language":134},[132],"Failed to load resource: net::ERR_TIMED_OUT\nGET https:\u002F\u002Fyourstore.com\u002Fasset\u002Flarge-bundle.js\n",[136,6076,6074],{"__ignoreMap":138},[15,6078,6079,6081],{},[109,6080,143],{},"\nJavaScript bundles are too large, CDN is misconfigured, or server response times have degraded.",[15,6083,6084],{},[109,6085,161],{},[15,6087,6088],{},"Step 1: Analyze bundle size",[129,6090,6092],{"className":298,"code":6091,"language":300,"meta":138,"style":138},"# Using webpack-bundle-analyzer\nnpm install --save-dev webpack-bundle-analyzer\n\n# Add to webpack config\nconst BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;\n\nmodule.exports = {\n  plugins: [\n    new BundleAnalyzerPlugin()\n  ]\n};\n\n# Run build and analyze\nnpm run build\n",[136,6093,6094,6099,6112,6116,6121,6146,6150,6159,6167,6177,6181,6185,6189,6194],{"__ignoreMap":138},[173,6095,6096],{"class":175,"line":176},[173,6097,6098],{"class":179},"# Using webpack-bundle-analyzer\n",[173,6100,6101,6103,6106,6109],{"class":175,"line":183},[173,6102,400],{"class":235},[173,6104,6105],{"class":243}," install",[173,6107,6108],{"class":334}," --save-dev",[173,6110,6111],{"class":243}," webpack-bundle-analyzer\n",[173,6113,6114],{"class":175,"line":189},[173,6115,193],{"emptyLinePlaceholder":192},[173,6117,6118],{"class":175,"line":196},[173,6119,6120],{"class":179},"# Add to webpack config\n",[173,6122,6123,6126,6129,6131,6134,6136,6139,6141,6144],{"class":175,"line":202},[173,6124,6125],{"class":235},"const",[173,6127,6128],{"class":243}," BundleAnalyzerPlugin",[173,6130,943],{"class":243},[173,6132,6133],{"class":243}," require",[173,6135,259],{"class":239},[173,6137,6138],{"class":235},"'webpack-bundle-analyzer'",[173,6140,1685],{"class":239},[173,6142,6143],{"class":243},".BundleAnalyzerPlugin",[173,6145,1139],{"class":239},[173,6147,6148],{"class":175,"line":215},[173,6149,193],{"emptyLinePlaceholder":192},[173,6151,6152,6155,6157],{"class":175,"line":226},[173,6153,6154],{"class":235},"module.exports",[173,6156,943],{"class":243},[173,6158,946],{"class":243},[173,6160,6161,6164],{"class":175,"line":232},[173,6162,6163],{"class":235},"  plugins:",[173,6165,6166],{"class":239}," [\n",[173,6168,6169,6172,6174],{"class":175,"line":274},[173,6170,6171],{"class":235},"    new",[173,6173,6128],{"class":243},[173,6175,6176],{"class":239},"()\n",[173,6178,6179],{"class":175,"line":280},[173,6180,1591],{"class":239},[173,6182,6183],{"class":175,"line":1710},[173,6184,993],{"class":239},[173,6186,6187],{"class":175,"line":1716},[173,6188,193],{"emptyLinePlaceholder":192},[173,6190,6191],{"class":175,"line":1721},[173,6192,6193],{"class":179},"# Run build and analyze\n",[173,6195,6196,6198,6200],{"class":175,"line":1726},[173,6197,400],{"class":235},[173,6199,403],{"class":243},[173,6201,6202],{"class":243}," build\n",[15,6204,6205],{},"Step 2: Implement code splitting",[129,6207,6209],{"className":167,"code":6208,"language":169,"meta":138,"style":138},"\u002F\u002F Lazy load non-critical modules\ndefine([\n  'require'  \u002F\u002F RequireJS require for dynamic loading\n], function(require) {\n  \n  \u002F\u002F Load Product Configurator only when needed\n  function loadConfigurator(callback) {\n    require(['ProductConfigurator.View'], function(ConfiguratorView) {\n      callback(ConfiguratorView);\n    });\n  }\n  \n  \u002F\u002F Usage\n  $('[data-action=\"configure\"]').on('click', function() {\n    loadConfigurator(function(ConfiguratorView) {\n      new ConfiguratorView().render();\n    });\n  });\n});\n",[136,6210,6211,6216,6222,6230,6243,6247,6252,6266,6286,6294,6298,6302,6306,6311,6336,6351,6365,6369,6373],{"__ignoreMap":138},[173,6212,6213],{"class":175,"line":176},[173,6214,6215],{"class":179},"\u002F\u002F Lazy load non-critical modules\n",[173,6217,6218,6220],{"class":175,"line":183},[173,6219,236],{"class":235},[173,6221,1820],{"class":239},[173,6223,6224,6227],{"class":175,"line":189},[173,6225,6226],{"class":243},"  'require'",[173,6228,6229],{"class":179},"  \u002F\u002F RequireJS require for dynamic loading\n",[173,6231,6232,6234,6236,6238,6241],{"class":175,"line":196},[173,6233,253],{"class":239},[173,6235,256],{"class":208},[173,6237,259],{"class":239},[173,6239,6240],{"class":262},"require",[173,6242,271],{"class":239},[173,6244,6245],{"class":175,"line":202},[173,6246,1850],{"class":239},[173,6248,6249],{"class":175,"line":215},[173,6250,6251],{"class":179},"  \u002F\u002F Load Product Configurator only when needed\n",[173,6253,6254,6256,6259,6261,6264],{"class":175,"line":226},[173,6255,3752],{"class":208},[173,6257,6258],{"class":235}," loadConfigurator",[173,6260,259],{"class":239},[173,6262,6263],{"class":262},"callback",[173,6265,271],{"class":239},[173,6267,6268,6271,6273,6275,6277,6279,6281,6284],{"class":175,"line":232},[173,6269,6270],{"class":235},"    require",[173,6272,240],{"class":239},[173,6274,2318],{"class":243},[173,6276,253],{"class":239},[173,6278,256],{"class":208},[173,6280,259],{"class":239},[173,6282,6283],{"class":262},"ConfiguratorView",[173,6285,271],{"class":239},[173,6287,6288,6291],{"class":175,"line":274},[173,6289,6290],{"class":235},"      callback",[173,6292,6293],{"class":239},"(ConfiguratorView);\n",[173,6295,6296],{"class":175,"line":280},[173,6297,3852],{"class":239},[173,6299,6300],{"class":175,"line":1710},[173,6301,549],{"class":239},[173,6303,6304],{"class":175,"line":1716},[173,6305,1850],{"class":239},[173,6307,6308],{"class":175,"line":1721},[173,6309,6310],{"class":179},"  \u002F\u002F Usage\n",[173,6312,6313,6316,6318,6321,6324,6326,6328,6330,6332,6334],{"class":175,"line":1726},[173,6314,6315],{"class":235},"  $",[173,6317,259],{"class":239},[173,6319,6320],{"class":243},"'[data-action=\"configure\"]'",[173,6322,6323],{"class":239},").",[173,6325,2667],{"class":235},[173,6327,259],{"class":239},[173,6329,2773],{"class":243},[173,6331,247],{"class":239},[173,6333,256],{"class":208},[173,6335,812],{"class":239},[173,6337,6338,6341,6343,6345,6347,6349],{"class":175,"line":1731},[173,6339,6340],{"class":235},"    loadConfigurator",[173,6342,259],{"class":239},[173,6344,256],{"class":208},[173,6346,259],{"class":239},[173,6348,6283],{"class":262},[173,6350,271],{"class":239},[173,6352,6353,6355,6358,6360,6363],{"class":175,"line":1957},[173,6354,1926],{"class":208},[173,6356,6357],{"class":235}," ConfiguratorView",[173,6359,3867],{"class":239},[173,6361,6362],{"class":235},"render",[173,6364,2802],{"class":239},[173,6366,6367],{"class":175,"line":1969},[173,6368,3852],{"class":239},[173,6370,6371],{"class":175,"line":1975},[173,6372,1978],{"class":239},[173,6374,6375],{"class":175,"line":1981},[173,6376,283],{"class":239},[15,6378,6379],{},"Step 3: Verify CDN configuration",[129,6381,6383],{"className":298,"code":6382,"language":300,"meta":138,"style":138},"# Check CDN headers\ncurl -I https:\u002F\u002Fyourstore.com\u002Fasset\u002Fmain.js\n\n# Should see:\n# Cache-Control: public, max-age=31536000\n# Content-Encoding: gzip (or br for Brotli)\n# X-Cache: Hit from CDN\n",[136,6384,6385,6390,6401,6405,6410,6415,6420],{"__ignoreMap":138},[173,6386,6387],{"class":175,"line":176},[173,6388,6389],{"class":179},"# Check CDN headers\n",[173,6391,6392,6395,6398],{"class":175,"line":183},[173,6393,6394],{"class":235},"curl",[173,6396,6397],{"class":334}," -I",[173,6399,6400],{"class":243}," https:\u002F\u002Fyourstore.com\u002Fasset\u002Fmain.js\n",[173,6402,6403],{"class":175,"line":189},[173,6404,193],{"emptyLinePlaceholder":192},[173,6406,6407],{"class":175,"line":196},[173,6408,6409],{"class":179},"# Should see:\n",[173,6411,6412],{"class":175,"line":202},[173,6413,6414],{"class":179},"# Cache-Control: public, max-age=31536000\n",[173,6416,6417],{"class":175,"line":215},[173,6418,6419],{"class":179},"# Content-Encoding: gzip (or br for Brotli)\n",[173,6421,6422],{"class":175,"line":226},[173,6423,6424],{"class":179},"# X-Cache: Hit from CDN\n",[15,6426,6427],{},"Step 4: Optimize critical rendering path",[129,6429,6431],{"className":167,"code":6430,"language":169,"meta":138,"style":138},"\u002F\u002F Prioritize above-the-fold content\n\u002F\u002F In your main entry point\n\n\u002F\u002F Load critical CSS inline\n\u003Cstyle>\n  \u002F* Critical CSS for above-fold content *\u002F\n  .header { \u002F* ... *\u002F }\n  .hero { \u002F* ... *\u002F }\n\u003C\u002Fstyle>\n\n\u002F\u002F Defer non-critical CSS\n\u003Clink rel=\"preload\" href=\"full-styles.css\" as=\"style\" onload=\"this.rel='stylesheet'\">\n\n\u002F\u002F Async load non-critical JS\n\u003Cscript src=\"analytics.js\" async>\u003C\u002Fscript>\n",[136,6432,6433,6438,6443,6447,6452,6463,6468,6479,6488,6497,6501,6506,6546,6550,6555],{"__ignoreMap":138},[173,6434,6435],{"class":175,"line":176},[173,6436,6437],{"class":179},"\u002F\u002F Prioritize above-the-fold content\n",[173,6439,6440],{"class":175,"line":183},[173,6441,6442],{"class":179},"\u002F\u002F In your main entry point\n",[173,6444,6445],{"class":175,"line":189},[173,6446,193],{"emptyLinePlaceholder":192},[173,6448,6449],{"class":175,"line":196},[173,6450,6451],{"class":179},"\u002F\u002F Load critical CSS inline\n",[173,6453,6454,6456,6460],{"class":175,"line":202},[173,6455,5187],{"class":239},[173,6457,6459],{"class":6458},"s9eBZ","style",[173,6461,6462],{"class":239},">\n",[173,6464,6465],{"class":175,"line":215},[173,6466,6467],{"class":239},"  \u002F* Critical CSS for above-fold content *\u002F\n",[173,6469,6470,6473,6476],{"class":175,"line":226},[173,6471,6472],{"class":239},"  .header { ",[173,6474,6475],{"class":179},"\u002F* ... *\u002F",[173,6477,6478],{"class":239}," }\n",[173,6480,6481,6484,6486],{"class":175,"line":232},[173,6482,6483],{"class":239},"  .hero { ",[173,6485,6475],{"class":179},[173,6487,6478],{"class":239},[173,6489,6490,6493,6495],{"class":175,"line":274},[173,6491,6492],{"class":239},"\u003C\u002F",[173,6494,6459],{"class":6458},[173,6496,6462],{"class":239},[173,6498,6499],{"class":175,"line":280},[173,6500,193],{"emptyLinePlaceholder":192},[173,6502,6503],{"class":175,"line":1710},[173,6504,6505],{"class":179},"\u002F\u002F Defer non-critical CSS\n",[173,6507,6508,6510,6513,6516,6518,6521,6524,6526,6529,6531,6533,6536,6539,6541,6544],{"class":175,"line":1716},[173,6509,5187],{"class":239},[173,6511,6512],{"class":6458},"link",[173,6514,6515],{"class":235}," rel",[173,6517,2581],{"class":208},[173,6519,6520],{"class":243},"\"preload\"",[173,6522,6523],{"class":235}," href",[173,6525,2581],{"class":208},[173,6527,6528],{"class":243},"\"full-styles.css\"",[173,6530,1278],{"class":235},[173,6532,2581],{"class":208},[173,6534,6535],{"class":243},"\"style\"",[173,6537,6538],{"class":235}," onload",[173,6540,2581],{"class":208},[173,6542,6543],{"class":243},"\"this.rel='stylesheet'\"",[173,6545,6462],{"class":239},[173,6547,6548],{"class":175,"line":1721},[173,6549,193],{"emptyLinePlaceholder":192},[173,6551,6552],{"class":175,"line":1726},[173,6553,6554],{"class":239},"\u002F\u002F Async load non-critical JS\n",[173,6556,6557,6559,6562,6565,6567,6570,6572,6575,6577],{"class":175,"line":1731},[173,6558,5187],{"class":239},[173,6560,6561],{"class":6458},"script",[173,6563,6564],{"class":235}," src",[173,6566,2581],{"class":208},[173,6568,6569],{"class":243},"\"analytics.js\"",[173,6571,5780],{"class":235},[173,6573,6574],{"class":239},">\u003C\u002F",[173,6576,6561],{"class":6458},[173,6578,6462],{"class":239},[15,6580,6581],{},[109,6582,411],{},[30,6584,6585,6588,6591,6594],{},[33,6586,6587],{},"Set performance budgets (e.g., main bundle \u003C 500KB)",[33,6589,6590],{},"Monitor Core Web Vitals continuously",[33,6592,6593],{},"Use lazy loading for below-fold content",[33,6595,6596],{},"Regular performance audits",[89,6598],{},[102,6600,6602],{"id":6601},"error-15-memory-leak-page-becomes-unresponsive","Error #15: \"Memory Leak: Page Becomes Unresponsive\"",[15,6604,6605],{},[109,6606,111],{},[30,6608,6609,6612,6615],{},[33,6610,6611],{},"Site slows down the longer customer browses",[33,6613,6614],{},"Browser tab eventually crashes",[33,6616,6617],{},"Memory usage grows continuously in DevTools",[15,6619,6620],{},[109,6621,127],{},[129,6623,6626],{"className":6624,"code":6625,"language":134},[132],"Browser: Page Unresponsive\nThe page may have become unresponsive due to a running script\n",[136,6627,6625],{"__ignoreMap":138},[15,6629,6630,6632],{},[109,6631,143],{},"\nJavaScript memory leaks from unremoved event listeners, undisposed Backbone views, or accumulating data in global state.",[15,6634,6635],{},[109,6636,161],{},[15,6638,6639],{},"Step 1: Identify leaking views",[129,6641,6643],{"className":167,"code":6642,"language":169,"meta":138,"style":138},"\u002F\u002F Debug: Track view instances\nvar ViewTracker = {\n  views: [],\n  \n  track: function(view) {\n    this.views.push({\n      cid: view.cid,\n      name: view.constructor.name,\n      created: Date.now()\n    });\n  },\n  \n  untrack: function(view) {\n    this.views = this.views.filter(function(v) {\n      return v.cid !== view.cid;\n    });\n  },\n  \n  report: function() {\n    console.log('Active views:', this.views.length);\n    console.table(this.views);\n  }\n};\n\n\u002F\u002F In your base view\nvar BaseView = Backbone.View.extend({\n  initialize: function() {\n    ViewTracker.track(this);\n  },\n  \n  destroy: function() {\n    ViewTracker.untrack(this);\n    Backbone.View.prototype.destroy.apply(this, arguments);\n  }\n});\n",[136,6644,6645,6650,6661,6666,6670,6686,6698,6703,6714,6723,6727,6731,6735,6750,6777,6790,6794,6798,6802,6813,6834,6848,6852,6856,6860,6865,6880,6890,6904,6908,6912,6922,6935,6955,6959],{"__ignoreMap":138},[173,6646,6647],{"class":175,"line":176},[173,6648,6649],{"class":179},"\u002F\u002F Debug: Track view instances\n",[173,6651,6652,6654,6657,6659],{"class":175,"line":183},[173,6653,2575],{"class":208},[173,6655,6656],{"class":239}," ViewTracker ",[173,6658,2581],{"class":208},[173,6660,946],{"class":239},[173,6662,6663],{"class":175,"line":189},[173,6664,6665],{"class":239},"  views: [],\n",[173,6667,6668],{"class":175,"line":196},[173,6669,1850],{"class":239},[173,6671,6672,6675,6677,6679,6681,6684],{"class":175,"line":202},[173,6673,6674],{"class":235},"  track",[173,6676,512],{"class":239},[173,6678,256],{"class":208},[173,6680,259],{"class":239},[173,6682,6683],{"class":262},"view",[173,6685,271],{"class":239},[173,6687,6688,6690,6693,6696],{"class":175,"line":215},[173,6689,2864],{"class":334},[173,6691,6692],{"class":239},".views.",[173,6694,6695],{"class":235},"push",[173,6697,2843],{"class":239},[173,6699,6700],{"class":175,"line":226},[173,6701,6702],{"class":239},"      cid: view.cid,\n",[173,6704,6705,6708,6711],{"class":175,"line":232},[173,6706,6707],{"class":239},"      name: view.",[173,6709,6710],{"class":334},"constructor",[173,6712,6713],{"class":239},".name,\n",[173,6715,6716,6719,6721],{"class":175,"line":274},[173,6717,6718],{"class":239},"      created: Date.",[173,6720,4984],{"class":235},[173,6722,6176],{"class":239},[173,6724,6725],{"class":175,"line":280},[173,6726,3852],{"class":239},[173,6728,6729],{"class":175,"line":1710},[173,6730,2907],{"class":239},[173,6732,6733],{"class":175,"line":1716},[173,6734,1850],{"class":239},[173,6736,6737,6740,6742,6744,6746,6748],{"class":175,"line":1721},[173,6738,6739],{"class":235},"  untrack",[173,6741,512],{"class":239},[173,6743,256],{"class":208},[173,6745,259],{"class":239},[173,6747,6683],{"class":262},[173,6749,271],{"class":239},[173,6751,6752,6754,6757,6759,6761,6763,6766,6768,6770,6772,6775],{"class":175,"line":1726},[173,6753,2864],{"class":334},[173,6755,6756],{"class":239},".views ",[173,6758,2581],{"class":208},[173,6760,2872],{"class":334},[173,6762,6692],{"class":239},[173,6764,6765],{"class":235},"filter",[173,6767,259],{"class":239},[173,6769,256],{"class":208},[173,6771,259],{"class":239},[173,6773,6774],{"class":262},"v",[173,6776,271],{"class":239},[173,6778,6779,6781,6784,6787],{"class":175,"line":1731},[173,6780,3161],{"class":208},[173,6782,6783],{"class":239}," v.cid ",[173,6785,6786],{"class":208},"!==",[173,6788,6789],{"class":239}," view.cid;\n",[173,6791,6792],{"class":175,"line":1957},[173,6793,3852],{"class":239},[173,6795,6796],{"class":175,"line":1969},[173,6797,2907],{"class":239},[173,6799,6800],{"class":175,"line":1975},[173,6801,1850],{"class":239},[173,6803,6804,6807,6809,6811],{"class":175,"line":1981},[173,6805,6806],{"class":235},"  report",[173,6808,512],{"class":239},[173,6810,256],{"class":208},[173,6812,812],{"class":239},[173,6814,6815,6817,6819,6821,6824,6826,6828,6830,6832],{"class":175,"line":3357},[173,6816,3419],{"class":239},[173,6818,2153],{"class":235},[173,6820,259],{"class":239},[173,6822,6823],{"class":243},"'Active views:'",[173,6825,247],{"class":239},[173,6827,2661],{"class":334},[173,6829,6692],{"class":239},[173,6831,2636],{"class":334},[173,6833,2161],{"class":239},[173,6835,6836,6838,6841,6843,6845],{"class":175,"line":3365},[173,6837,3419],{"class":239},[173,6839,6840],{"class":235},"table",[173,6842,259],{"class":239},[173,6844,2661],{"class":334},[173,6846,6847],{"class":239},".views);\n",[173,6849,6850],{"class":175,"line":3923},[173,6851,549],{"class":239},[173,6853,6854],{"class":175,"line":3929},[173,6855,993],{"class":239},[173,6857,6858],{"class":175,"line":3935},[173,6859,193],{"emptyLinePlaceholder":192},[173,6861,6862],{"class":175,"line":3946},[173,6863,6864],{"class":179},"\u002F\u002F In your base view\n",[173,6866,6867,6869,6872,6874,6876,6878],{"class":175,"line":3963},[173,6868,2575],{"class":208},[173,6870,6871],{"class":239}," BaseView ",[173,6873,2581],{"class":208},[173,6875,2837],{"class":239},[173,6877,2840],{"class":235},[173,6879,2843],{"class":239},[173,6881,6882,6884,6886,6888],{"class":175,"line":3975},[173,6883,2848],{"class":235},[173,6885,512],{"class":239},[173,6887,256],{"class":208},[173,6889,812],{"class":239},[173,6891,6892,6895,6898,6900,6902],{"class":175,"line":4002},[173,6893,6894],{"class":239},"    ViewTracker.",[173,6896,6897],{"class":235},"track",[173,6899,259],{"class":239},[173,6901,2661],{"class":334},[173,6903,2161],{"class":239},[173,6905,6906],{"class":175,"line":4007},[173,6907,2907],{"class":239},[173,6909,6910],{"class":175,"line":4017},[173,6911,1850],{"class":239},[173,6913,6914,6916,6918,6920],{"class":175,"line":4022},[173,6915,2916],{"class":235},[173,6917,512],{"class":239},[173,6919,256],{"class":208},[173,6921,812],{"class":239},[173,6923,6924,6926,6929,6931,6933],{"class":175,"line":4027},[173,6925,6894],{"class":239},[173,6927,6928],{"class":235},"untrack",[173,6930,259],{"class":239},[173,6932,2661],{"class":334},[173,6934,2161],{"class":239},[173,6936,6937,6939,6941,6943,6945,6947,6949,6951,6953],{"class":175,"line":4032},[173,6938,2977],{"class":239},[173,6940,2980],{"class":334},[173,6942,2983],{"class":239},[173,6944,2986],{"class":235},[173,6946,259],{"class":239},[173,6948,2661],{"class":334},[173,6950,247],{"class":239},[173,6952,2995],{"class":334},[173,6954,2161],{"class":239},[173,6956,6957],{"class":175,"line":4040},[173,6958,549],{"class":239},[173,6960,6961],{"class":175,"line":4628},[173,6962,283],{"class":239},[15,6964,6965],{},"Step 2: Fix event listener leaks",[129,6967,6969],{"className":167,"code":6968,"language":169,"meta":138,"style":138},"\u002F\u002F WRONG: Adding listeners without removal\nvar ProblematicView = Backbone.View.extend({\n  initialize: function() {\n    $(window).on('resize', this.handleResize.bind(this));\n    \u002F\u002F Never removed when view is destroyed!\n  }\n});\n\n\u002F\u002F RIGHT: Proper listener management\nvar CorrectView = Backbone.View.extend({\n  initialize: function() {\n    this._handleResize = this.handleResize.bind(this);\n    $(window).on('resize', this._handleResize);\n  },\n  \n  destroy: function() {\n    $(window).off('resize', this._handleResize);\n    Backbone.View.prototype.destroy.apply(this, arguments);\n  }\n});\n",[136,6970,6971,6976,6991,7001,7031,7036,7040,7044,7048,7053,7068,7078,7099,7118,7122,7126,7136,7154,7174,7178],{"__ignoreMap":138},[173,6972,6973],{"class":175,"line":176},[173,6974,6975],{"class":179},"\u002F\u002F WRONG: Adding listeners without removal\n",[173,6977,6978,6980,6983,6985,6987,6989],{"class":175,"line":183},[173,6979,2575],{"class":208},[173,6981,6982],{"class":239}," ProblematicView ",[173,6984,2581],{"class":208},[173,6986,2837],{"class":239},[173,6988,2840],{"class":235},[173,6990,2843],{"class":239},[173,6992,6993,6995,6997,6999],{"class":175,"line":189},[173,6994,2848],{"class":235},[173,6996,512],{"class":239},[173,6998,256],{"class":208},[173,7000,812],{"class":239},[173,7002,7003,7006,7009,7011,7013,7016,7018,7020,7023,7025,7027,7029],{"class":175,"line":196},[173,7004,7005],{"class":235},"    $",[173,7007,7008],{"class":239},"(window).",[173,7010,2667],{"class":235},[173,7012,259],{"class":239},[173,7014,7015],{"class":243},"'resize'",[173,7017,247],{"class":239},[173,7019,2661],{"class":334},[173,7021,7022],{"class":239},".handleResize.",[173,7024,2810],{"class":235},[173,7026,259],{"class":239},[173,7028,2661],{"class":334},[173,7030,2817],{"class":239},[173,7032,7033],{"class":175,"line":202},[173,7034,7035],{"class":179},"    \u002F\u002F Never removed when view is destroyed!\n",[173,7037,7038],{"class":175,"line":215},[173,7039,549],{"class":239},[173,7041,7042],{"class":175,"line":226},[173,7043,283],{"class":239},[173,7045,7046],{"class":175,"line":232},[173,7047,193],{"emptyLinePlaceholder":192},[173,7049,7050],{"class":175,"line":274},[173,7051,7052],{"class":179},"\u002F\u002F RIGHT: Proper listener management\n",[173,7054,7055,7057,7060,7062,7064,7066],{"class":175,"line":280},[173,7056,2575],{"class":208},[173,7058,7059],{"class":239}," CorrectView ",[173,7061,2581],{"class":208},[173,7063,2837],{"class":239},[173,7065,2840],{"class":235},[173,7067,2843],{"class":239},[173,7069,7070,7072,7074,7076],{"class":175,"line":1710},[173,7071,2848],{"class":235},[173,7073,512],{"class":239},[173,7075,256],{"class":208},[173,7077,812],{"class":239},[173,7079,7080,7082,7085,7087,7089,7091,7093,7095,7097],{"class":175,"line":1716},[173,7081,2864],{"class":334},[173,7083,7084],{"class":239},"._handleResize ",[173,7086,2581],{"class":208},[173,7088,2872],{"class":334},[173,7090,7022],{"class":239},[173,7092,2810],{"class":235},[173,7094,259],{"class":239},[173,7096,2661],{"class":334},[173,7098,2161],{"class":239},[173,7100,7101,7103,7105,7107,7109,7111,7113,7115],{"class":175,"line":1721},[173,7102,7005],{"class":235},[173,7104,7008],{"class":239},[173,7106,2667],{"class":235},[173,7108,259],{"class":239},[173,7110,7015],{"class":243},[173,7112,247],{"class":239},[173,7114,2661],{"class":334},[173,7116,7117],{"class":239},"._handleResize);\n",[173,7119,7120],{"class":175,"line":1726},[173,7121,2907],{"class":239},[173,7123,7124],{"class":175,"line":1731},[173,7125,1850],{"class":239},[173,7127,7128,7130,7132,7134],{"class":175,"line":1957},[173,7129,2916],{"class":235},[173,7131,512],{"class":239},[173,7133,256],{"class":208},[173,7135,812],{"class":239},[173,7137,7138,7140,7142,7144,7146,7148,7150,7152],{"class":175,"line":1969},[173,7139,7005],{"class":235},[173,7141,7008],{"class":239},[173,7143,2735],{"class":235},[173,7145,259],{"class":239},[173,7147,7015],{"class":243},[173,7149,247],{"class":239},[173,7151,2661],{"class":334},[173,7153,7117],{"class":239},[173,7155,7156,7158,7160,7162,7164,7166,7168,7170,7172],{"class":175,"line":1975},[173,7157,2977],{"class":239},[173,7159,2980],{"class":334},[173,7161,2983],{"class":239},[173,7163,2986],{"class":235},[173,7165,259],{"class":239},[173,7167,2661],{"class":334},[173,7169,247],{"class":239},[173,7171,2995],{"class":334},[173,7173,2161],{"class":239},[173,7175,7176],{"class":175,"line":1981},[173,7177,549],{"class":239},[173,7179,7180],{"class":175,"line":3357},[173,7181,283],{"class":239},[15,7183,7184],{},"Step 3: Clear accumulated data",[129,7186,7188],{"className":167,"code":7187,"language":169,"meta":138,"style":138},"\u002F\u002F Clear cached data when navigating away\nvar ProductCache = {\n  _cache: {},\n  \n  get: function(productId) {\n    return this._cache[productId];\n  },\n  \n  set: function(productId, data) {\n    \u002F\u002F Limit cache size\n    var keys = Object.keys(this._cache);\n    if (keys.length > 50) {\n      delete this._cache[keys[0]];  \u002F\u002F Remove oldest\n    }\n    this._cache[productId] = data;\n  },\n  \n  clear: function() {\n    this._cache = {};\n  }\n};\n\n\u002F\u002F Clear on major navigation\nRouter.on('navigate', function() {\n  ProductCache.clear();\n});\n",[136,7189,7190,7195,7206,7211,7215,7231,7240,7244,7248,7268,7273,7294,7311,7329,7333,7345,7349,7353,7364,7376,7380,7384,7388,7393,7411,7421],{"__ignoreMap":138},[173,7191,7192],{"class":175,"line":176},[173,7193,7194],{"class":179},"\u002F\u002F Clear cached data when navigating away\n",[173,7196,7197,7199,7202,7204],{"class":175,"line":183},[173,7198,2575],{"class":208},[173,7200,7201],{"class":239}," ProductCache ",[173,7203,2581],{"class":208},[173,7205,946],{"class":239},[173,7207,7208],{"class":175,"line":189},[173,7209,7210],{"class":239},"  _cache: {},\n",[173,7212,7213],{"class":175,"line":196},[173,7214,1850],{"class":239},[173,7216,7217,7220,7222,7224,7226,7229],{"class":175,"line":202},[173,7218,7219],{"class":235},"  get",[173,7221,512],{"class":239},[173,7223,256],{"class":208},[173,7225,259],{"class":239},[173,7227,7228],{"class":262},"productId",[173,7230,271],{"class":239},[173,7232,7233,7235,7237],{"class":175,"line":215},[173,7234,1910],{"class":208},[173,7236,2872],{"class":334},[173,7238,7239],{"class":239},"._cache[productId];\n",[173,7241,7242],{"class":175,"line":226},[173,7243,2907],{"class":239},[173,7245,7246],{"class":175,"line":232},[173,7247,1850],{"class":239},[173,7249,7250,7253,7255,7257,7259,7261,7263,7266],{"class":175,"line":274},[173,7251,7252],{"class":235},"  set",[173,7254,512],{"class":239},[173,7256,256],{"class":208},[173,7258,259],{"class":239},[173,7260,7228],{"class":262},[173,7262,247],{"class":239},[173,7264,7265],{"class":262},"data",[173,7267,271],{"class":239},[173,7269,7270],{"class":175,"line":280},[173,7271,7272],{"class":179},"    \u002F\u002F Limit cache size\n",[173,7274,7275,7277,7280,7282,7285,7287,7289,7291],{"class":175,"line":1710},[173,7276,3767],{"class":208},[173,7278,7279],{"class":239}," keys ",[173,7281,2581],{"class":208},[173,7283,7284],{"class":239}," Object.",[173,7286,2169],{"class":235},[173,7288,259],{"class":239},[173,7290,2661],{"class":334},[173,7292,7293],{"class":239},"._cache);\n",[173,7295,7296,7299,7302,7304,7306,7309],{"class":175,"line":1716},[173,7297,7298],{"class":208},"    if",[173,7300,7301],{"class":239}," (keys.",[173,7303,2636],{"class":334},[173,7305,584],{"class":208},[173,7307,7308],{"class":334}," 50",[173,7310,271],{"class":239},[173,7312,7313,7316,7318,7321,7323,7326],{"class":175,"line":1721},[173,7314,7315],{"class":208},"      delete",[173,7317,2872],{"class":334},[173,7319,7320],{"class":239},"._cache[keys[",[173,7322,2612],{"class":334},[173,7324,7325],{"class":239},"]];  ",[173,7327,7328],{"class":179},"\u002F\u002F Remove oldest\n",[173,7330,7331],{"class":175,"line":1726},[173,7332,984],{"class":239},[173,7334,7335,7337,7340,7342],{"class":175,"line":1731},[173,7336,2864],{"class":334},[173,7338,7339],{"class":239},"._cache[productId] ",[173,7341,2581],{"class":208},[173,7343,7344],{"class":239}," data;\n",[173,7346,7347],{"class":175,"line":1957},[173,7348,2907],{"class":239},[173,7350,7351],{"class":175,"line":1969},[173,7352,1850],{"class":239},[173,7354,7355,7358,7360,7362],{"class":175,"line":1975},[173,7356,7357],{"class":235},"  clear",[173,7359,512],{"class":239},[173,7361,256],{"class":208},[173,7363,812],{"class":239},[173,7365,7366,7368,7371,7373],{"class":175,"line":1981},[173,7367,2864],{"class":334},[173,7369,7370],{"class":239},"._cache ",[173,7372,2581],{"class":208},[173,7374,7375],{"class":239}," {};\n",[173,7377,7378],{"class":175,"line":3357},[173,7379,549],{"class":239},[173,7381,7382],{"class":175,"line":3365},[173,7383,993],{"class":239},[173,7385,7386],{"class":175,"line":3923},[173,7387,193],{"emptyLinePlaceholder":192},[173,7389,7390],{"class":175,"line":3929},[173,7391,7392],{"class":179},"\u002F\u002F Clear on major navigation\n",[173,7394,7395,7398,7400,7402,7405,7407,7409],{"class":175,"line":3935},[173,7396,7397],{"class":239},"Router.",[173,7399,2667],{"class":235},[173,7401,259],{"class":239},[173,7403,7404],{"class":243},"'navigate'",[173,7406,247],{"class":239},[173,7408,256],{"class":208},[173,7410,812],{"class":239},[173,7412,7413,7416,7419],{"class":175,"line":3946},[173,7414,7415],{"class":239},"  ProductCache.",[173,7417,7418],{"class":235},"clear",[173,7420,2802],{"class":239},[173,7422,7423],{"class":175,"line":3963},[173,7424,283],{"class":239},[15,7426,7427],{},"Step 4: Use Chrome DevTools Memory profiler",[129,7429,7433],{"className":7430,"code":7431,"language":7432,"meta":138,"style":138},"language-plaintext shiki shiki-themes github-light github-dark","1. Open DevTools > Memory tab\n2. Take heap snapshot before browsing\n3. Browse the site, add items to cart, etc.\n4. Take another heap snapshot\n5. Compare snapshots to find growing objects\n6. Look for \"Detached DOM trees\" - these are leaks\n","plaintext",[136,7434,7435,7440,7445,7450,7455,7460],{"__ignoreMap":138},[173,7436,7437],{"class":175,"line":176},[173,7438,7439],{},"1. Open DevTools > Memory tab\n",[173,7441,7442],{"class":175,"line":183},[173,7443,7444],{},"2. Take heap snapshot before browsing\n",[173,7446,7447],{"class":175,"line":189},[173,7448,7449],{},"3. Browse the site, add items to cart, etc.\n",[173,7451,7452],{"class":175,"line":196},[173,7453,7454],{},"4. Take another heap snapshot\n",[173,7456,7457],{"class":175,"line":202},[173,7458,7459],{},"5. Compare snapshots to find growing objects\n",[173,7461,7462],{"class":175,"line":215},[173,7463,7464],{},"6. Look for \"Detached DOM trees\" - these are leaks\n",[15,7466,7467],{},[109,7468,411],{},[30,7470,7471,7474,7477,7480],{},[33,7472,7473],{},"Always implement destroy methods",[33,7475,7476],{},"Use weak references where appropriate",[33,7478,7479],{},"Limit cache sizes",[33,7481,7482],{},"Regular memory profiling in development",[89,7484],{},[25,7486,75],{"id":7487},"debugging-best-practices",[102,7489,7491],{"id":7490},"enable-debug-mode","Enable Debug Mode",[129,7493,7495],{"className":167,"code":7494,"language":169,"meta":138,"style":138},"\u002F\u002F Add to URL for verbose logging\nhttps:\u002F\u002Fyourstore.com\u002F?sc_debug=true\n\n\u002F\u002F Or set in session\nsessionStorage.setItem('sc_debug', 'true');\n",[136,7496,7497,7502,7513,7517,7522],{"__ignoreMap":138},[173,7498,7499],{"class":175,"line":176},[173,7500,7501],{"class":179},"\u002F\u002F Add to URL for verbose logging\n",[173,7503,7504,7507,7510],{"class":175,"line":183},[173,7505,7506],{"class":235},"https",[173,7508,7509],{"class":239},":",[173,7511,7512],{"class":179},"\u002F\u002Fyourstore.com\u002F?sc_debug=true\n",[173,7514,7515],{"class":175,"line":189},[173,7516,193],{"emptyLinePlaceholder":192},[173,7518,7519],{"class":175,"line":196},[173,7520,7521],{"class":179},"\u002F\u002F Or set in session\n",[173,7523,7524,7527,7530,7532,7535,7537,7540],{"class":175,"line":202},[173,7525,7526],{"class":239},"sessionStorage.",[173,7528,7529],{"class":235},"setItem",[173,7531,259],{"class":239},[173,7533,7534],{"class":243},"'sc_debug'",[173,7536,247],{"class":239},[173,7538,7539],{"class":243},"'true'",[173,7541,2161],{"class":239},[102,7543,7545],{"id":7544},"use-network-throttling","Use Network Throttling",[15,7547,7548],{},"Test on slow connections to expose race conditions:",[30,7550,7551,7554],{},[33,7552,7553],{},"DevTools > Network > Throttle to \"Slow 3G\"",[33,7555,7556],{},"Many bugs only appear under network latency",[102,7558,7560],{"id":7559},"check-the-script-log","Check the Script Log",[129,7562,7565],{"className":7563,"code":7564,"language":134},[132],"NetSuite > Customization > Scripting > Script Log\nFilter by script type and date\nLook for execution errors and governance warnings\n",[136,7566,7564],{"__ignoreMap":138},[102,7568,7570],{"id":7569},"enable-ssp-debug-response","Enable SSP Debug Response",[129,7572,7574],{"className":167,"code":7573,"language":169,"meta":138,"style":138},"\u002F\u002F In development, return detailed errors\nif (SC.Configuration.isDebugMode) {\n  return {\n    error: true,\n    message: error.message,\n    stack: error.stack,\n    scriptId: runtime.getCurrentScript().id\n  };\n}\n",[136,7575,7576,7581,7593,7599,7608,7613,7618,7628,7633],{"__ignoreMap":138},[173,7577,7578],{"class":175,"line":176},[173,7579,7580],{"class":179},"\u002F\u002F In development, return detailed errors\n",[173,7582,7583,7585,7587,7590],{"class":175,"line":183},[173,7584,5637],{"class":208},[173,7586,5094],{"class":239},[173,7588,7589],{"class":334},"SC",[173,7591,7592],{"class":239},".Configuration.isDebugMode) {\n",[173,7594,7595,7597],{"class":175,"line":189},[173,7596,817],{"class":208},[173,7598,946],{"class":239},[173,7600,7601,7604,7606],{"class":175,"line":196},[173,7602,7603],{"class":239},"    error: ",[173,7605,5346],{"class":334},[173,7607,518],{"class":239},[173,7609,7610],{"class":175,"line":202},[173,7611,7612],{"class":239},"    message: error.message,\n",[173,7614,7615],{"class":175,"line":215},[173,7616,7617],{"class":239},"    stack: error.stack,\n",[173,7619,7620,7623,7625],{"class":175,"line":226},[173,7621,7622],{"class":239},"    scriptId: runtime.",[173,7624,4211],{"class":235},[173,7626,7627],{"class":239},"().id\n",[173,7629,7630],{"class":175,"line":232},[173,7631,7632],{"class":239},"  };\n",[173,7634,7635],{"class":175,"line":274},[173,7636,554],{"class":239},[89,7638],{},[25,7640,81],{"id":7641},"when-to-escalate",[15,7643,7644],{},"Not every problem has a quick fix. Escalate when:",[146,7646,7647,7653,7659,7665,7671],{},[33,7648,7649,7652],{},[109,7650,7651],{},"Error persists after documented solutions"," - You've tried everything here",[33,7654,7655,7658],{},[109,7656,7657],{},"Involves NetSuite core functionality"," - Not your customization",[33,7660,7661,7664],{},[109,7662,7663],{},"Affects payment processing"," - Financial risk requires expert help",[33,7666,7667,7670],{},[109,7668,7669],{},"Data integrity is at risk"," - Orders, customers, inventory",[33,7672,7673,7676],{},[109,7674,7675],{},"Time-critical"," - Black Friday is tomorrow",[15,7678,7679,7680,7684],{},"At Stenbase, we offer ",[36,7681,7683],{"href":7682},"\u002Fsuitecommerce-services\u002Fmaintenance","SuiteCommerce maintenance and support"," for exactly these situations. Our team has seen (and fixed) these errors hundreds of times.",[89,7686],{},[25,7688,87],{"id":7689},"faq",[102,7691,7693],{"id":7692},"how-do-i-enable-suitecommerce-debug-mode","How do I enable SuiteCommerce debug mode?",[15,7695,7696,7697,7700,7701,7704],{},"Add ",[136,7698,7699],{},"?sc_debug=true"," to your URL, or set ",[136,7702,7703],{},"sessionStorage.setItem('sc_debug', 'true')"," in browser console. This enables verbose logging.",[102,7706,7708],{"id":7707},"where-are-suitescript-errors-logged","Where are SuiteScript errors logged?",[15,7710,7711],{},"NetSuite > Customization > Scripting > Script Execution Log. Filter by script, date, and log level to find errors.",[102,7713,7715],{"id":7714},"my-deployment-succeeds-but-the-site-doesnt-update-why","My deployment succeeds but the site doesn't update. Why?",[15,7717,7718],{},"CDN caching. Either wait for cache expiration, purge manually through your CDN dashboard, or deploy with cache-busting version numbers.",[102,7720,7722],{"id":7721},"how-do-i-find-which-extension-is-causing-conflicts","How do I find which extension is causing conflicts?",[15,7724,7725],{},"Disable extensions one by one and test. Or enable all, then disable half at a time (binary search) to identify the culprit faster.",[102,7727,7729],{"id":7728},"payment-succeeded-but-order-shows-failed-what-happened","Payment succeeded but order shows failed. What happened?",[15,7731,7732],{},"Check the payment gateway dashboard for the transaction status. If paid, you likely have a timeout issue—the payment completed but the response didn't reach SuiteCommerce. Manually update the order and implement idempotency keys to prevent this.",[89,7734],{},[15,7736,7737],{},[7738,7739,7740,7741,7745],"em",{},"Dealing with a SuiteCommerce error not covered here? ",[36,7742,7744],{"href":7743},"\u002Fcontact","Contact Stenbase"," for expert troubleshooting. We've seen it all—and fixed it all.",[6459,7747,7748],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .snhLl, html code.shiki .snhLl{--shiki-default:#22863A;--shiki-default-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold}html pre.shiki code .sA_wV, html code.shiki .sA_wV{--shiki-default:#032F62;--shiki-dark:#DBEDFF}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":138,"searchDepth":183,"depth":183,"links":7750},[7751,7752,7757,7762,7767,7771,7775,7779,7785,7786],{"id":27,"depth":183,"text":28},{"id":93,"depth":183,"text":39,"children":7753},[7754,7755,7756],{"id":104,"depth":189,"text":105},{"id":434,"depth":189,"text":435},{"id":667,"depth":189,"text":668},{"id":1055,"depth":183,"text":45,"children":7758},[7759,7760,7761],{"id":1058,"depth":189,"text":1059},{"id":1406,"depth":189,"text":1407},{"id":1756,"depth":189,"text":1757},{"id":2228,"depth":183,"text":51,"children":7763},[7764,7765,7766],{"id":2231,"depth":189,"text":2232},{"id":2527,"depth":189,"text":2528},{"id":3025,"depth":189,"text":3026},{"id":3543,"depth":183,"text":57,"children":7768},[7769,7770],{"id":3546,"depth":189,"text":3547},{"id":4062,"depth":189,"text":4063},{"id":4880,"depth":183,"text":63,"children":7772},[7773,7774],{"id":4883,"depth":189,"text":4884},{"id":5508,"depth":189,"text":5509},{"id":6040,"depth":183,"text":69,"children":7776},[7777,7778],{"id":6049,"depth":189,"text":6050},{"id":6601,"depth":189,"text":6602},{"id":7487,"depth":183,"text":75,"children":7780},[7781,7782,7783,7784],{"id":7490,"depth":189,"text":7491},{"id":7544,"depth":189,"text":7545},{"id":7559,"depth":189,"text":7560},{"id":7569,"depth":189,"text":7570},{"id":7641,"depth":183,"text":81},{"id":7689,"depth":183,"text":87,"children":7787},[7788,7789,7790,7791,7792],{"id":7692,"depth":189,"text":7693},{"id":7707,"depth":189,"text":7708},{"id":7714,"depth":189,"text":7715},{"id":7721,"depth":189,"text":7722},{"id":7728,"depth":189,"text":7729},[7794,7795],"SuiteCommerce","Development","2026-02-01","A comprehensive reference guide to the most common SuiteCommerce errors. Includes deployment failures, theme compilation issues, extension conflicts, sync errors, and payment gateway problems with step-by-step solutions.","md","\u002Fimages\u002Fblog\u002Ftroubleshooting-errors-hero.webp",{"keywords":7801},[7802,7803,7804,7805],"SuiteCommerce errors","SuiteCommerce troubleshooting","SuiteCommerce deployment failed","SuiteCommerce theme compilation error","\u002Fblog\u002Ftroubleshooting-suitecommerce-15-common-errors-how-to-fix",null,{"title":5,"description":7797},"blog\u002Ftroubleshooting-suitecommerce-15-common-errors-how-to-fix",[7794,7811,7812,7813,7795],"Troubleshooting","Errors","Debugging","2vQZ9jEOBQG4rkJjl90QWdeptDRHvKxPm2RZRnO0r9c",[7816,7827,7839,7851,7860,7870,7881,7890,7900,7909,7918,7928,7936,7946,7954,7965,7977,7986,7995,7998,8006],{"path":7817,"title":7818,"categories":7819,"tags":7820,"heroImage":7826},"\u002Fblog\u002Fbuilding-custom-suitecommerce-extensions-developer-guide","Building Custom SuiteCommerce Extensions: A Developer's Start-to-Finish Guide",[7794,7795],[7821,7822,7823,7824,7825],"SuiteCommerce Extensions","Custom Development","Backbone.js","SuiteScript","Frontend Development","\u002Fimages\u002Fblog\u002Fextensions-guide-hero.webp",{"path":7828,"title":7829,"categories":7830,"tags":7832,"heroImage":7838},"\u002Fblog\u002Fcore-web-vitals-suitecommerce-optimization-checklist","Core Web Vitals for SuiteCommerce: The Complete 2026 Optimization Checklist",[7831,7794],"Performance",[7833,7834,7835,7836,7837,7794],"Core Web Vitals","LCP","INP","CLS","Performance Optimization","\u002Fimages\u002Fblog\u002Fcore-web-vitals-hero.webp",{"path":7840,"title":7841,"categories":7842,"tags":7844,"heroImage":7850},"\u002Fblog\u002Ffixing-duplicate-content-suitecommerce-faceted-navigation","Fixing Duplicate Content in SuiteCommerce Faceted Navigation",[7843,7794],"SEO",[7845,7846,7847,7848,7794,7849],"Duplicate Content","Faceted Navigation","Canonical Tags","Technical SEO","URL Parameters","\u002Fimages\u002Fblog\u002Fduplicate-content-seo-hero.webp",{"path":7852,"title":7853,"categories":7854,"tags":7855,"heroImage":7859},"\u002Fblog\u002Fheadless-suitecommerce-when-does-it-make-sense","Headless SuiteCommerce: When Does It Make Sense?",[7794,7795],[7794,7856,7857,7858,7831],"Headless Commerce","Architecture","Implementation","\u002Fimages\u002Fblog\u002Fheadless-suitecommerce-hero.webp",{"path":7861,"title":7862,"categories":7863,"tags":7865,"heroImage":7869},"\u002Fblog\u002Fnetsuite-ecommerce-integration-architecture-how-suitecommerce-works","NetSuite E-commerce Integration Architecture: How SuiteCommerce Actually Works",[7794,7795,7864],"Integration",[7857,7864,7824,7866,7867,7868],"API","Backend","Frontend","\u002Fimages\u002Fblog\u002Fnetsuite-ecommerce-integration-hero.webp",{"path":7871,"title":7872,"categories":7873,"tags":7874,"heroImage":7880},"\u002Fblog\u002Fnetsuite-integration-without-celigo-when-custom-beats-off-the-shelf","NetSuite Integration Without Celigo: When Custom Beats Off-the-Shelf",[581,7864],[7875,7876,7877,7878,7824,7879],"NetSuite Integration","Celigo","Custom Integration","RESTlet","API Development","\u002Fimages\u002Fblog\u002Fnetsuite-integration-hero.webp",{"path":7882,"title":7883,"categories":7884,"tags":7885,"heroImage":7889},"\u002Fblog\u002Fsuitecommerce-checkout-optimization-fixing-abandonment","SuiteCommerce Checkout Optimization: Fixing Abandonment at the Technical Level",[7794,7831],[7794,7886,7887,7888,7831],"Checkout Optimization","Cart Abandonment","Conversions","\u002Fimages\u002Fblog\u002Fsuitecommerce-checkout-hero.webp",{"path":7891,"title":7892,"categories":7893,"tags":7894,"heroImage":7899},"\u002Fblog\u002Fsuitecommerce-image-optimization-developer-guide","SuiteCommerce Image Optimization: A Developer's Guide",[7831,7794],[7895,7896,7897,7898,7831,7794],"Image Optimization","WebP","Lazy Loading","CDN","\u002Fimages\u002Fblog\u002Fimage-optimization-hero.webp",{"path":7901,"title":7902,"categories":7903,"tags":7904,"heroImage":7908},"\u002Fblog\u002Fsuitecommerce-implementation-cost-guide-2026","SuiteCommerce Implementation Cost Guide: What to Expect in 2026",[7794,7858],[7905,7858,581,7906,7907],"SuiteCommerce Cost","Budget Planning","E-commerce","\u002Fimages\u002Fblog\u002Fimplementation-cost-hero.webp",{"path":7910,"title":7911,"categories":7912,"tags":7913,"heroImage":7917},"\u002Fblog\u002Fsuitecommerce-migration-checklist-upgrading-without-downtime","The SuiteCommerce Migration Checklist: Upgrading Without Downtime",[7794,7795],[7794,7914,7915,7916,7858],"Migration","Upgrade","Zero Downtime","\u002Fimages\u002Fblog\u002Fmigration-checklist-hero.webp",{"path":7919,"title":7920,"categories":7921,"tags":7922,"heroImage":7927},"\u002Fblog\u002Fsuitecommerce-myaccount-customization-b2b-features","SuiteCommerce MyAccount Customization: 10 Features B2B Customers Need",[7794,7795],[7794,7923,7924,7925,7926],"MyAccount","B2B","Customization","Portal","\u002Fimages\u002Fblog\u002Fsuitecommerce-myaccount-hero.webp",{"path":7929,"title":7930,"categories":7931,"tags":7933,"heroImage":7935},"\u002Fblog\u002Fsuitecommerce-performance-audit-286-stores","We Audited 286 Live SuiteCommerce Stores. Here's What We Found",[7831,7932,7794],"Research",[7831,7794,7833,7932,7934],"Benchmarks","\u002Fimages\u002Fblog\u002Fsuitecommerce-audit-hero.webp",{"path":7937,"title":7938,"categories":7939,"tags":7940,"heroImage":7945},"\u002Fblog\u002Fsuitecommerce-product-page-optimization-conversions-seo","How to Optimize SuiteCommerce Product Pages for Conversions and SEO",[7843,7831,7794],[7941,7942,7943,7848,7944],"Product Pages","Conversion Optimization","Schema Markup","CRO","\u002Fimages\u002Fblog\u002Fsuitecommerce-product-page-hero.webp",{"path":7947,"title":7948,"categories":7949,"tags":7950,"heroImage":7953},"\u002Fblog\u002Fsuitecommerce-seo-schema-markup-technical-guide","SuiteCommerce SEO: Schema Markup, Technical SEO, and What Actually Works",[7843,7794],[7943,7848,7951,7952,7794,581],"JSON-LD","Structured Data","\u002Fimages\u002Fblog\u002Fseo-schema-markup-hero.webp",{"path":7955,"title":7956,"categories":7957,"tags":7959,"heroImage":7964},"\u002Fblog\u002Fsuitecommerce-theme-development-design-to-deployment","SuiteCommerce Theme Development: From Design to Deployment",[7795,7794,7958],"Themes",[7960,7961,7962,7963,7825,7925],"Theme Development","SASS","CSS","Templates","\u002Fimages\u002Fblog\u002Fsuitecommerce-theme-hero.webp",{"path":7966,"title":7967,"categories":7968,"tags":7971,"heroImage":7976},"\u002Fblog\u002Fsuitecommerce-version-upgrade-guide-2024","SuiteCommerce Version Upgrade Guide: 2023.x to 2024.x",[7794,7969,7970],"Maintenance","Upgrades",[7972,7914,7973,7974,7975],"Version Upgrade","2024 Release","SCA","Deployment","\u002Fimages\u002Fblog\u002Fsuitecommerce-upgrade-hero.webp",{"path":7978,"title":7979,"categories":7980,"tags":7981,"heroImage":7985},"\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-netsuite-users","SuiteCommerce vs. BigCommerce for NetSuite Users: Which Platform Wins?",[7794,7907],[7982,7794,581,7983,7984,7864],"BigCommerce","Platform Comparison","E-commerce Platform","\u002Fimages\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-hero.webp",{"path":7987,"title":7988,"categories":7989,"tags":7990,"heroImage":7994},"\u002Fblog\u002Fsuitescript-performance-optimization-writing-efficient-scripts","SuiteScript Performance Optimization: Writing Efficient Scripts",[581,7824],[7824,7837,7991,7992,7993,7866],"Governance","Map\u002FReduce","NetSuite Development","\u002Fimages\u002Fblog\u002Fsuitescript-performance-hero.webp",{"path":7806,"title":5,"categories":7996,"tags":7997,"heroImage":7799},[7794,7795],[7794,7811,7812,7813,7795],{"path":7999,"title":8000,"categories":8001,"tags":8002,"heroImage":8005},"\u002Fblog\u002Ftrue-cost-suitecommerce-maintenance-annual-budget-guide","The True Cost of SuiteCommerce Maintenance: Annual Budget Planning Guide",[7794,7831],[7794,7969,7906,8003,8004],"TCO","E-commerce Operations","\u002Fimages\u002Fblog\u002Fsuitecommerce-maintenance-cost-hero.webp",{"path":8007,"title":8008,"categories":8009,"tags":8010,"heroImage":8012},"\u002Fblog\u002Fwhy-suitecommerce-site-slow-how-to-fix","Why Your SuiteCommerce Site is Slow (And How to Fix It)",[7831,7794],[7831,7794,8011,7811],"Speed Optimization","\u002Fimages\u002Fblog\u002Fslow-site-fix-hero.webp",1773773966249]