nbgitpuller-jl-interface 0.2.5__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. nbgitpuller_jl_interface-0.4.0/CHANGELOG.md +73 -0
  2. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/PKG-INFO +1 -1
  3. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/_version.py +1 -1
  4. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/labextension/package.json +2 -2
  5. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/labextension/schemas/nbgitpuller-jl-interface/package.json.orig +1 -1
  6. nbgitpuller_jl_interface-0.4.0/nbgitpuller_jl_interface/labextension/static/293.24f6a6ad6689d54e2835.js +1 -0
  7. nbgitpuller_jl_interface-0.4.0/nbgitpuller_jl_interface/labextension/static/728.1316db9caad2256ea253.js +1 -0
  8. nbgitpuller_jl_interface-0.2.5/nbgitpuller_jl_interface/labextension/static/remoteEntry.34a78c2aa73e0e0f2b81.js → nbgitpuller_jl_interface-0.4.0/nbgitpuller_jl_interface/labextension/static/remoteEntry.b83083f7b0a432020f55.js +1 -1
  9. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/package.json +1 -1
  10. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/src/__tests__/nbgitpuller_jb_interface.spec.ts +33 -35
  11. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/src/index.ts +6 -8
  12. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/src/utils.ts +99 -93
  13. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/style/base.css +4 -0
  14. nbgitpuller_jl_interface-0.2.5/CHANGELOG.md +0 -39
  15. nbgitpuller_jl_interface-0.2.5/nbgitpuller_jl_interface/labextension/static/293.d9c8968d6d528bad2399.js +0 -1
  16. nbgitpuller_jl_interface-0.2.5/nbgitpuller_jl_interface/labextension/static/728.c80bd4566fc22d8dd093.js +0 -1
  17. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/.copier-answers.yml +0 -0
  18. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/.gitignore +0 -0
  19. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/.prettierignore +0 -0
  20. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/.vscode/settings.json +0 -0
  21. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/.yarnrc.yml +0 -0
  22. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/LICENSE +0 -0
  23. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/README.md +0 -0
  24. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/RELEASE.md +0 -0
  25. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/babel.config.js +0 -0
  26. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/conftest.py +0 -0
  27. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/install.json +0 -0
  28. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/jest.config.js +0 -0
  29. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/jupyter-config/server-config/nbgitpuller_jl_interface.json +0 -0
  30. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/__init__.py +0 -0
  31. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/labextension/schemas/nbgitpuller-jl-interface/plugin.json +0 -0
  32. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/labextension/static/style.js +0 -0
  33. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/labextension/static/third-party-licenses.json +0 -0
  34. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/routes.py +0 -0
  35. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/tests/__init__.py +0 -0
  36. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/tests/test_routes.py +0 -0
  37. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/tests/test_utils.py +0 -0
  38. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/nbgitpuller_jl_interface/utils.py +0 -0
  39. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/pyproject.toml +0 -0
  40. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/schema/plugin.json +0 -0
  41. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/setup.py +0 -0
  42. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/src/request.ts +0 -0
  43. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/style/index.css +0 -0
  44. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/style/index.js +0 -0
  45. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/style/tmp_logo.svg +0 -0
  46. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/tsconfig.json +0 -0
  47. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/tsconfig.test.json +0 -0
  48. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/ui-tests/README.md +0 -0
  49. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/ui-tests/jupyter_server_test_config.py +0 -0
  50. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/ui-tests/package.json +0 -0
  51. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/ui-tests/playwright.config.js +0 -0
  52. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/ui-tests/tests/nbgitpuller_jl_interface.spec.ts +0 -0
  53. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/ui-tests/yarn.lock +0 -0
  54. {nbgitpuller_jl_interface-0.2.5 → nbgitpuller_jl_interface-0.4.0}/yarn.lock +0 -0
@@ -0,0 +1,73 @@
1
+ # Changelog
2
+
3
+ <!-- <START NEW CHANGELOG ENTRY> -->
4
+
5
+ ## 0.4.0
6
+
7
+ ([Full Changelog](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/compare/v0.3.0...c0858bae9a3c63097a47872caeb0332071433e10))
8
+
9
+ ### Enhancements made
10
+
11
+ - rework display state system to be extensible [#5](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/pull/5) ([@segallagher](https://github.com/segallagher), [@bbuechler](https://github.com/bbuechler), [@dgpalmieri](https://github.com/dgpalmieri))
12
+
13
+ ### Contributors to this release
14
+
15
+ The following people contributed discussions, new ideas, code and documentation contributions, and review.
16
+ See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
17
+
18
+ ([GitHub contributors page for this release](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/graphs/contributors?from=2026-04-10&to=2026-04-15&type=c))
19
+
20
+ @bbuechler ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Abbuechler+updated%3A2026-04-10..2026-04-15&type=Issues)) | @dgpalmieri ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Adgpalmieri+updated%3A2026-04-10..2026-04-15&type=Issues)) | @segallagher ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Asegallagher+updated%3A2026-04-10..2026-04-15&type=Issues))
21
+
22
+ <!-- <END NEW CHANGELOG ENTRY> -->
23
+
24
+ ## 0.3.0
25
+
26
+ ([Full Changelog](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/compare/v0.2.5...eab8732c960fecc43d3cda8560330cc3b692a5bf))
27
+
28
+ ### Bugs fixed
29
+
30
+ - Make compatable with jupyterhub environment [#4](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/pull/4) ([@segallagher](https://github.com/segallagher), [@dgpalmieri](https://github.com/dgpalmieri))
31
+
32
+ ### Contributors to this release
33
+
34
+ The following people contributed discussions, new ideas, code and documentation contributions, and review.
35
+ See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
36
+
37
+ ([GitHub contributors page for this release](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/graphs/contributors?from=2026-04-09&to=2026-04-10&type=c))
38
+
39
+ @dgpalmieri ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Adgpalmieri+updated%3A2026-04-09..2026-04-10&type=Issues)) | @segallagher ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Asegallagher+updated%3A2026-04-09..2026-04-10&type=Issues))
40
+
41
+ ## 0.2.5
42
+
43
+ ([Full Changelog](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/compare/v0.2.4...acb905136fd3b05e07da5e1c3da4ee88bec7aba9))
44
+
45
+ ### Bugs fixed
46
+
47
+ - Sg/fix url for deployment [#3](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/pull/3) ([@segallagher](https://github.com/segallagher), [@emlundell](https://github.com/emlundell))
48
+
49
+ ### Contributors to this release
50
+
51
+ The following people contributed discussions, new ideas, code and documentation contributions, and review.
52
+ See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
53
+
54
+ ([GitHub contributors page for this release](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/graphs/contributors?from=2026-04-07&to=2026-04-09&type=c))
55
+
56
+ @emlundell ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Aemlundell+updated%3A2026-04-07..2026-04-09&type=Issues)) | @segallagher ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Asegallagher+updated%3A2026-04-07..2026-04-09&type=Issues))
57
+
58
+ ## 0.2.4
59
+
60
+ ([Full Changelog](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/compare/v0.2.1...fa249abe827af836d7aa2ac0a870c4d30eff516e))
61
+
62
+ ### Enhancements made
63
+
64
+ - Update Functionality to be functional [#2](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/pull/2) ([@segallagher](https://github.com/segallagher), [@dgpalmieri](https://github.com/dgpalmieri))
65
+
66
+ ### Contributors to this release
67
+
68
+ The following people contributed discussions, new ideas, code and documentation contributions, and review.
69
+ See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
70
+
71
+ ([GitHub contributors page for this release](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/graphs/contributors?from=2026-04-06&to=2026-04-07&type=c))
72
+
73
+ @dgpalmieri ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Adgpalmieri+updated%3A2026-04-06..2026-04-07&type=Issues)) | @segallagher ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Asegallagher+updated%3A2026-04-06..2026-04-07&type=Issues))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nbgitpuller_jl_interface
3
- Version: 0.2.5
3
+ Version: 0.4.0
4
4
  Summary: A human interface with nbgitpuller in JupyterBook
5
5
  Project-URL: Homepage, https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface
6
6
  Project-URL: Bug Tracker, https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/issues
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '0.2.5'
4
+ __version__ = VERSION = '0.4.0'
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nbgitpuller-jl-interface",
3
- "version": "0.2.5",
3
+ "version": "0.4.0",
4
4
  "description": "A human interface with nbgitpuller in JupyterBook",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -117,7 +117,7 @@
117
117
  "outputDir": "nbgitpuller_jl_interface/labextension",
118
118
  "schemaDir": "schema",
119
119
  "_build": {
120
- "load": "static/remoteEntry.34a78c2aa73e0e0f2b81.js",
120
+ "load": "static/remoteEntry.b83083f7b0a432020f55.js",
121
121
  "extension": "./extension",
122
122
  "style": "./style"
123
123
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nbgitpuller-jl-interface",
3
- "version": "0.2.5",
3
+ "version": "0.4.0",
4
4
  "description": "A human interface with nbgitpuller in JupyterBook",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknbgitpuller_jl_interface=self.webpackChunknbgitpuller_jl_interface||[]).push([[293],{293(e,t,n){n.r(t),n.d(t,{default:()=>U,getJupyterAppInstance:()=>h});var o=n(813),i=n(53),r=n(247),a=n(41);const s="nbgitpuller-jl-interface-update-btn";let l,p=!1;async function c(e){const t=await async function(e){var t;let n=0,o=0;for(const i of e){const e=i.repoUrl,r=i.branch,s=i.destPath,l=a.PageConfig.getBaseUrl(),p=a.URLExt.join(l,"nbgitpuller-jl-interface","update-check"),c=null===(t=document.cookie.split(";").find(e=>e.startsWith("_xsrf=")))||void 0===t?void 0:t.split("=")[1],d=await fetch(p,{method:"POST",headers:{"Content-Type":"application/json","X-XSRFToken":null!=c?c:""},body:JSON.stringify({repositoryUrl:e,repositoryBranch:r,destination:s})}),u=await d.json();0!==u.returncode?o+=1:u.updatefound&&(n+=1)}return{response:{numToBeUpdated:n,numWithErrors:o},statuscode:0}}(e);if(0===t.statuscode){const n=t.response;let o,i;n.numWithErrors>0?(o=`${n.numWithErrors} notebooks with errors`,i=d.Error):n.numToBeUpdated>0?(o=`${n.numToBeUpdated} notebooks awaiting updates\n`,i=d.UpdateRequired):(o=`${e.length} Notebooks up to date`,i=d.UpToDate);const r=await u(i,o);0!==r.returncode&&console.error(r)}}var d;async function u(e,t){const n=document.getElementById(s);if(!n)return{error:"Unable to find nbgitpuller widget",returncode:1};let o;if(e===d.UpToDate)o='<p><span class="success">◉</span> Up to Date</p>';else if(e===d.Updating)o='<p><span class="lds-dual-ring"></span> Updating</p>';else if(e===d.UpdateRequired)o='<p><span class="pending blink">◉</span> Update Notebooks</p>';else if(e===d.Error)o='<p><span class="failure blink">◉</span> Update Error</p>';else{if(e!==d.Initializing)return{error:"Unknown widget state",returncode:2};o='<p><span class="">◉</span> Initializing</p>'}return n.title=t,n.innerHTML=function(e){return`\n <jp-button class="nbgitpuller-jl-interface-update-btn jp-ToolbarButtonComponent">\n ${e}\n </jp-button>`}(o),{error:"",returncode:0}}!function(e){e[e.UpToDate=0]="UpToDate",e[e.UpdateRequired=1]="UpdateRequired",e[e.Updating=2]="Updating",e[e.Error=3]="Error",e[e.Initializing=4]="Initializing"}(d||(d={}));var g=n(726),f=n(778);let b=null;function h(e){if(!b&&e&&(b=e),!b)throw new Error("App instance has not been initialized yet");return b}const w={id:"nbgitpuller-jl-interface:plugin",description:"A human interface with nbgitpuller in JupyterBook",autoStart:!0,optional:[],requires:[o.ILabShell,f.ICommandPalette,g.ISettingRegistry,o.JupyterFrontEnd.IPaths],activate:(e,t,n,o,g)=>{o?(Promise.all([e.restored,o.load(w.id)]).then(async([,t])=>{async function n(t){t.get("reloadWidget").composite&&(await async function(e,t){const n=t.get("repos").composite,o=t.get("rank").composite,l=(0,i.find)(e.shell.widgets("top"),e=>e.id===s);l&&l.dispose();const g=new r.Widget;g.id=s,g.addClass("lm-Widget"),g.addClass("jp-ToolbarButton"),g.addClass("nbgitpuller-jl-interface-wrapper"),g.node.addEventListener("click",async()=>{if(p)return;p=!0,await u(d.Updating,"Updating Notebooks...");const e=await async function(e){var t;const n=a.PageConfig.getBaseUrl(),o=a.URLExt.join(n,"nbgitpuller-jl-interface","gitpuller"),i=null===(t=document.cookie.split(";").find(e=>e.startsWith("_xsrf=")))||void 0===t?void 0:t.split("=")[1],r=[];for(const t of e){const e=t.repoUrl,n=t.branch,a=t.destPath,s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json","X-XSRFToken":null!=i?i:""},body:JSON.stringify({repositoryUrl:e,repositoryBranch:n,destination:a})}),l=await s.json();0!==l.returncode&&r.push({repo:e,reason:l.error})}return r}(n);if(await c(n),0!==e.length){let t="Failed to update the following notebooks: \n";for(const n of e)t+=`${n.repo}`;console.log(t),alert(t)}p=!1}),e.shell.add(g,"top",{rank:o}),await new Promise(e=>setTimeout(e,1e3)),await c(n),console.log("nbgitpuller-jl-interface settings loaded")}(e,t),await async function(e){const t=e.get("repos").composite,n=e.get("probeInterval").composite;clearInterval(l),l=setInterval(async()=>{await c(t)},n)}(t),await t.set("reloadWidget",!1))}await t.set("reloadWidget",!0),n(t),t.changed.connect(n),console.log("JupyterLab extension nbgitpuller-jl-interface is fully operational!")}).catch(e=>{console.error(`Something went wrong...${e}`)}),console.log("JupyterLab extension nbgitpuller-jl-interface is activated!")):console.log("Settings not found. nbgitpuller-jl-interface cannot be established.")}},U=w}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunknbgitpuller_jl_interface=self.webpackChunknbgitpuller_jl_interface||[]).push([[728],{475(n,e,t){t.d(e,{A:()=>s});var r=t(601),a=t.n(r),o=t(314),i=t.n(o)()(a());i.push([n.id,"/*\n See the JupyterLab Developer Guide for useful CSS Patterns:\n\n https://jupyterlab.readthedocs.io/en/stable/developer/css.html\n*/\n\n/* Manual button css */\n.nbgitpuller-jl-interface-update-btn {\n border: 1px solid #bdbdbd;\n border-radius: 15px;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n/* For jupyter created button css */\njp-button.nbgitpuller-jl-interface-update-btn {\n border: 1px solid #bdbdbd;\n border-radius: 15px;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.nbgitpuller-jl-interface-wrapper {\n padding-left: 10px !important;\n padding-right: 10px !important;\n flex-direction: column;\n display: flex;\n justify-content: center;\n}\n\n.success {\n color: #5cb85c;\n}\n\n.pending {\n color: #f29339;\n}\n\n.failure {\n color: #d63124;\n}\n\n.blink {\n animation: blinker-me-blinker 2s linear infinite;\n}\n\n@keyframes blinker-me-blinker {\n 50% {\n opacity: 0;\n }\n}\n\n/* https://loading.io/css/ */\n.lds-dual-ring,\n.lds-dual-ring::after {\n box-sizing: border-box;\n}\n\n.lds-dual-ring {\n display: inline-block;\n width: 10px;\n height: 10px;\n}\n\n.lds-dual-ring::after {\n content: ' ';\n display: block;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n border: 1.6px solid currentcolor;\n border-color: currentcolor transparent;\n animation: lds-dual-ring 1.2s linear infinite;\n}\n\n@keyframes lds-dual-ring {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n",""]);const s=i},314(n){n.exports=function(n){var e=[];return e.toString=function(){return this.map(function(e){var t="",r=void 0!==e[5];return e[4]&&(t+="@supports (".concat(e[4],") {")),e[2]&&(t+="@media ".concat(e[2]," {")),r&&(t+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),t+=n(e),r&&(t+="}"),e[2]&&(t+="}"),e[4]&&(t+="}"),t}).join("")},e.i=function(n,t,r,a,o){"string"==typeof n&&(n=[[null,n,void 0]]);var i={};if(r)for(var s=0;s<this.length;s++){var c=this[s][0];null!=c&&(i[c]=!0)}for(var l=0;l<n.length;l++){var d=[].concat(n[l]);r&&i[d[0]]||(void 0!==o&&(void 0===d[5]||(d[1]="@layer".concat(d[5].length>0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=o),t&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=t):d[2]=t),a&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=a):d[4]="".concat(a)),e.push(d))}},e}},601(n){n.exports=function(n){return n[1]}},72(n){var e=[];function t(n){for(var t=-1,r=0;r<e.length;r++)if(e[r].identifier===n){t=r;break}return t}function r(n,r){for(var o={},i=[],s=0;s<n.length;s++){var c=n[s],l=r.base?c[0]+r.base:c[0],d=o[l]||0,u="".concat(l," ").concat(d);o[l]=d+1;var p=t(u),f={css:c[1],media:c[2],sourceMap:c[3],supports:c[4],layer:c[5]};if(-1!==p)e[p].references++,e[p].updater(f);else{var b=a(f,r);r.byIndex=s,e.splice(s,0,{identifier:u,updater:b,references:1})}i.push(u)}return i}function a(n,e){var t=e.domAPI(e);return t.update(n),function(e){if(e){if(e.css===n.css&&e.media===n.media&&e.sourceMap===n.sourceMap&&e.supports===n.supports&&e.layer===n.layer)return;t.update(n=e)}else t.remove()}}n.exports=function(n,a){var o=r(n=n||[],a=a||{});return function(n){n=n||[];for(var i=0;i<o.length;i++){var s=t(o[i]);e[s].references--}for(var c=r(n,a),l=0;l<o.length;l++){var d=t(o[l]);0===e[d].references&&(e[d].updater(),e.splice(d,1))}o=c}}},659(n){var e={};n.exports=function(n,t){var r=function(n){if(void 0===e[n]){var t=document.querySelector(n);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(n){t=null}e[n]=t}return e[n]}(n);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(t)}},540(n){n.exports=function(n){var e=document.createElement("style");return n.setAttributes(e,n.attributes),n.insert(e,n.options),e}},56(n,e,t){n.exports=function(n){var e=t.nc;e&&n.setAttribute("nonce",e)}},825(n){n.exports=function(n){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var e=n.insertStyleElement(n);return{update:function(t){!function(n,e,t){var r="";t.supports&&(r+="@supports (".concat(t.supports,") {")),t.media&&(r+="@media ".concat(t.media," {"));var a=void 0!==t.layer;a&&(r+="@layer".concat(t.layer.length>0?" ".concat(t.layer):""," {")),r+=t.css,a&&(r+="}"),t.media&&(r+="}"),t.supports&&(r+="}");var o=t.sourceMap;o&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),e.styleTagTransform(r,n,e.options)}(e,n,t)},remove:function(){!function(n){if(null===n.parentNode)return!1;n.parentNode.removeChild(n)}(e)}}}},113(n){n.exports=function(n,e){if(e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}},728(n,e,t){var r=t(72),a=t.n(r),o=t(825),i=t.n(o),s=t(659),c=t.n(s),l=t(56),d=t.n(l),u=t(540),p=t.n(u),f=t(113),b=t.n(f),h=t(475),m={};m.styleTagTransform=b(),m.setAttributes=d(),m.insert=c().bind(null,"head"),m.domAPI=i(),m.insertStyleElement=p(),a()(h.A,m),h.A&&h.A.locals&&h.A.locals}}]);
@@ -1 +1 @@
1
- var _JUPYTERLAB;(()=>{"use strict";var e,r,t,n,o,a,i,l,u,f,s,c,p,d,h,v,g,b,m,y={234(e,r,t){var n={"./index":()=>t.e(293).then(()=>()=>t(293)),"./extension":()=>t.e(293).then(()=>()=>t(293)),"./style":()=>t.e(728).then(()=>()=>t(728))},o=(e,r)=>(t.R=r,r=t.o(n,e)?n[e]():Promise.resolve().then(()=>{throw new Error('Module "'+e+'" does not exist in container.')}),t.R=void 0,r),a=(e,r)=>{if(t.S){var n="default",o=t.S[n];if(o&&o!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[n]=e,t.I(n,r)}};t.d(r,{get:()=>o,init:()=>a})}},w={};function j(e){var r=w[e];if(void 0!==r)return r.exports;var t=w[e]={id:e,exports:{}};return y[e](t,t.exports,j),t.exports}j.m=y,j.c=w,j.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return j.d(r,{a:r}),r},j.d=(e,r)=>{for(var t in r)j.o(r,t)&&!j.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},j.f={},j.e=e=>Promise.all(Object.keys(j.f).reduce((r,t)=>(j.f[t](e,r),r),[])),j.u=e=>e+"."+{293:"d9c8968d6d528bad2399",728:"c80bd4566fc22d8dd093"}[e]+".js?v="+{293:"d9c8968d6d528bad2399",728:"c80bd4566fc22d8dd093"}[e],j.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),j.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e={},r="nbgitpuller-jl-interface:",j.l=(t,n,o,a)=>{if(e[t])e[t].push(n);else{var i,l;if(void 0!==o)for(var u=document.getElementsByTagName("script"),f=0;f<u.length;f++){var s=u[f];if(s.getAttribute("src")==t||s.getAttribute("data-webpack")==r+o){i=s;break}}i||(l=!0,(i=document.createElement("script")).charset="utf-8",j.nc&&i.setAttribute("nonce",j.nc),i.setAttribute("data-webpack",r+o),i.src=t),e[t]=[n];var c=(r,n)=>{i.onerror=i.onload=null,clearTimeout(p);var o=e[t];if(delete e[t],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach(e=>e(n)),r)return r(n)},p=setTimeout(c.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=c.bind(null,i.onerror),i.onload=c.bind(null,i.onload),l&&document.head.appendChild(i)}},j.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{j.S={};var e={},r={};j.I=(t,n)=>{n||(n=[]);var o=r[t];if(o||(o=r[t]={}),!(n.indexOf(o)>=0)){if(n.push(o),e[t])return e[t];j.o(j.S,t)||(j.S[t]={});var a=j.S[t],i="nbgitpuller-jl-interface",l=[];return"default"===t&&((e,r,t,n)=>{var o=a[e]=a[e]||{},l=o[r];(!l||!l.loaded&&(1!=!l.eager?n:i>l.from))&&(o[r]={get:()=>j.e(293).then(()=>()=>j(293)),from:i,eager:!1})})("nbgitpuller-jl-interface","0.2.5"),e[t]=l.length?Promise.all(l).then(()=>e[t]=1):1}}})(),(()=>{var e;j.g.importScripts&&(e=j.g.location+"");var r=j.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var n=t.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=t[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),j.p=e})(),t=e=>{var r=e=>e.split(".").map(e=>+e==e?+e:e),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),n=t[1]?r(t[1]):[];return t[2]&&(n.length++,n.push.apply(n,r(t[2]))),t[3]&&(n.push([]),n.push.apply(n,r(t[3]))),n},n=(e,r)=>{e=t(e),r=t(r);for(var n=0;;){if(n>=e.length)return n<r.length&&"u"!=(typeof r[n])[0];var o=e[n],a=(typeof o)[0];if(n>=r.length)return"u"==a;var i=r[n],l=(typeof i)[0];if(a!=l)return"o"==a&&"n"==l||"s"==l||"u"==a;if("o"!=a&&"u"!=a&&o!=i)return o<i;n++}},o=e=>{var r=e[0],t="";if(1===e.length)return"*";if(r+.5){t+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var n=1,a=1;a<e.length;a++)n--,t+="u"==(typeof(l=e[a]))[0]?"-":(n>0?".":"")+(n=2,l);return t}var i=[];for(a=1;a<e.length;a++){var l=e[a];i.push(0===l?"not("+u()+")":1===l?"("+u()+" || "+u()+")":2===l?i.pop()+" "+i.pop():o(l))}return u();function u(){return i.pop().replace(/^\((.+)\)$/,"$1")}},a=(e,r)=>{if(0 in e){r=t(r);var n=e[0],o=n<0;o&&(n=-n-1);for(var i=0,l=1,u=!0;;l++,i++){var f,s,c=l<e.length?(typeof e[l])[0]:"";if(i>=r.length||"o"==(s=(typeof(f=r[i]))[0]))return!u||("u"==c?l>n&&!o:""==c!=o);if("u"==s){if(!u||"u"!=c)return!1}else if(u)if(c==s)if(l<=n){if(f!=e[l])return!1}else{if(o?f>e[l]:f<e[l])return!1;f!=e[l]&&(u=!1)}else if("s"!=c&&"n"!=c){if(o||l<=n)return!1;u=!1,l--}else{if(l<=n||s<c!=o)return!1;u=!1}else"s"!=c&&"n"!=c&&(u=!1,l--)}}var p=[],d=p.pop.bind(p);for(i=1;i<e.length;i++){var h=e[i];p.push(1==h?d()|d():2==h?d()&d():h?a(h,r):!d())}return!!d()},i=(e,r)=>e&&j.o(e,r),l=e=>(e.loaded=1,e.get()),u=e=>Object.keys(e).reduce((r,t)=>(e[t].eager&&(r[t]=e[t]),r),{}),f=(e,r,t)=>{var o=t?u(e[r]):e[r];return Object.keys(o).reduce((e,r)=>!e||!o[e].loaded&&n(e,r)?r:e,0)},s=(e,r,t,n)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+o(n)+")",c=e=>{throw new Error(e)},p=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},d=(e,r,t)=>t?t():((e,r)=>c("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),h=(e=>function(r,t,n,o,a){var i=j.I(r);return i&&i.then&&!n?i.then(e.bind(e,r,j.S[r],t,!1,o,a)):e(r,j.S[r],t,n,o,a)})((e,r,t,n,o,u)=>{if(!i(r,t))return d(e,t,u);var c=f(r,t,n);return a(o,c)||p(s(r,t,c,o)),l(r[t][c])}),v={},g={53:()=>h("default","@lumino/algorithm",!1,[1,2,0,0]),726:()=>h("default","@jupyterlab/settingregistry",!1,[1,4,5,6]),778:()=>h("default","@jupyterlab/apputils",!1,[1,4,6,6]),813:()=>h("default","@jupyterlab/application",!1,[1,4,5,6])},b={293:[53,726,778,813]},m={},j.f.consumes=(e,r)=>{j.o(b,e)&&b[e].forEach(e=>{if(j.o(v,e))return r.push(v[e]);if(!m[e]){var t=r=>{v[e]=0,j.m[e]=t=>{delete j.c[e],t.exports=r()}};m[e]=!0;var n=r=>{delete v[e],j.m[e]=t=>{throw delete j.c[e],r}};try{var o=g[e]();o.then?r.push(v[e]=o.then(t).catch(n)):t(o)}catch(e){n(e)}}})},(()=>{var e={34:0};j.f.j=(r,t)=>{var n=j.o(e,r)?e[r]:void 0;if(0!==n)if(n)t.push(n[2]);else{var o=new Promise((t,o)=>n=e[r]=[t,o]);t.push(n[2]=o);var a=j.p+j.u(r),i=new Error;j.l(a,t=>{if(j.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var o=t&&("load"===t.type?"missing":t.type),a=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+o+": "+a+")",i.name="ChunkLoadError",i.type=o,i.request=a,n[1](i)}},"chunk-"+r,r)}};var r=(r,t)=>{var n,o,[a,i,l]=t,u=0;if(a.some(r=>0!==e[r])){for(n in i)j.o(i,n)&&(j.m[n]=i[n]);l&&l(j)}for(r&&r(t);u<a.length;u++)o=a[u],j.o(e,o)&&e[o]&&e[o][0](),e[o]=0},t=self.webpackChunknbgitpuller_jl_interface=self.webpackChunknbgitpuller_jl_interface||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),j.nc=void 0;var S=j(234);(_JUPYTERLAB=void 0===_JUPYTERLAB?{}:_JUPYTERLAB)["nbgitpuller-jl-interface"]=S})();
1
+ var _JUPYTERLAB;(()=>{"use strict";var e,r,t,n,o,a,i,l,u,f,s,d,p,c,h,v,g,b,m,y={234(e,r,t){var n={"./index":()=>t.e(293).then(()=>()=>t(293)),"./extension":()=>t.e(293).then(()=>()=>t(293)),"./style":()=>t.e(728).then(()=>()=>t(728))},o=(e,r)=>(t.R=r,r=t.o(n,e)?n[e]():Promise.resolve().then(()=>{throw new Error('Module "'+e+'" does not exist in container.')}),t.R=void 0,r),a=(e,r)=>{if(t.S){var n="default",o=t.S[n];if(o&&o!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[n]=e,t.I(n,r)}};t.d(r,{get:()=>o,init:()=>a})}},w={};function j(e){var r=w[e];if(void 0!==r)return r.exports;var t=w[e]={id:e,exports:{}};return y[e](t,t.exports,j),t.exports}j.m=y,j.c=w,j.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return j.d(r,{a:r}),r},j.d=(e,r)=>{for(var t in r)j.o(r,t)&&!j.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},j.f={},j.e=e=>Promise.all(Object.keys(j.f).reduce((r,t)=>(j.f[t](e,r),r),[])),j.u=e=>e+"."+{293:"24f6a6ad6689d54e2835",728:"1316db9caad2256ea253"}[e]+".js?v="+{293:"24f6a6ad6689d54e2835",728:"1316db9caad2256ea253"}[e],j.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),j.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e={},r="nbgitpuller-jl-interface:",j.l=(t,n,o,a)=>{if(e[t])e[t].push(n);else{var i,l;if(void 0!==o)for(var u=document.getElementsByTagName("script"),f=0;f<u.length;f++){var s=u[f];if(s.getAttribute("src")==t||s.getAttribute("data-webpack")==r+o){i=s;break}}i||(l=!0,(i=document.createElement("script")).charset="utf-8",j.nc&&i.setAttribute("nonce",j.nc),i.setAttribute("data-webpack",r+o),i.src=t),e[t]=[n];var d=(r,n)=>{i.onerror=i.onload=null,clearTimeout(p);var o=e[t];if(delete e[t],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach(e=>e(n)),r)return r(n)},p=setTimeout(d.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=d.bind(null,i.onerror),i.onload=d.bind(null,i.onload),l&&document.head.appendChild(i)}},j.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{j.S={};var e={},r={};j.I=(t,n)=>{n||(n=[]);var o=r[t];if(o||(o=r[t]={}),!(n.indexOf(o)>=0)){if(n.push(o),e[t])return e[t];j.o(j.S,t)||(j.S[t]={});var a=j.S[t],i="nbgitpuller-jl-interface",l=[];return"default"===t&&((e,r,t,n)=>{var o=a[e]=a[e]||{},l=o[r];(!l||!l.loaded&&(1!=!l.eager?n:i>l.from))&&(o[r]={get:()=>j.e(293).then(()=>()=>j(293)),from:i,eager:!1})})("nbgitpuller-jl-interface","0.4.0"),e[t]=l.length?Promise.all(l).then(()=>e[t]=1):1}}})(),(()=>{var e;j.g.importScripts&&(e=j.g.location+"");var r=j.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var n=t.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=t[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),j.p=e})(),t=e=>{var r=e=>e.split(".").map(e=>+e==e?+e:e),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),n=t[1]?r(t[1]):[];return t[2]&&(n.length++,n.push.apply(n,r(t[2]))),t[3]&&(n.push([]),n.push.apply(n,r(t[3]))),n},n=(e,r)=>{e=t(e),r=t(r);for(var n=0;;){if(n>=e.length)return n<r.length&&"u"!=(typeof r[n])[0];var o=e[n],a=(typeof o)[0];if(n>=r.length)return"u"==a;var i=r[n],l=(typeof i)[0];if(a!=l)return"o"==a&&"n"==l||"s"==l||"u"==a;if("o"!=a&&"u"!=a&&o!=i)return o<i;n++}},o=e=>{var r=e[0],t="";if(1===e.length)return"*";if(r+.5){t+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var n=1,a=1;a<e.length;a++)n--,t+="u"==(typeof(l=e[a]))[0]?"-":(n>0?".":"")+(n=2,l);return t}var i=[];for(a=1;a<e.length;a++){var l=e[a];i.push(0===l?"not("+u()+")":1===l?"("+u()+" || "+u()+")":2===l?i.pop()+" "+i.pop():o(l))}return u();function u(){return i.pop().replace(/^\((.+)\)$/,"$1")}},a=(e,r)=>{if(0 in e){r=t(r);var n=e[0],o=n<0;o&&(n=-n-1);for(var i=0,l=1,u=!0;;l++,i++){var f,s,d=l<e.length?(typeof e[l])[0]:"";if(i>=r.length||"o"==(s=(typeof(f=r[i]))[0]))return!u||("u"==d?l>n&&!o:""==d!=o);if("u"==s){if(!u||"u"!=d)return!1}else if(u)if(d==s)if(l<=n){if(f!=e[l])return!1}else{if(o?f>e[l]:f<e[l])return!1;f!=e[l]&&(u=!1)}else if("s"!=d&&"n"!=d){if(o||l<=n)return!1;u=!1,l--}else{if(l<=n||s<d!=o)return!1;u=!1}else"s"!=d&&"n"!=d&&(u=!1,l--)}}var p=[],c=p.pop.bind(p);for(i=1;i<e.length;i++){var h=e[i];p.push(1==h?c()|c():2==h?c()&c():h?a(h,r):!c())}return!!c()},i=(e,r)=>e&&j.o(e,r),l=e=>(e.loaded=1,e.get()),u=e=>Object.keys(e).reduce((r,t)=>(e[t].eager&&(r[t]=e[t]),r),{}),f=(e,r,t)=>{var o=t?u(e[r]):e[r];return Object.keys(o).reduce((e,r)=>!e||!o[e].loaded&&n(e,r)?r:e,0)},s=(e,r,t,n)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+o(n)+")",d=e=>{throw new Error(e)},p=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},c=(e,r,t)=>t?t():((e,r)=>d("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),h=(e=>function(r,t,n,o,a){var i=j.I(r);return i&&i.then&&!n?i.then(e.bind(e,r,j.S[r],t,!1,o,a)):e(r,j.S[r],t,n,o,a)})((e,r,t,n,o,u)=>{if(!i(r,t))return c(e,t,u);var d=f(r,t,n);return a(o,d)||p(s(r,t,d,o)),l(r[t][d])}),v={},g={41:()=>h("default","@jupyterlab/coreutils",!1,[1,6,5,6]),53:()=>h("default","@lumino/algorithm",!1,[1,2,0,0]),247:()=>h("default","@lumino/widgets",!1,[1,2,3,1,,"alpha",1]),726:()=>h("default","@jupyterlab/settingregistry",!1,[1,4,5,6]),778:()=>h("default","@jupyterlab/apputils",!1,[1,4,6,6]),813:()=>h("default","@jupyterlab/application",!1,[1,4,5,6])},b={293:[41,53,247,726,778,813]},m={},j.f.consumes=(e,r)=>{j.o(b,e)&&b[e].forEach(e=>{if(j.o(v,e))return r.push(v[e]);if(!m[e]){var t=r=>{v[e]=0,j.m[e]=t=>{delete j.c[e],t.exports=r()}};m[e]=!0;var n=r=>{delete v[e],j.m[e]=t=>{throw delete j.c[e],r}};try{var o=g[e]();o.then?r.push(v[e]=o.then(t).catch(n)):t(o)}catch(e){n(e)}}})},(()=>{var e={34:0};j.f.j=(r,t)=>{var n=j.o(e,r)?e[r]:void 0;if(0!==n)if(n)t.push(n[2]);else{var o=new Promise((t,o)=>n=e[r]=[t,o]);t.push(n[2]=o);var a=j.p+j.u(r),i=new Error;j.l(a,t=>{if(j.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var o=t&&("load"===t.type?"missing":t.type),a=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+o+": "+a+")",i.name="ChunkLoadError",i.type=o,i.request=a,n[1](i)}},"chunk-"+r,r)}};var r=(r,t)=>{var n,o,[a,i,l]=t,u=0;if(a.some(r=>0!==e[r])){for(n in i)j.o(i,n)&&(j.m[n]=i[n]);l&&l(j)}for(r&&r(t);u<a.length;u++)o=a[u],j.o(e,o)&&e[o]&&e[o][0](),e[o]=0},t=self.webpackChunknbgitpuller_jl_interface=self.webpackChunknbgitpuller_jl_interface||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),j.nc=void 0;var S=j(234);(_JUPYTERLAB=void 0===_JUPYTERLAB?{}:_JUPYTERLAB)["nbgitpuller-jl-interface"]=S})();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nbgitpuller-jl-interface",
3
- "version": "0.2.5",
3
+ "version": "0.4.0",
4
4
  "description": "A human interface with nbgitpuller in JupyterBook",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -10,7 +10,11 @@ import {
10
10
  it
11
11
  } from '@jest/globals';
12
12
 
13
- import { checkForRepoUpdates, setUpdateButtonDisplay } from '../utils';
13
+ import {
14
+ checkForRepoUpdates,
15
+ setUpdateButtonDisplay,
16
+ WidgetState
17
+ } from '../utils';
14
18
 
15
19
  describe('nbgitpuller-jl-interface utils checkForRepoUpdates', () => {
16
20
  beforeEach(() => {});
@@ -34,10 +38,9 @@ describe('nbgitpuller-jl-interface utils checkForRepoUpdates', () => {
34
38
  }) as unknown as Response
35
39
  );
36
40
 
37
- const returnValue = await checkForRepoUpdates(
38
- [{ repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' }],
39
- '/'
40
- );
41
+ const returnValue = await checkForRepoUpdates([
42
+ { repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' }
43
+ ]);
41
44
 
42
45
  expect(returnValue).toStrictEqual({
43
46
  response: { numToBeUpdated: 1, numWithErrors: 0 },
@@ -61,10 +64,9 @@ describe('nbgitpuller-jl-interface utils checkForRepoUpdates', () => {
61
64
  );
62
65
 
63
66
  // const returnValue = await fetch("https://aaagaag.com")
64
- const returnValue = await checkForRepoUpdates(
65
- [{ repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' }],
66
- '/'
67
- );
67
+ const returnValue = await checkForRepoUpdates([
68
+ { repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' }
69
+ ]);
68
70
 
69
71
  expect(returnValue).toStrictEqual({
70
72
  response: { numToBeUpdated: 0, numWithErrors: 1 },
@@ -116,14 +118,11 @@ describe('nbgitpuller-jl-interface utils checkForRepoUpdates', () => {
116
118
  );
117
119
 
118
120
  // const returnValue = await fetch("https://aaagaag.com")
119
- const returnValue = await checkForRepoUpdates(
120
- [
121
- { repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' },
122
- { repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' },
123
- { repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' }
124
- ],
125
- '/'
126
- );
121
+ const returnValue = await checkForRepoUpdates([
122
+ { repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' },
123
+ { repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' },
124
+ { repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' }
125
+ ]);
127
126
  expect(returnValue).toStrictEqual({
128
127
  response: { numToBeUpdated: 2, numWithErrors: 1 },
129
128
  statuscode: 0
@@ -139,45 +138,44 @@ describe('nbgitpuller-jl-interface utils setUpdateButtonDisplay', () => {
139
138
  document.body.innerHTML = '';
140
139
  });
141
140
 
142
- it('widget up to date populated', async () => {
141
+ it('widget up to date success', async () => {
143
142
  const widget = await document.createElement('div');
144
143
  widget.id = 'nbgitpuller-jl-interface-update-btn';
145
144
  document.body.appendChild(widget);
146
145
 
147
- const returnValue = await setUpdateButtonDisplay(
148
- true,
149
- '',
150
- [{ repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' }],
151
- '/'
152
- );
146
+ const returnValue = await setUpdateButtonDisplay(WidgetState.UpToDate, '');
153
147
 
154
148
  expect(returnValue).toStrictEqual({ error: '', returncode: 0 });
155
149
  expect(widget.innerHTML).toContain(`<span class="success">◉</span>`);
156
150
  });
157
151
 
158
- it('widget update needed populated', async () => {
152
+ it('widget update required', async () => {
159
153
  const widget = await document.createElement('div');
160
154
  widget.id = 'nbgitpuller-jl-interface-update-btn';
161
155
  document.body.appendChild(widget);
162
156
 
163
157
  const returnValue = await setUpdateButtonDisplay(
164
- false,
165
- '',
166
- [{ repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' }],
167
- '/'
158
+ WidgetState.UpdateRequired,
159
+ ''
168
160
  );
169
161
 
162
+ expect(returnValue).toStrictEqual({ error: '', returncode: 0 });
163
+ expect(widget.innerHTML).toContain(`<span class="pending blink">◉</span>`);
164
+ });
165
+
166
+ it('widget error', async () => {
167
+ const widget = await document.createElement('div');
168
+ widget.id = 'nbgitpuller-jl-interface-update-btn';
169
+ document.body.appendChild(widget);
170
+
171
+ const returnValue = await setUpdateButtonDisplay(WidgetState.Error, '');
172
+
170
173
  expect(returnValue).toStrictEqual({ error: '', returncode: 0 });
171
174
  expect(widget.innerHTML).toContain(`<span class="failure blink">◉</span>`);
172
175
  });
173
176
 
174
177
  it('widget not found', async () => {
175
- const returnValue = await setUpdateButtonDisplay(
176
- false,
177
- '',
178
- [{ repoUrl: 'https://fakerepo.com', branch: 'main', destPath: 'mypath' }],
179
- '/'
180
- );
178
+ const returnValue = await setUpdateButtonDisplay(WidgetState.Error, '');
181
179
 
182
180
  expect(returnValue).toStrictEqual({
183
181
  error: 'Unable to find nbgitpuller widget',
@@ -44,8 +44,6 @@ const plugin: JupyterFrontEndPlugin<void> = {
44
44
  settingRegistry: ISettingRegistry | null,
45
45
  paths: JupyterFrontEnd.IPaths
46
46
  ) => {
47
- const baseUrl = paths?.urls?.base;
48
-
49
47
  // Wait for the application to be restored and
50
48
  // for the settings for this plugin to be loaded
51
49
  if (!settingRegistry) {
@@ -62,23 +60,23 @@ const plugin: JupyterFrontEndPlugin<void> = {
62
60
  await settings.set('reloadWidget', true);
63
61
 
64
62
  async function loadSettings(
65
- allSettings: ISettingRegistry.ISettings,
66
- baseUrl: string
63
+ allSettings: ISettingRegistry.ISettings
67
64
  ): Promise<void> {
68
65
  const reloadWidget = allSettings.get('reloadWidget')
69
66
  .composite as boolean;
67
+
70
68
  if (reloadWidget) {
71
- await nbgitpullerUpdateButton(app, allSettings, baseUrl);
72
- await repoUpdateProbe(allSettings, baseUrl);
69
+ await nbgitpullerUpdateButton(app, allSettings);
70
+ await repoUpdateProbe(allSettings);
73
71
  await allSettings.set('reloadWidget', false);
74
72
  }
75
73
  }
76
74
 
77
75
  // Read the settings
78
- loadSettings(settings, baseUrl);
76
+ loadSettings(settings);
79
77
 
80
78
  // Listen for your plugin setting changes using Signal
81
- settings.changed.connect(settings => loadSettings(settings, baseUrl));
79
+ settings.changed.connect(loadSettings);
82
80
 
83
81
  console.log(
84
82
  'JupyterLab extension nbgitpuller-jl-interface is fully operational!'
@@ -1,11 +1,13 @@
1
1
  import { JupyterFrontEnd } from '@jupyterlab/application';
2
2
 
3
- import { ToolbarButton } from '@jupyterlab/apputils';
4
-
5
3
  import { find } from '@lumino/algorithm';
6
4
 
5
+ import { Widget } from '@lumino/widgets';
6
+
7
7
  import { ISettingRegistry } from '@jupyterlab/settingregistry';
8
8
 
9
+ import { PageConfig, URLExt } from '@jupyterlab/coreutils';
10
+
9
11
  const widget_id = 'nbgitpuller-jl-interface-update-btn';
10
12
  let intervalID: ReturnType<typeof setInterval>;
11
13
  let currentlyUpdating: boolean = false;
@@ -18,8 +20,7 @@ export interface IRepository {
18
20
 
19
21
  export async function nbgitpullerUpdateButton(
20
22
  app: JupyterFrontEnd,
21
- allSettings: ISettingRegistry.ISettings,
22
- baseUrl: string
23
+ allSettings: ISettingRegistry.ISettings
23
24
  ): Promise<void> {
24
25
  const repositories = allSettings.get('repos')
25
26
  .composite as any as IRepository[];
@@ -31,29 +32,58 @@ export async function nbgitpullerUpdateButton(
31
32
  widget.dispose();
32
33
  }
33
34
 
34
- // Create widget
35
- const updateReposBtn = new ToolbarButton({
36
- className: 'nbgitpuller-jl-interface-update-btn',
37
- label: '◉ Initializing',
38
- tooltip: 'Initializing nbgitpuller'
35
+ const newWidget = new Widget();
36
+ newWidget.id = widget_id;
37
+ newWidget.addClass('lm-Widget');
38
+ newWidget.addClass('jp-ToolbarButton');
39
+ newWidget.addClass('nbgitpuller-jl-interface-wrapper');
40
+ newWidget.node.addEventListener('click', async () => {
41
+ // Throttle updating
42
+ if (currentlyUpdating) {
43
+ return;
44
+ }
45
+ // Set updating flag
46
+ currentlyUpdating = true;
47
+
48
+ // Update widget to running animation
49
+ const pendingTooltip = 'Updating Notebooks...';
50
+ await setUpdateButtonDisplay(WidgetState.Updating, pendingTooltip);
51
+
52
+ // Pull each repository
53
+ const failed_updates = await makeNbgitpullerRequest(repositories);
54
+
55
+ // Update widget to all updated or pending updates
56
+ await checkForUpdatesAndSetDisplay(repositories);
57
+
58
+ // Notify users of any failure
59
+ if (failed_updates.length !== 0) {
60
+ let failure_message = 'Failed to update the following notebooks: \n';
61
+ for (const failure of failed_updates) {
62
+ failure_message += `${failure['repo']}`;
63
+ }
64
+ console.log(failure_message);
65
+ alert(failure_message);
66
+ }
67
+
68
+ // Unset updating flag
69
+ currentlyUpdating = false;
39
70
  });
40
- updateReposBtn.id = widget_id;
41
- updateReposBtn.addClass('nbgitpuller-jl-interface-wrapper');
71
+
42
72
  // 1-899 left justified, 900+ right justified
43
- app.shell.add(updateReposBtn, 'top', { rank: rank });
73
+ app.shell.add(newWidget, 'top', { rank: rank });
74
+
75
+ // Wait one second for initial creation timing
76
+ await new Promise(f => setTimeout(f, 1000));
44
77
 
45
78
  // Check for updates
46
- checkForUpdatesAndSetDisplay(repositories, baseUrl);
79
+ await checkForUpdatesAndSetDisplay(repositories);
47
80
 
48
81
  console.log('nbgitpuller-jl-interface settings loaded');
49
82
  }
50
83
 
51
- export async function makeNbgitpullerRequest(
52
- repositories: IRepository[],
53
- baseUrl: string
54
- ) {
55
- const url =
56
- window.location.origin + baseUrl + 'nbgitpuller-jl-interface/gitpuller';
84
+ export async function makeNbgitpullerRequest(repositories: IRepository[]) {
85
+ const baseUrl = PageConfig.getBaseUrl();
86
+ const url = URLExt.join(baseUrl, 'nbgitpuller-jl-interface', 'gitpuller');
57
87
  const xsrfToken = document.cookie
58
88
  .split(';')
59
89
  .find(row => row.startsWith('_xsrf='))
@@ -90,8 +120,7 @@ export async function makeNbgitpullerRequest(
90
120
  }
91
121
 
92
122
  export async function repoUpdateProbe(
93
- allSettings: ISettingRegistry.ISettings,
94
- baseUrl: string
123
+ allSettings: ISettingRegistry.ISettings
95
124
  ): Promise<void> {
96
125
  const repositories = allSettings.get('repos')
97
126
  .composite as any as IRepository[];
@@ -102,13 +131,12 @@ export async function repoUpdateProbe(
102
131
 
103
132
  // Create interval
104
133
  intervalID = setInterval(async () => {
105
- checkForUpdatesAndSetDisplay(repositories, baseUrl);
134
+ await checkForUpdatesAndSetDisplay(repositories);
106
135
  }, probeInterval);
107
136
  }
108
137
 
109
138
  export async function checkForRepoUpdates(
110
- repositories: IRepository[],
111
- baseUrl: string
139
+ repositories: IRepository[]
112
140
  ): Promise<{
113
141
  response: { numToBeUpdated: number; numWithErrors: number };
114
142
  statuscode: number;
@@ -123,10 +151,12 @@ export async function checkForRepoUpdates(
123
151
  const destination = repo['destPath'];
124
152
 
125
153
  // Poll repo for any new commits
126
- const url =
127
- window.location.origin +
128
- baseUrl +
129
- 'nbgitpuller-jl-interface/update-check';
154
+ const baseUrl = PageConfig.getBaseUrl();
155
+ const url = URLExt.join(
156
+ baseUrl,
157
+ 'nbgitpuller-jl-interface',
158
+ 'update-check'
159
+ );
130
160
  const xsrfToken = document.cookie
131
161
  .split(';')
132
162
  .find(row => row.startsWith('_xsrf='))
@@ -162,39 +192,35 @@ export async function checkForRepoUpdates(
162
192
  }
163
193
 
164
194
  export async function checkForUpdatesAndSetDisplay(
165
- repositories: IRepository[],
166
- baseUrl: string
195
+ repositories: IRepository[]
167
196
  ) {
168
197
  // Check for updates
169
- const repoUpdates = await checkForRepoUpdates(repositories, baseUrl);
198
+ const repoUpdates = await checkForRepoUpdates(repositories);
199
+
170
200
  // Update display
171
201
  if (repoUpdates['statuscode'] === 0) {
172
202
  const updateCheckResponse = repoUpdates['response'] as {
173
203
  numToBeUpdated: number;
174
204
  numWithErrors: number;
175
205
  };
206
+
176
207
  // Generate tooltip
177
- let tooltip = '';
178
- if (
179
- updateCheckResponse['numToBeUpdated'] +
180
- updateCheckResponse['numWithErrors']
181
- ) {
182
- if (updateCheckResponse['numToBeUpdated']) {
183
- tooltip += `${updateCheckResponse['numToBeUpdated']} awaiting updates\n`;
184
- }
185
- if (updateCheckResponse['numWithErrors']) {
186
- tooltip += `${updateCheckResponse['numWithErrors']} repos with errors`;
187
- }
208
+ let tooltip;
209
+ let widgetState;
210
+ if (updateCheckResponse['numWithErrors'] > 0) {
211
+ tooltip = `${updateCheckResponse['numWithErrors']} notebooks with errors`;
212
+ widgetState = WidgetState.Error;
213
+ } else if (updateCheckResponse['numToBeUpdated'] > 0) {
214
+ tooltip = `${updateCheckResponse['numToBeUpdated']} notebooks awaiting updates\n`;
215
+ widgetState = WidgetState.UpdateRequired;
188
216
  } else {
189
- tooltip = `${repositories.length} Repos up to date`;
217
+ tooltip = `${repositories.length} Notebooks up to date`;
218
+ widgetState = WidgetState.UpToDate;
190
219
  }
220
+
191
221
  const updateDisplayResponse = await setUpdateButtonDisplay(
192
- updateCheckResponse['numToBeUpdated'] +
193
- updateCheckResponse['numWithErrors'] ===
194
- 0,
195
- tooltip,
196
- repositories,
197
- baseUrl
222
+ widgetState,
223
+ tooltip
198
224
  );
199
225
  if (updateDisplayResponse.returncode !== 0) {
200
226
  console.error(updateDisplayResponse);
@@ -202,11 +228,17 @@ export async function checkForUpdatesAndSetDisplay(
202
228
  }
203
229
  }
204
230
 
231
+ export enum WidgetState {
232
+ UpToDate,
233
+ UpdateRequired,
234
+ Updating,
235
+ Error,
236
+ Initializing
237
+ }
238
+
205
239
  export async function setUpdateButtonDisplay(
206
- upToDate: boolean,
207
- tooltip: string,
208
- repositories: IRepository[],
209
- baseUrl: string
240
+ targetWidgetState: WidgetState,
241
+ tooltip: string
210
242
  ): Promise<{ error: string; returncode: number }> {
211
243
  // Get widget
212
244
  const widget: HTMLElement | null = document.getElementById(widget_id);
@@ -216,56 +248,30 @@ export async function setUpdateButtonDisplay(
216
248
 
217
249
  // Create button label html
218
250
  let labelHTML;
219
- if (upToDate) {
251
+ if (targetWidgetState === WidgetState.UpToDate) {
220
252
  labelHTML = '<p><span class="success">◉</span> Up to Date</p>';
253
+ } else if (targetWidgetState === WidgetState.Updating) {
254
+ labelHTML = '<p><span class="lds-dual-ring"></span> Updating</p>';
255
+ } else if (targetWidgetState === WidgetState.UpdateRequired) {
256
+ labelHTML = '<p><span class="pending blink">◉</span> Update Notebooks</p>';
257
+ } else if (targetWidgetState === WidgetState.Error) {
258
+ labelHTML = '<p><span class="failure blink">◉</span> Update Error</p>';
259
+ } else if (targetWidgetState === WidgetState.Initializing) {
260
+ labelHTML = '<p><span class="">◉</span> Initializing</p>';
221
261
  } else {
222
- labelHTML = '<p><span class="failure blink">◉</span> Update Repos</p>';
262
+ return { error: 'Unknown widget state', returncode: 2 };
223
263
  }
224
264
 
225
- function generateWidgetHTML(tooltip: string, labelHTML: string): string {
265
+ function generateWidgetHTML(labelHTML: string): string {
226
266
  return `
227
- <div class="lm-Widget jp-ToolbarButton nbgitpuller-jl-interface-wrapper"
228
- title="${tooltip}">
229
267
  <jp-button class="nbgitpuller-jl-interface-update-btn jp-ToolbarButtonComponent">
230
268
  ${labelHTML}
231
- </jp-button>
232
- </div>`;
269
+ </jp-button>`;
233
270
  }
234
271
 
235
272
  // Update widget functionality
236
- widget.innerHTML = generateWidgetHTML(tooltip, labelHTML);
237
- widget.addEventListener('click', async () => {
238
- // Throttle updating
239
- if (currentlyUpdating) {
240
- return;
241
- }
242
- // Set updating flag
243
- currentlyUpdating = true;
244
- // Update widget to running animation
245
- const pendingTooltip = 'Updating Repos...';
246
- const pendingLabelHTML =
247
- '<p><span class="lds-dual-ring"></span> Updating</p>';
248
- widget.innerHTML = generateWidgetHTML(pendingTooltip, pendingLabelHTML);
249
-
250
- // Pull each repository
251
- const failed_updates = await makeNbgitpullerRequest(repositories, baseUrl);
252
-
253
- // Update widget to all updated or pending updates
254
- checkForUpdatesAndSetDisplay(repositories, baseUrl);
255
-
256
- // Notify users of any failure
257
- if (failed_updates.length !== 0) {
258
- let failure_message = 'Failed to update the following repos: \n';
259
- for (const failure of failed_updates) {
260
- failure_message += `${failure['repo']}`;
261
- }
262
- console.log(failure_message);
263
- alert(failure_message);
264
- }
265
-
266
- // Unset updating flag
267
- currentlyUpdating = false;
268
- });
273
+ widget.title = tooltip;
274
+ widget.innerHTML = generateWidgetHTML(labelHTML);
269
275
 
270
276
  return { error: '', returncode: 0 };
271
277
  }
@@ -32,6 +32,10 @@ jp-button.nbgitpuller-jl-interface-update-btn {
32
32
  color: #5cb85c;
33
33
  }
34
34
 
35
+ .pending {
36
+ color: #f29339;
37
+ }
38
+
35
39
  .failure {
36
40
  color: #d63124;
37
41
  }
@@ -1,39 +0,0 @@
1
- # Changelog
2
-
3
- <!-- <START NEW CHANGELOG ENTRY> -->
4
-
5
- ## 0.2.5
6
-
7
- ([Full Changelog](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/compare/v0.2.4...acb905136fd3b05e07da5e1c3da4ee88bec7aba9))
8
-
9
- ### Bugs fixed
10
-
11
- - Sg/fix url for deployment [#3](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/pull/3) ([@segallagher](https://github.com/segallagher), [@emlundell](https://github.com/emlundell))
12
-
13
- ### Contributors to this release
14
-
15
- The following people contributed discussions, new ideas, code and documentation contributions, and review.
16
- See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
17
-
18
- ([GitHub contributors page for this release](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/graphs/contributors?from=2026-04-07&to=2026-04-09&type=c))
19
-
20
- @emlundell ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Aemlundell+updated%3A2026-04-07..2026-04-09&type=Issues)) | @segallagher ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Asegallagher+updated%3A2026-04-07..2026-04-09&type=Issues))
21
-
22
- <!-- <END NEW CHANGELOG ENTRY> -->
23
-
24
- ## 0.2.4
25
-
26
- ([Full Changelog](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/compare/v0.2.1...fa249abe827af836d7aa2ac0a870c4d30eff516e))
27
-
28
- ### Enhancements made
29
-
30
- - Update Functionality to be functional [#2](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/pull/2) ([@segallagher](https://github.com/segallagher), [@dgpalmieri](https://github.com/dgpalmieri))
31
-
32
- ### Contributors to this release
33
-
34
- The following people contributed discussions, new ideas, code and documentation contributions, and review.
35
- See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
36
-
37
- ([GitHub contributors page for this release](https://github.com/ASFOpenSARlab/nbgitpuller-jl-interface/graphs/contributors?from=2026-04-06&to=2026-04-07&type=c))
38
-
39
- @dgpalmieri ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Adgpalmieri+updated%3A2026-04-06..2026-04-07&type=Issues)) | @segallagher ([activity](https://github.com/search?q=repo%3AASFOpenSARlab%2Fnbgitpuller-jl-interface+involves%3Asegallagher+updated%3A2026-04-06..2026-04-07&type=Issues))
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunknbgitpuller_jl_interface=self.webpackChunknbgitpuller_jl_interface||[]).push([[293],{293(t,e,n){n.r(e),n.d(e,{default:()=>f,getJupyterAppInstance:()=>d});var o=n(813),r=n(778),i=n(53);const a="nbgitpuller-jl-interface-update-btn";let l,s=!1;async function c(t,e){const n=await async function(t,e){var n;let o=0,r=0;for(const i of t){const t=i.repoUrl,a=i.branch,l=i.destPath,s=window.location.origin+e+"nbgitpuller-jl-interface/update-check",c=null===(n=document.cookie.split(";").find(t=>t.startsWith("_xsrf=")))||void 0===n?void 0:n.split("=")[1],p=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json","X-XSRFToken":null!=c?c:""},body:JSON.stringify({repositoryUrl:t,repositoryBranch:a,destination:l})}),u=await p.json();0!==u.returncode?r+=1:u.updatefound&&(o+=1)}return{response:{numToBeUpdated:o,numWithErrors:r},statuscode:0}}(t,e);if(0===n.statuscode){const o=n.response;let r="";o.numToBeUpdated+o.numWithErrors?(o.numToBeUpdated&&(r+=`${o.numToBeUpdated} awaiting updates\n`),o.numWithErrors&&(r+=`${o.numWithErrors} repos with errors`)):r=`${t.length} Repos up to date`;const i=await async function(t,e,n,o){const r=document.getElementById(a);if(!r)return{error:"Unable to find nbgitpuller widget",returncode:1};let i;function l(t,e){return`\n <div class="lm-Widget jp-ToolbarButton nbgitpuller-jl-interface-wrapper"\n title="${t}">\n <jp-button class="nbgitpuller-jl-interface-update-btn jp-ToolbarButtonComponent">\n ${e}\n </jp-button>\n </div>`}return i=t?'<p><span class="success">◉</span> Up to Date</p>':'<p><span class="failure blink">◉</span> Update Repos</p>',r.innerHTML=l(e,i),r.addEventListener("click",async()=>{if(s)return;s=!0;r.innerHTML=l("Updating Repos...",'<p><span class="lds-dual-ring"></span> Updating</p>');const t=await async function(t,e){var n;const o=window.location.origin+e+"nbgitpuller-jl-interface/gitpuller",r=null===(n=document.cookie.split(";").find(t=>t.startsWith("_xsrf=")))||void 0===n?void 0:n.split("=")[1],i=[];for(const e of t){const t=e.repoUrl,n=e.branch,a=e.destPath,l=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json","X-XSRFToken":null!=r?r:""},body:JSON.stringify({repositoryUrl:t,repositoryBranch:n,destination:a})}),s=await l.json();0!==s.returncode&&i.push({repo:t,reason:s.error})}return i}(n,o);if(c(n,o),0!==t.length){let e="Failed to update the following repos: \n";for(const n of t)e+=`${n.repo}`;console.log(e),alert(e)}s=!1}),{error:"",returncode:0}}(o.numToBeUpdated+o.numWithErrors===0,r,t,e);0!==i.returncode&&console.error(i)}}var p=n(726);let u=null;function d(t){if(!u&&t&&(u=t),!u)throw new Error("App instance has not been initialized yet");return u}const g={id:"nbgitpuller-jl-interface:plugin",description:"A human interface with nbgitpuller in JupyterBook",autoStart:!0,optional:[],requires:[o.ILabShell,r.ICommandPalette,p.ISettingRegistry,o.JupyterFrontEnd.IPaths],activate:(t,e,n,o,s)=>{var p;const u=null===(p=null==s?void 0:s.urls)||void 0===p?void 0:p.base;o?(Promise.all([t.restored,o.load(g.id)]).then(async([,e])=>{async function n(e,n){e.get("reloadWidget").composite&&(await async function(t,e,n){const o=e.get("repos").composite,l=e.get("rank").composite,s=(0,i.find)(t.shell.widgets("top"),t=>t.id===a);s&&s.dispose();const p=new r.ToolbarButton({className:"nbgitpuller-jl-interface-update-btn",label:"◉ Initializing",tooltip:"Initializing nbgitpuller"});p.id=a,p.addClass("nbgitpuller-jl-interface-wrapper"),t.shell.add(p,"top",{rank:l}),c(o,n),console.log("nbgitpuller-jl-interface settings loaded")}(t,e,n),await async function(t,e){const n=t.get("repos").composite,o=t.get("probeInterval").composite;clearInterval(l),l=setInterval(async()=>{c(n,e)},o)}(e,n),await e.set("reloadWidget",!1))}await e.set("reloadWidget",!0),n(e,u),e.changed.connect(t=>n(t,u)),console.log("JupyterLab extension nbgitpuller-jl-interface is fully operational!")}).catch(t=>{console.error(`Something went wrong...${t}`)}),console.log("JupyterLab extension nbgitpuller-jl-interface is activated!")):console.log("Settings not found. nbgitpuller-jl-interface cannot be established.")}},f=g}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunknbgitpuller_jl_interface=self.webpackChunknbgitpuller_jl_interface||[]).push([[728],{475(n,e,t){t.d(e,{A:()=>s});var r=t(601),a=t.n(r),o=t(314),i=t.n(o)()(a());i.push([n.id,"/*\n See the JupyterLab Developer Guide for useful CSS Patterns:\n\n https://jupyterlab.readthedocs.io/en/stable/developer/css.html\n*/\n\n/* Manual button css */\n.nbgitpuller-jl-interface-update-btn {\n border: 1px solid #bdbdbd;\n border-radius: 15px;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n/* For jupyter created button css */\njp-button.nbgitpuller-jl-interface-update-btn {\n border: 1px solid #bdbdbd;\n border-radius: 15px;\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.nbgitpuller-jl-interface-wrapper {\n padding-left: 10px !important;\n padding-right: 10px !important;\n flex-direction: column;\n display: flex;\n justify-content: center;\n}\n\n.success {\n color: #5cb85c;\n}\n\n.failure {\n color: #d63124;\n}\n\n.blink {\n animation: blinker-me-blinker 2s linear infinite;\n}\n\n@keyframes blinker-me-blinker {\n 50% {\n opacity: 0;\n }\n}\n\n/* https://loading.io/css/ */\n.lds-dual-ring,\n.lds-dual-ring::after {\n box-sizing: border-box;\n}\n\n.lds-dual-ring {\n display: inline-block;\n width: 10px;\n height: 10px;\n}\n\n.lds-dual-ring::after {\n content: ' ';\n display: block;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n border: 1.6px solid currentcolor;\n border-color: currentcolor transparent;\n animation: lds-dual-ring 1.2s linear infinite;\n}\n\n@keyframes lds-dual-ring {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n",""]);const s=i},314(n){n.exports=function(n){var e=[];return e.toString=function(){return this.map(function(e){var t="",r=void 0!==e[5];return e[4]&&(t+="@supports (".concat(e[4],") {")),e[2]&&(t+="@media ".concat(e[2]," {")),r&&(t+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),t+=n(e),r&&(t+="}"),e[2]&&(t+="}"),e[4]&&(t+="}"),t}).join("")},e.i=function(n,t,r,a,o){"string"==typeof n&&(n=[[null,n,void 0]]);var i={};if(r)for(var s=0;s<this.length;s++){var c=this[s][0];null!=c&&(i[c]=!0)}for(var l=0;l<n.length;l++){var d=[].concat(n[l]);r&&i[d[0]]||(void 0!==o&&(void 0===d[5]||(d[1]="@layer".concat(d[5].length>0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=o),t&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=t):d[2]=t),a&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=a):d[4]="".concat(a)),e.push(d))}},e}},601(n){n.exports=function(n){return n[1]}},72(n){var e=[];function t(n){for(var t=-1,r=0;r<e.length;r++)if(e[r].identifier===n){t=r;break}return t}function r(n,r){for(var o={},i=[],s=0;s<n.length;s++){var c=n[s],l=r.base?c[0]+r.base:c[0],d=o[l]||0,u="".concat(l," ").concat(d);o[l]=d+1;var p=t(u),f={css:c[1],media:c[2],sourceMap:c[3],supports:c[4],layer:c[5]};if(-1!==p)e[p].references++,e[p].updater(f);else{var b=a(f,r);r.byIndex=s,e.splice(s,0,{identifier:u,updater:b,references:1})}i.push(u)}return i}function a(n,e){var t=e.domAPI(e);return t.update(n),function(e){if(e){if(e.css===n.css&&e.media===n.media&&e.sourceMap===n.sourceMap&&e.supports===n.supports&&e.layer===n.layer)return;t.update(n=e)}else t.remove()}}n.exports=function(n,a){var o=r(n=n||[],a=a||{});return function(n){n=n||[];for(var i=0;i<o.length;i++){var s=t(o[i]);e[s].references--}for(var c=r(n,a),l=0;l<o.length;l++){var d=t(o[l]);0===e[d].references&&(e[d].updater(),e.splice(d,1))}o=c}}},659(n){var e={};n.exports=function(n,t){var r=function(n){if(void 0===e[n]){var t=document.querySelector(n);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(n){t=null}e[n]=t}return e[n]}(n);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(t)}},540(n){n.exports=function(n){var e=document.createElement("style");return n.setAttributes(e,n.attributes),n.insert(e,n.options),e}},56(n,e,t){n.exports=function(n){var e=t.nc;e&&n.setAttribute("nonce",e)}},825(n){n.exports=function(n){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var e=n.insertStyleElement(n);return{update:function(t){!function(n,e,t){var r="";t.supports&&(r+="@supports (".concat(t.supports,") {")),t.media&&(r+="@media ".concat(t.media," {"));var a=void 0!==t.layer;a&&(r+="@layer".concat(t.layer.length>0?" ".concat(t.layer):""," {")),r+=t.css,a&&(r+="}"),t.media&&(r+="}"),t.supports&&(r+="}");var o=t.sourceMap;o&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),e.styleTagTransform(r,n,e.options)}(e,n,t)},remove:function(){!function(n){if(null===n.parentNode)return!1;n.parentNode.removeChild(n)}(e)}}}},113(n){n.exports=function(n,e){if(e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}},728(n,e,t){var r=t(72),a=t.n(r),o=t(825),i=t.n(o),s=t(659),c=t.n(s),l=t(56),d=t.n(l),u=t(540),p=t.n(u),f=t(113),b=t.n(f),h=t(475),m={};m.styleTagTransform=b(),m.setAttributes=d(),m.insert=c().bind(null,"head"),m.domAPI=i(),m.insertStyleElement=p(),a()(h.A,m),h.A&&h.A.locals&&h.A.locals}}]);