I recently had a nice chat in twitter with @mirontoli, @gandjustas, @mattein and @zimmergren regarding “5 suggestions to implement a better logging in SharePoint” post. This is quite serious post about logging in SharePoint, but discussion finally come to the js code as well as some joking around tons/kilometers of js code we may have in SharePoint.
Well, it got my curiosity and I just had to estimate how much js code we have in SharePoint 2013 in kilometers, tons and pages. Don’t take this post very seriously, please.
So, how much? In lines?
Well, most of the time we reverse engineer only *.debug versions of the target js files. So, here is a PowerShell script I did to get a very raw estimation of the total lines of js code:
cls $targetPath = "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\LAYOUTS" $jsFiles = [System.IO.Directory]::GetFiles($targetPath, "*.debug.js") $jsFilesTotalLines = 0; $jsFilesTotalFiles = 0; foreach($file in $jsFiles) { $lineCount = Get-Content $file | Measure-Object -Line $fileName = [System.IO.Path]::GetFileName($file) $jsFilesTotalLines += $lineCount.Lines $jsFilesTotalFiles++ Write "[$fileName] Lines: [$($lineCount.Lines)]" } Write "Total.." Write "File count: [$jsFilesTotalFiles] Lines: [$jsFilesTotalLines]"
Here is an outcome:
- [accessrequestscontrol.debug.js] Lines: [449]
- [accessrequestsviewtemplate.debug.js] Lines: [519]
- [activexwinprojlauncher.debug.js] Lines: [40]
- [ajaxtoolkit.debug.js] Lines: [6196]
- [AnalyticChart.debug.js] Lines: [1327]
- [AnalyticGrid.debug.js] Lines: [1617]
- [AnalyticReports.debug.js] Lines: [10444]
- [appcatalogfieldtemplate.debug.js] Lines: [179]
- [appdeveloperdash.debug.js] Lines: [587]
- [appmondetails.debug.js] Lines: [444]
- [autofill.debug.js] Lines: [406]
- [autohostedlicensingtemplates.debug.js] Lines: [314]
- [BFORM.debug.js] Lines: [10933]
- [blank.debug.js] Lines: [6]
- [BPSTD.debug.js] Lines: [203]
- [callout.debug.js] Lines: [1629]
- [CalloutUsageControlScript.debug.js] Lines: [73]
- [choicebuttonfieldtemplate.debug.js] Lines: [97]
- [clientforms.debug.js] Lines: [2726]
- [clientpeoplepicker.debug.js] Lines: [1638]
- [clientrenderer.debug.js] Lines: [518]
- [clienttemplates.debug.js] Lines: [6308]
- [commonvalidation.debug.js] Lines: [131]
- [contentfollowing.debug.js] Lines: [419]
- [CORE.debug.js] Lines: [15389]
- [CTP.debug.js] Lines: [208]
- [CUI.debug.js] Lines: [17467]
- [CVTP.debug.js] Lines: [140]
- [DashboardFramework.debug.js] Lines: [4171]
- [datepicker.debug.js] Lines: [1370]
- [designgallery.debug.js] Lines: [847]
- [DevDash.debug.js] Lines: [2511]
- [DragDrop.debug.js] Lines: [4015]
- [entityeditor.debug.js] Lines: [2009]
- [filepreview.debug.js] Lines: [499]
- [FOLDHYPERLINK.debug.js] Lines: [79]
- [followingcommon.debug.js] Lines: [265]
- [FORM.debug.js] Lines: [5069]
- [GanttApiShim.generated.debug.js] Lines: [170]
- [GanttScript.debug.js] Lines: [229]
- [GanttSharedApi.generated.debug.js] Lines: [111]
- [geolocationfieldtemplate.debug.js] Lines: [694]
- [groupboard.debug.js] Lines: [412]
- [GroupedItemPicker.debug.js] Lines: [563]
- [hashtagprofile.debug.js] Lines: [100]
- [hierarchytaskslist.debug.js] Lines: [1111]
- [IE50UP.debug.js] Lines: [3723]
- [IE55UP.debug.js] Lines: [3703]
- [IMGLIB.debug.js] Lines: [2422]
- [INIT.debug.js] Lines: [7622]
- [INPLVIEW.debug.js] Lines: [3373]
- [ITP.debug.js] Lines: [173]
- [jsapiextensibilitymanager.debug.js] Lines: [612]
- [JsGrid.debug.js] Lines: [22954]
- [JsGrid.Gantt.debug.js] Lines: [2329]
- [mapviewtemplate.debug.js] Lines: [648]
- [MENU.debug.js] Lines: [2755]
- [mquery.debug.js] Lines: [1346]
- [mrudocs.debug.js] Lines: [199]
- [mydocs.debug.js] Lines: [812]
- [mylinks.debug.js] Lines: [54]
- [MySiteRecommendations.debug.js] Lines: [1015]
- [NON_IE.debug.js] Lines: [2385]
- [offline.debug.js] Lines: [225]
- [OWS.debug.js] Lines: [12963]
- [OWSBROWS.debug.js] Lines: [245]
- [PageOverview.debug.js] Lines: [73]
- [Parameters.debug.js] Lines: [3380]
- [PivotControl.debug.js] Lines: [303]
- [portal.debug.js] Lines: [1351]
- [profilebrowsercontrol.debug.js] Lines: [1604]
- [projectsummary.debug.js] Lines: [737]
- [quicklaunch.debug.js] Lines: [2921]
- [Reputation.debug.js] Lines: [82]
- [roamingapps.debug.js] Lines: [995]
- [Scorecard.debug.js] Lines: [5526]
- [search.analyticsrecommendation.debug.js] Lines: [476]
- [Search.CBS.debug.js] Lines: [262]
- [Search.ClientControls.debug.js] Lines: [8830]
- [Search.Configuration.debug.js] Lines: [3830]
- [search.facetednavigationtab.debug.js] Lines: [847]
- [search.refinementconfiguration.debug.js] Lines: [253]
- [search.refinementconfigurationdialog.debug.js] Lines: [1375]
- [search.taxonomyrefinement.debug.js] Lines: [223]
- [SearchUI.debug.js] Lines: [2519]
- [sharing.debug.js] Lines: [1135]
- [siteupgrade.debug.js] Lines: [62]
- [SP.Core.debug.js] Lines: [2001]
- [SP.dateTimeUtil.debug.js] Lines: [2373]
- [SP.debug.js] Lines: [20626]
- [SP.DocumentManagement.debug.js] Lines: [224]
- [SP.Exp.debug.js] Lines: [1212]
- [SP.Init.debug.js] Lines: [1470]
- [SP.Map.debug.js] Lines: [370]
- [SP.Policy.debug.js] Lines: [273]
- [SP.Publishing.debug.js] Lines: [2237]
- [SP.RequestExecutor.debug.js] Lines: [1938]
- [SP.Ribbon.debug.js] Lines: [7658]
- [SP.Runtime.debug.js] Lines: [4586]
- [sp.search.apps.debug.js] Lines: [128]
- [sp.search.debug.js] Lines: [2207]
- [SP.Storefront.debug.js] Lines: [8309]
- [SP.Taxonomy.debug.js] Lines: [1]
- [SP.Translation.debug.js] Lines: [660]
- [SP.UI.Admin.debug.js] Lines: [417]
- [SP.UI.AllApps.debug.js] Lines: [1055]
- [SP.UI.ApplicationPages.Calendar.debug.js] Lines: [7172]
- [SP.UI.ApplicationPages.debug.js] Lines: [200]
- [SP.UI.AssetLibrary.debug.js] Lines: [177]
- [SP.UI.BDCAdminPages.debug.js] Lines: [292]
- [sp.ui.blogs.debug.js] Lines: [1200]
- [sp.ui.collabmailbox.debug.js] Lines: [231]
- [SP.UI.ComboBox.debug.js] Lines: [2685]
- [sp.ui.controls.debug.js] Lines: [1074]
- [SP.UI.Dialog.debug.js] Lines: [1803]
- [sp.ui.discussions.debug.js] Lines: [2911]
- [SP.UI.DocSet.Ribbon.debug.js] Lines: [277]
- [sp.ui.documentssharedbyme.debug.js] Lines: [51]
- [sp.ui.documentssharedwithme.debug.js] Lines: [124]
- [SP.UI.ImageCrop.debug.js] Lines: [743]
- [sp.ui.listsearchbox.debug.js] Lines: [1001]
- [sp.ui.listsearchboxbootstrap.debug.js] Lines: [112]
- [SP.UI.MicroFeed.debug.js] Lines: [8411]
- [SP.UI.MySiteCommon.debug.js] Lines: [1971]
- [SP.UI.MySiteNavigation.debug.js] Lines: [104]
- [SP.UI.MySiteRecommendations.debug.js] Lines: [288]
- [SP.UI.People.debug.js] Lines: [1647]
- [SP.UI.Policy.Ribbon.debug.js] Lines: [161]
- [sp.ui.promotedsites.debug.js] Lines: [463]
- [SP.UI.Pub.HtmlDesign.debug.js] Lines: [551]
- [SP.UI.Pub.Ribbon.debug.js] Lines: [2368]
- [SP.UI.Publishing.LayoutsPages.debug.js] Lines: [515]
- [sp.ui.ratings.debug.js] Lines: [438]
- [sp.ui.relateditems.debug.js] Lines: [592]
- [sp.ui.reputation.debug.js] Lines: [904]
- [SP.UI.Rte.debug.js] Lines: [25138]
- [SP.UI.RTE.Publishing.debug.js] Lines: [1517]
- [SP.UI.Spellcheck.debug.js] Lines: [1239]
- [SP.UI.SSSvcAdminPages.debug.js] Lines: [157]
- [SP.UI.TileView.debug.js] Lines: [1287]
- [sp.ui.timeline.debug.js] Lines: [9460]
- [SP.UserProfiles.debug.js] Lines: [1]
- [SP.WorkflowServices.debug.js] Lines: [1062]
- [sp.workmanagement.debug.js] Lines: [3470]
- [SPGantt.debug.js] Lines: [3934]
- [spgridview.debug.js] Lines: [154]
- [SpsApiShim.generated.debug.js] Lines: [94]
- [SpsSharedApi.generated.debug.js] Lines: [87]
- [START.debug.js] Lines: [4236]
- [suitelinks.debug.js] Lines: [771]
- [timecard.debug.js] Lines: [1085]
- [TimelineApiShim.generated.debug.js] Lines: [54]
- [TimelineSharedApi.generated.debug.js] Lines: [80]
- [wma.ui.dialogs.debug.js] Lines: [596]
- [wma.ui.settings.debug.js] Lines: [195]
- [wma.ui.tasklist.debug.js] Lines: [11511]
- [WmaApiShim.generated.debug.js] Lines: [422]
- [wpadder.debug.js] Lines: [1322]
- [WPCM.debug.js] Lines: [243]
- [XTP.debug.js] Lines: [95]
- [XUI.debug.js] Lines: [1068]
Finally, the total: File count: [161] Lines: [376463]
Okay, so at least 376463 lines of js code we could deal with. Great news!
Okay, how much in kilometers and tons?
Length calculations
Well, my Word 2013 with Calibri (body), 11 gets me 29 lines per page.
It means that 376463/29 = 12981.4828 pages. Let’s say 13 000 pages, just for the nice calculations. A4 format is 210 × 297. In turn, (13 000 * 297) / 1000 = 3861 m = 3.8 kilometers.
Okay, so approximately, printed versions of the js code may take 3.8 kilometers.
Weight calculations
Let’s say we use “HP Printing Paper A4 80gsm 500 Pack“.
It’s about 449g per 500 pages. So, 13 000 pages / 500 = 26 packs. Next, 26 pack * 449g = 11674g = 11 kg.
Great! Printed versions of the js code may weight 11 kg.
Conclusion
SharePoint 2013 contains at least 376463 lines of js code, which is 13 000 pages (Word 2013 with Calibri (body), 11), which is appx 3.8 kilometers and 11 kg in printed version. And don’t take this post that serious, please.