@gen3/workspaces 0.12.63 → 0.12.64

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 (131) hide show
  1. package/dist/dts/components/MicroContainerPanel.stories.d.ts +6 -2
  2. package/dist/dts/components/MicroContainerPanel.stories.d.ts.map +1 -1
  3. package/dist/dts/components/MicroContainerPanel.stories.js +1 -1
  4. package/dist/dts/components/MicroContainerPanel.stories.js.map +1 -1
  5. package/dist/dts/components/MicroContainerReduxPanel.d.ts +3 -5
  6. package/dist/dts/components/MicroContainerReduxPanel.d.ts.map +1 -1
  7. package/dist/dts/components/MicroContainerReduxPanel.js +32 -6
  8. package/dist/dts/components/MicroContainerReduxPanel.js.map +1 -1
  9. package/dist/dts/pages/WorkspacesCenter/data.d.ts.map +1 -1
  10. package/dist/dts/pages/WorkspacesCenter/data.js +4 -1
  11. package/dist/dts/pages/WorkspacesCenter/data.js.map +1 -1
  12. package/dist/dts/providers/types.d.ts +1 -1
  13. package/dist/dts/providers/types.d.ts.map +1 -1
  14. package/dist/dts/providers/useMicroContainerRedux.d.ts.map +1 -1
  15. package/dist/dts/providers/useMicroContainerRedux.js +8 -2
  16. package/dist/dts/providers/useMicroContainerRedux.js.map +1 -1
  17. package/dist/dts/workspace/WorkspaceCenter.d.ts.map +1 -1
  18. package/dist/dts/workspace/WorkspaceCenter.js +1 -1
  19. package/dist/dts/workspace/WorkspaceCenter.js.map +1 -1
  20. package/dist/dts/workspace/WorkspaceLayout/WorkspaceLayout.d.ts.map +1 -1
  21. package/dist/dts/workspace/WorkspaceLayout/WorkspaceLayout.js +1 -1
  22. package/dist/dts/workspace/WorkspaceLayout/WorkspaceLayout.js.map +1 -1
  23. package/dist/dts/workspace/tiers/RemoteComputeWorkspace.d.ts +1 -0
  24. package/dist/dts/workspace/tiers/RemoteComputeWorkspace.d.ts.map +1 -1
  25. package/dist/dts/workspace/tiers/RemoteComputeWorkspace.js +2 -2
  26. package/dist/dts/workspace/tiers/RemoteComputeWorkspace.js.map +1 -1
  27. package/dist/dts/workspace/tiers/types.d.ts +2 -0
  28. package/dist/dts/workspace/tiers/types.d.ts.map +1 -1
  29. package/dist/index/cjs/index.js +97 -25
  30. package/dist/index/cjs/index.js.map +1 -1
  31. package/dist/index/esm/index.js +98 -26
  32. package/dist/index/esm/index.js.map +1 -1
  33. package/dist/index.d.ts +2 -0
  34. package/dist/jupyterlite-builds/scripts/build-gen3sdk-lite_v2.sh +310 -0
  35. package/dist/jupyterlite-builds/scripts/build-jupyterlite_v2.sh +111 -0
  36. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/aiofiles-25.1.0-py3-none-any.whl +0 -0
  37. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/backoff-2.2.1-py3-none-any.whl +0 -0
  38. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/comm-0.2.3-py3-none-any.whl +0 -0
  39. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/dataclasses_json-0.5.9-py3-none-any.whl +0 -0
  40. package/{dist/jupyterlite-builds/free-private/dist → jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels}/dictionaryutils-4.0.0-py3-none-any.whl +0 -0
  41. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/fastavro-1.12.2-py3-none-any.whl +0 -0
  42. package/{dist/jupyterlite-builds/free-private/dist/gen3-4.28.2-py3-none-any.whl → jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/gen3-4.28.3-py3-none-any.whl} +0 -0
  43. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/gen3dictionary-3.0.0-py3-none-any.whl +0 -0
  44. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/gen3users-1.1.1-py3-none-any.whl +0 -0
  45. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/humanfriendly-10.0-py2.py3-none-any.whl +0 -0
  46. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/importlib_metadata-8.9.0-py3-none-any.whl +0 -0
  47. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/indexclient-6.3.0-py3-none-any.whl +0 -0
  48. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/ipykernel-6.9.2-py3-none-any.whl +0 -0
  49. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/ipython_pygments_lexers-1.1.1-py3-none-any.whl +0 -0
  50. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/marshmallow-3.26.2-py3-none-any.whl +0 -0
  51. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/marshmallow_enum-1.5.1-py2.py3-none-any.whl +0 -0
  52. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/mypy_extensions-1.1.0-py3-none-any.whl +0 -0
  53. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/piplite-0.8.5-py3-none-any.whl +0 -0
  54. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/pyodide_http-0.2.2-py3-none-any.whl +0 -0
  55. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/pyodide_kernel-0.8.5-py3-none-any.whl +0 -0
  56. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/python_dateutil-2.9.0.post0-py2.py3-none-any.whl +0 -0
  57. package/jupyterlite-builds/free-private/{dist → .cache/pyodide-lock/_uv_wheels}/python_json_logger-4.2.0-py3-none-any.whl +0 -0
  58. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/typing_inspect-0.9.0-py3-none-any.whl +0 -0
  59. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/xmltodict-0.13.0-py2.py3-none-any.whl +0 -0
  60. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels/zipp-4.1.0-py3-none-any.whl +0 -0
  61. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_work/constraints.txt +354 -0
  62. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_work/pylock.toml +347 -0
  63. package/jupyterlite-builds/free-private/.cache/pyodide-lock/_work/requirements.in +26 -0
  64. package/jupyterlite-builds/free-private/.cache/pyodide-lock/patched-pyodide-lock.json +1 -0
  65. package/jupyterlite-builds/free-private/.cache/pyodide-lock/pyodide-lock.json +1 -0
  66. package/jupyterlite-builds/free-private/.cache/pyodide-lock/remote-pyodide-lock.json +1 -0
  67. package/jupyterlite-builds/free-private/.cache/wheels/aiofiles-25.1.0-py3-none-any.whl.meta.json +24 -0
  68. package/jupyterlite-builds/free-private/.cache/wheels/backoff-2.2.1-py3-none-any.whl.meta.json +24 -0
  69. package/jupyterlite-builds/free-private/.cache/wheels/cdislogging-1.2.0-py3-none-any.whl.meta.json +24 -0
  70. package/jupyterlite-builds/free-private/.cache/wheels/dataclasses_json-0.5.9-py3-none-any.whl.meta.json +24 -0
  71. package/jupyterlite-builds/free-private/.cache/wheels/dictionaryutils-4.0.0-py3-none-any.whl.meta.json +24 -0
  72. package/jupyterlite-builds/free-private/.cache/wheels/drsclient-0.4.0-py3-none-any.whl.meta.json +24 -0
  73. package/jupyterlite-builds/free-private/.cache/wheels/fastavro-1.12.2-py3-none-any.whl.meta.json +24 -0
  74. package/jupyterlite-builds/free-private/.cache/wheels/gen3-4.28.3-py3-none-any.whl.meta.json +24 -0
  75. package/jupyterlite-builds/free-private/.cache/wheels/gen3dictionary-3.0.0-py3-none-any.whl.meta.json +24 -0
  76. package/jupyterlite-builds/free-private/.cache/wheels/gen3users-1.1.1-py3-none-any.whl.meta.json +24 -0
  77. package/jupyterlite-builds/free-private/.cache/wheels/humanfriendly-10.0-py2.py3-none-any.whl.meta.json +24 -0
  78. package/jupyterlite-builds/free-private/.cache/wheels/importlib_metadata-8.9.0-py3-none-any.whl.meta.json +24 -0
  79. package/jupyterlite-builds/free-private/.cache/wheels/indexclient-6.3.0-py3-none-any.whl.meta.json +24 -0
  80. package/jupyterlite-builds/free-private/.cache/wheels/marshmallow-3.26.2-py3-none-any.whl.meta.json +24 -0
  81. package/jupyterlite-builds/free-private/.cache/wheels/marshmallow_enum-1.5.1-py2.py3-none-any.whl.meta.json +24 -0
  82. package/jupyterlite-builds/free-private/.cache/wheels/mypy_extensions-1.1.0-py3-none-any.whl.meta.json +24 -0
  83. package/jupyterlite-builds/free-private/.cache/wheels/pypfb-0.6.2-py3-none-any.whl.meta.json +24 -0
  84. package/jupyterlite-builds/free-private/.cache/wheels/python_dateutil-2.9.0.post0-py2.py3-none-any.whl.meta.json +24 -0
  85. package/jupyterlite-builds/free-private/.cache/wheels/python_json_logger-4.2.0-py3-none-any.whl.meta.json +24 -0
  86. package/jupyterlite-builds/free-private/.cache/wheels/typing_inspect-0.9.0-py3-none-any.whl.meta.json +24 -0
  87. package/jupyterlite-builds/free-private/.cache/wheels/xmltodict-0.13.0-py2.py3-none-any.whl.meta.json +24 -0
  88. package/jupyterlite-builds/free-private/.cache/wheels/zipp-4.1.0-py3-none-any.whl.meta.json +24 -0
  89. package/jupyterlite-builds/free-private/cockle-config.json +71 -0
  90. package/jupyterlite-builds/free-private/cockle_wasm_env/.mambarc +1 -0
  91. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/coreutils.js +5421 -0
  92. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/coreutils.wasm +0 -0
  93. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/fs.d.ts +375 -0
  94. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/fs.js +3401 -0
  95. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/fs.wasm +0 -0
  96. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/grep.js +3839 -0
  97. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/grep.wasm +0 -0
  98. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/less.data +0 -0
  99. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/less.js +5060 -0
  100. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/less.wasm +0 -0
  101. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/sed.js +3843 -0
  102. package/jupyterlite-builds/free-private/cockle_wasm_env/bin/sed.wasm +0 -0
  103. package/jupyterlite-builds/free-private/cockle_wasm_env/conda-meta/cockle_fs-0.3.0-h27506cd_2.json +60 -0
  104. package/jupyterlite-builds/free-private/cockle_wasm_env/conda-meta/coreutils-9.10-h072c4ef_3.json +52 -0
  105. package/jupyterlite-builds/free-private/cockle_wasm_env/conda-meta/emscripten-abi-4.0.9-h267e887_9.json +31 -0
  106. package/jupyterlite-builds/free-private/cockle_wasm_env/conda-meta/grep-3.12-h8b79025_0.json +52 -0
  107. package/jupyterlite-builds/free-private/cockle_wasm_env/conda-meta/history +10 -0
  108. package/jupyterlite-builds/free-private/cockle_wasm_env/conda-meta/less-693-hf259948_0.json +60 -0
  109. package/jupyterlite-builds/free-private/cockle_wasm_env/conda-meta/sed-4.9-h072c4ef_0.json +52 -0
  110. package/package.json +3 -3
  111. package/scripts/aiohttp-3.13.5-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
  112. package/scripts/build-gen3sdk-lite_v2.sh +310 -0
  113. package/scripts/build-jupyterlite_v2.sh +111 -0
  114. package/dist/jupyterlite-builds/free-private/.cache/pyodide-lock/_work/constraints.txt +0 -354
  115. package/dist/jupyterlite-builds/free-private/.cache/pyodide-lock/_work/requirements.in +0 -11
  116. package/dist/jupyterlite-builds/free-private/.cache/pyodide-lock/pyodide-lock.json +0 -1
  117. package/dist/jupyterlite-builds/free-private/.cache/pyodide-lock/remote-pyodide-lock.json +0 -1
  118. package/dist/jupyterlite-builds/free-private/dist/fastavro-1.12.2-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
  119. package/dist/jupyterlite-builds/free-private/dist/gen3datamodel-4.0.1-py3-none-any.whl +0 -0
  120. package/dist/jupyterlite-builds/free-private/dist/python_json_logger-4.2.0-py3-none-any.whl +0 -0
  121. package/jupyterlite-builds/free-private/dist/cdislogging-1.2.0-py3-none-any.whl +0 -0
  122. package/jupyterlite-builds/free-private/dist/dictionaryutils-4.0.0-py3-none-any.whl +0 -0
  123. package/jupyterlite-builds/free-private/dist/drsclient-0.4.0-py3-none-any.whl +0 -0
  124. package/jupyterlite-builds/free-private/dist/fastavro-1.12.2-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
  125. package/jupyterlite-builds/free-private/dist/gen3-4.28.2-py3-none-any.whl +0 -0
  126. package/jupyterlite-builds/free-private/dist/gen3datamodel-4.0.1-py3-none-any.whl +0 -0
  127. package/jupyterlite-builds/free-private/dist/pypfb-0.6.2-py3-none-any.whl +0 -0
  128. /package/{dist/jupyterlite-builds/free-private/dist → jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels}/cdislogging-1.2.0-py3-none-any.whl +0 -0
  129. /package/{dist/jupyterlite-builds/free-private/dist → jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels}/drsclient-0.4.0-py3-none-any.whl +0 -0
  130. /package/{dist/jupyterlite-builds/free-private/dist → jupyterlite-builds/free-private/.cache/pyodide-lock/_uv_wheels}/pypfb-0.6.2-py3-none-any.whl +0 -0
  131. /package/{dist/jupyterlite-builds → jupyterlite-builds}/free-private/.cache/pyodide-lock/_work/excludes.txt +0 -0
package/dist/index.d.ts CHANGED
@@ -40,6 +40,7 @@ interface TierToolbarConfiguration extends LabelAndDescription {
40
40
  tierLabel?: string;
41
41
  }
42
42
  interface SettingsPanelConfiguration {
43
+ enabled?: boolean;
43
44
  showKernels: boolean;
44
45
  width?: number;
45
46
  }
@@ -59,6 +60,7 @@ interface FreeWorkspaceTierConfiguration extends WorkspaceTierInformation {
59
60
  }
60
61
  interface RemoteComputeWorkspaceTierConfiguration extends WorkspaceTierInformation {
61
62
  baseUrl?: string;
63
+ enableOptions?: boolean;
62
64
  type: Extract<WorkspaceTier, 'remote'>;
63
65
  startTimeLimit?: number;
64
66
  }
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env bash
2
+ # =============================================================================
3
+ # build-gen3sdk-lite.sh — Build Gen3 SDK and dependencies as WASM wheels
4
+ #
5
+ # Prerequisites:
6
+ # - uv (https://docs.astral.sh/uv/getting-started/installation/)
7
+ # - git
8
+ # - cmake, make, and a C compiler (for emsdk bootstrap)
9
+ #
10
+ # Usage:
11
+ # ./build-gen3sdk-lite.sh # full build (setup + all packages)
12
+ # ./build-gen3sdk-lite.sh --setup # environment setup only
13
+ # ./build-gen3sdk-lite.sh --build # build wheels only (assumes setup done)
14
+ # ./build-gen3sdk-lite.sh --clean # remove cloned repos, build artifacts
15
+ # =============================================================================
16
+ set -euo pipefail
17
+
18
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
19
+
20
+ # ── Configuration ────────────────────────────────────────────────────────────
21
+ # Repositories to build (order matters — independent packages first)
22
+ # Format: "name|git_url|subdir" (subdir is optional)
23
+ REPOS=(
24
+ "cdislogging|https://github.com/uc-cdis/cdislogging.git"
25
+ "python-json-logger|https://github.com/nhairs/python-json-logger.git"
26
+ "fastavro|https://github.com/fastavro/fastavro.git"
27
+ "drsclient|https://github.com/uc-cdis/drsclient.git"
28
+ "indexd|https://github.com/uc-cdis/indexd.git|indexclient"
29
+ "dictionaryutils|https://github.com/uc-cdis/dictionaryutils.git"
30
+ "pypfb|https://github.com/uc-cdis/pypfb.git"
31
+ "gen3sdk-python|https://github.com/uc-cdis/gen3sdk-python.git"
32
+ "gen3users|git@github.com:uc-cdis/gen3users.git"
33
+ )
34
+
35
+ # ── Source shared environment ────────────────────────────────────────────────
36
+ # setup-env.sh exports: ROOT_DIR, SRC_DIR, BUILD_DIR, VENV_DIR, WORK_DIR,
37
+ # EMSDK_DIR, SOURCES_DIR, OUTPUT_DIR, LOG_DIR and helper functions.
38
+ # It also creates + activates the venv and installs core tooling.
39
+ source_shared_env() {
40
+ # shellcheck disable=SC1091
41
+ source "${SCRIPT_DIR}/setup-env.sh"
42
+ }
43
+
44
+ # ── Emscripten SDK ───────────────────────────────────────────────────────────
45
+ setup_emsdk() {
46
+ info "Setting up Emscripten SDK …"
47
+
48
+ if [[ ! -d "${EMSDK_DIR}" ]]; then
49
+ git clone https://github.com/emscripten-core/emsdk.git "${EMSDK_DIR}"
50
+ fi
51
+
52
+ local em_version
53
+ em_version="$(pyodide config get emscripten_version)"
54
+ info "Pyodide requires Emscripten ${em_version}"
55
+
56
+ pushd "${EMSDK_DIR}" > /dev/null
57
+ ./emsdk install "${em_version}"
58
+ ./emsdk activate "${em_version}"
59
+ # shellcheck disable=SC1091
60
+ source emsdk_env.sh
61
+ popd > /dev/null
62
+
63
+ success "Emscripten $(emcc --version | head -1) activated"
64
+ }
65
+
66
+ # ── Full environment setup ───────────────────────────────────────────────────
67
+ setup_environment() {
68
+ source_shared_env
69
+ mkdir -p "${WORK_DIR}" "${SOURCES_DIR}" "${OUTPUT_DIR}" "${LOG_DIR}"
70
+
71
+ # WASM-specific tooling (on top of the shared base)
72
+ info "Installing pyodide-build …"
73
+ uv pip install pyodide-build 2>&1 | tail -3
74
+ success "pyodide-build $(pyodide --version 2>/dev/null || echo '(installed)')"
75
+
76
+ setup_emsdk
77
+ }
78
+
79
+ # ── Clone / update sources ──────────────────────────────────────────────────
80
+ clone_repos() {
81
+ info "Cloning / updating repositories …"
82
+ for entry in "${REPOS[@]}"; do
83
+ IFS='|' read -r name url _subdir <<< "${entry}"
84
+ local dest="${SOURCES_DIR}/${name}"
85
+ if [[ -d "${dest}/.git" ]]; then
86
+ info " ${name}: pulling latest …"
87
+ git -C "${dest}" pull --ff-only 2>&1 | tail -1
88
+ else
89
+ info " ${name}: cloning …"
90
+ git clone "${url}" "${dest}" 2>&1 | tail -1
91
+ fi
92
+ done
93
+ success "All repositories ready"
94
+ }
95
+
96
+ # ── Build WASM wheels ───────────────────────────────────────────────────────
97
+ build_wheels() {
98
+ # Make sure emsdk env is active in this shell
99
+ if [[ -f "${EMSDK_DIR}/emsdk_env.sh" ]]; then
100
+ # shellcheck disable=SC1091
101
+ source "${EMSDK_DIR}/emsdk_env.sh" 2>/dev/null
102
+ fi
103
+ # shellcheck disable=SC1091
104
+ source "${VENV_DIR}/bin/activate"
105
+
106
+ local total=${#REPOS[@]}
107
+ local built=0
108
+ local failed=0
109
+ local failed_names=()
110
+
111
+ # ── Source patches ─────────────────────────────────────────────────────
112
+
113
+ # gen3users: old poetry.masonry.api → poetry.core.masonry.api
114
+ local gen3users_pyproject="${SOURCES_DIR}/gen3users/pyproject.toml"
115
+ if [[ -f "${gen3users_pyproject}" ]]; then
116
+ sed -i '' 's|build-backend = "poetry.masonry.api"|build-backend = "poetry.core.masonry.api"|' "${gen3users_pyproject}"
117
+ info "Patched gen3users: build-backend updated to poetry.core.masonry.api"
118
+ fi
119
+
120
+ # gen3sdk-python: relax indexclient pin
121
+ local gen3sdk_pyproject="${SOURCES_DIR}/gen3sdk-python/pyproject.toml"
122
+ if [[ -f "${gen3sdk_pyproject}" ]]; then
123
+ sed -i '' 's/indexclient = "\^2\.3\.0"/indexclient = ">=2.3.0"/' "${gen3sdk_pyproject}"
124
+ info "Patched gen3sdk-python: indexclient constraint relaxed to >=2.3.0"
125
+ fi
126
+
127
+ # dictionaryutils: relax jsonschema pin
128
+ local dictionaryutils_pyproject="${SOURCES_DIR}/dictionaryutils/pyproject.toml"
129
+ if [[ -f "${dictionaryutils_pyproject}" ]]; then
130
+ sed -i '' 's/jsonschema = "<=4\.23\.0"/jsonschema = ">=4.0.0"/' "${dictionaryutils_pyproject}"
131
+ info "Patched dictionaryutils: jsonschema constraint relaxed to >=4.0.0"
132
+ fi
133
+
134
+ # psqlgraph: multiple fixes for WASM compatibility
135
+ local psqlgraph_pyproject="${SOURCES_DIR}/psqlgraph/pyproject.toml"
136
+ if [[ -f "${psqlgraph_pyproject}" ]]; then
137
+ sed -i '' 's/"sqlalchemy~=1\.4"/"sqlalchemy>=1.4"/' "${psqlgraph_pyproject}"
138
+ sed -i '' 's/, "versionista>=1\.1\.0"//' "${psqlgraph_pyproject}"
139
+ sed -i '' 's/local_scheme = "versionista-local-format"/local_scheme = "no-local-version"/' "${psqlgraph_pyproject}"
140
+ sed -i '' 's/version_scheme = "versionista-format"/version_scheme = "guess-next-dev"/' "${psqlgraph_pyproject}"
141
+ sed -i '' '/"psycopg2"/d' "${psqlgraph_pyproject}"
142
+ sed -i '' '/"xlocal"/d' "${psqlgraph_pyproject}"
143
+ info "Patched psqlgraph: sqlalchemy >=1.4, removed versionista + psycopg2 + xlocal"
144
+
145
+ local psql_py="${SOURCES_DIR}/psqlgraph/src/psqlgraph/psql.py"
146
+ if [[ -f "${psql_py}" ]]; then
147
+ python3 - "${psql_py}" <<'PYEOF'
148
+ import sys, re
149
+
150
+ path = sys.argv[1]
151
+ text = open(path).read()
152
+ stub = '''\
153
+ try:
154
+ import xlocal
155
+ except ImportError:
156
+ class _XLocalInst:
157
+ class _Ctx:
158
+ def __init__(self, parent, **kw):
159
+ self._parent, self._kw = parent, kw
160
+ def __enter__(self):
161
+ for k, v in self._kw.items():
162
+ setattr(self._parent, k, v)
163
+ return self._parent
164
+ def __exit__(self, *a):
165
+ for k in self._kw:
166
+ self._parent.__dict__.pop(k, None)
167
+ def __call__(self, **kw):
168
+ return self._Ctx(self, **kw)
169
+ class _xlocal_module:
170
+ xlocal = _XLocalInst
171
+ xlocal = _xlocal_module()'''
172
+ text = re.sub(r'^import xlocal$', stub, text, flags=re.MULTILINE)
173
+ open(path, 'w').write(text)
174
+ PYEOF
175
+ info "Patched psqlgraph/psql.py: xlocal import wrapped in try/except stub"
176
+ fi
177
+ fi
178
+
179
+ # ── Build loop ─────────────────────────────────────────────────────────
180
+ info "Building ${total} packages …"
181
+ echo ""
182
+
183
+ for entry in "${REPOS[@]}"; do
184
+ IFS='|' read -r name _url subdir <<< "${entry}"
185
+ local src="${SOURCES_DIR}/${name}"
186
+ local build_dir="${src}"
187
+ [[ -n "${subdir}" ]] && build_dir="${src}/${subdir}"
188
+ local logfile="${LOG_DIR}/${name}.log"
189
+ local start_ts
190
+ start_ts=$(date +%s)
191
+
192
+ local label="${name}"
193
+ [[ -n "${subdir}" ]] && label="${name}/${subdir}"
194
+ printf " [%d/%d] %-25s " $((built + failed + 1)) "${total}" "${label}"
195
+
196
+ if (cd "${build_dir}" && pyodide build) > "${logfile}" 2>&1; then
197
+ local end_ts
198
+ end_ts=$(date +%s)
199
+ echo -e "${GREEN}OK${NC} ($(elapsed $((end_ts - start_ts))))"
200
+ ((built++))
201
+ else
202
+ local end_ts
203
+ end_ts=$(date +%s)
204
+ echo -e "${RED}FAILED${NC} ($(elapsed $((end_ts - start_ts)))) — see ${logfile}"
205
+ ((failed++))
206
+ failed_names+=("${name}")
207
+ fi
208
+ done
209
+
210
+ echo ""
211
+
212
+ # ── Collect wheels ─────────────────────────────────────────────────────
213
+ info "Collecting .whl files into ${OUTPUT_DIR} …"
214
+ local count=0
215
+ for entry in "${REPOS[@]}"; do
216
+ IFS='|' read -r name _url subdir <<< "${entry}"
217
+ local src="${SOURCES_DIR}/${name}"
218
+ local build_dir="${src}"
219
+ [[ -n "${subdir}" ]] && build_dir="${src}/${subdir}"
220
+ if compgen -G "${build_dir}/dist/*.whl" > /dev/null 2>&1; then
221
+ cp "${build_dir}"/dist/*.whl "${OUTPUT_DIR}/"
222
+ ((count += $(ls -1 "${build_dir}"/dist/*.whl 2>/dev/null | wc -l)))
223
+ fi
224
+ done
225
+
226
+ # ── Normalise platform tags ────────────────────────────────────────────
227
+ for whl in "${OUTPUT_DIR}"/*p313-cp313-pyemscripten_2025_0_wasm32.whl; do
228
+ [[ -f "${whl}" ]] || continue
229
+ new_whl="${whl/p313-cp313-pyemscripten_2025_0_wasm32/py3-none-any}"
230
+ mv "${whl}" "${new_whl}"
231
+ info "Renamed $(basename "${whl}") → $(basename "${new_whl}")"
232
+ done
233
+
234
+ # ── Summary ────────────────────────────────────────────────────────────
235
+ echo ""
236
+ echo "========================================="
237
+ echo " Build Summary"
238
+ echo "========================================="
239
+ echo " Succeeded : ${built}"
240
+ echo " Failed : ${failed}"
241
+ echo " Wheels : ${count} file(s) in ${OUTPUT_DIR}/"
242
+ if (( failed > 0 )); then
243
+ echo ""
244
+ echo " Failed packages:"
245
+ for n in "${failed_names[@]}"; do
246
+ echo " - ${n} (log: ${LOG_DIR}/${n}.log)"
247
+ done
248
+ fi
249
+ echo "========================================="
250
+ echo ""
251
+
252
+ if (( failed > 0 )); then
253
+ warn "Some packages failed. Check the logs above."
254
+ return 1
255
+ fi
256
+
257
+ success "All wheels built and collected in ${OUTPUT_DIR}/"
258
+ echo ""
259
+ ls -lh "${OUTPUT_DIR}"/*.whl
260
+ }
261
+
262
+ # ── Clean ────────────────────────────────────────────────────────────────────
263
+ clean() {
264
+ # Need the path variables but don't need the full env setup
265
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
266
+ SRC_DIR="$ROOT_DIR/free-private"
267
+ BUILD_DIR="${2:-$SRC_DIR/build}"
268
+ WORK_DIR="$BUILD_DIR/work"
269
+ OUTPUT_DIR="$BUILD_DIR/pypi"
270
+ LOG_DIR="$BUILD_DIR/logs"
271
+
272
+ echo -e '\033[0;36m[INFO]\033[0m Cleaning build artifacts …'
273
+ rm -rf "${WORK_DIR}" "${OUTPUT_DIR}" "${LOG_DIR}"
274
+ echo -e '\033[0;32m[OK]\033[0m Clean complete'
275
+ }
276
+
277
+ # ── Main ─────────────────────────────────────────────────────────────────────
278
+ main() {
279
+ local mode="${1:-all}"
280
+
281
+ case "${mode}" in
282
+ --setup)
283
+ setup_environment
284
+ ;;
285
+ --build)
286
+ source_shared_env
287
+ clone_repos
288
+ build_wheels
289
+ ;;
290
+ --clean)
291
+ clean
292
+ ;;
293
+ --help|-h)
294
+ echo "Usage: $0 [--setup | --build | --clean | --help]"
295
+ echo ""
296
+ echo " (no flag) Full run: setup environment, clone repos, build wheels"
297
+ echo " --setup Set up Python, venv, pyodide-build, and emsdk"
298
+ echo " --build Clone/update repos and build WASM wheels (requires prior --setup)"
299
+ echo " --clean Remove work/, dist/, and logs/"
300
+ echo " --help Show this message"
301
+ ;;
302
+ *)
303
+ setup_environment
304
+ clone_repos
305
+ build_wheels
306
+ ;;
307
+ esac
308
+ }
309
+
310
+ main "$@"
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env bash
2
+ # =============================================================================
3
+ # build-jupyterlite.sh — Build a JupyterLite site (free or remote tier)
4
+ #
5
+ # Sources setup-env.sh so the venv, Python version, and tooling are identical
6
+ # to those used by build-gen3sdk-lite.sh.
7
+ #
8
+ # Usage:
9
+ # ./build-jupyterlite.sh <tier> [build_dir]
10
+ # tier: 'free' or 'remote'
11
+ # =============================================================================
12
+ set -euo pipefail
13
+
14
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15
+
16
+ usage() {
17
+ echo "Usage: $0 <tier> [build_dir]"
18
+ echo " tier: 'free' or 'remote'"
19
+ exit 1
20
+ }
21
+
22
+ TIER="${1:-}"
23
+ if [[ "$TIER" != "free" && "$TIER" != "remote" ]]; then
24
+ usage
25
+ fi
26
+
27
+ # ── Derive SRC_DIR before sourcing shared env ────────────────────────────────
28
+ # setup-env.sh respects pre-set ROOT_DIR / SRC_DIR / BUILD_DIR.
29
+ export ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
30
+
31
+ if [[ "$TIER" == "free" ]]; then
32
+ export SRC_DIR="$ROOT_DIR/free-private"
33
+ else
34
+ export SRC_DIR="$ROOT_DIR/remote-private"
35
+ fi
36
+
37
+ # Allow caller to override BUILD_DIR via the second positional arg.
38
+ if [[ -n "${2:-}" ]]; then
39
+ export BUILD_DIR="$2"
40
+ fi
41
+
42
+ # ── Source shared environment (creates/reuses the venv) ──────────────────────
43
+ # After this: VENV_DIR, OUTPUT_DIR, BUILD_DIR, etc. are set and the venv is
44
+ # active with the same Python version + core tooling as build-gen3sdk-lite.
45
+ # shellcheck disable=SC1091
46
+ source "${SCRIPT_DIR}/setup-env.sh"
47
+
48
+ # ── JupyterLite-specific tooling ────────────────────────────────────────────
49
+ CONFIG_FILE="$SRC_DIR/jupyter_lite_config.json"
50
+ REQUIREMENTS_FILE="$SRC_DIR/requirements.txt"
51
+ VENV_JUPYTER_LITE="$VENV_DIR/bin/jupyter-lite"
52
+ PYPI="$OUTPUT_DIR" # wheels built by build-gen3sdk-lite land here
53
+
54
+ if [[ ! -f "$REQUIREMENTS_FILE" ]]; then
55
+ echo "Missing requirements file: $REQUIREMENTS_FILE"
56
+ exit 1
57
+ fi
58
+
59
+ # Install JupyterLite requirements into the shared venv (uv for speed).
60
+ info "Installing JupyterLite requirements …"
61
+ uv pip install -r "$REQUIREMENTS_FILE" 2>&1 | tail -5
62
+ success "JupyterLite requirements installed"
63
+
64
+ if [[ ! -x "$VENV_JUPYTER_LITE" ]]; then
65
+ echo "jupyter-lite executable not found in $VENV_DIR after dependency install."
66
+ exit 1
67
+ fi
68
+
69
+ # ── Build ────────────────────────────────────────────────────────────────────
70
+ if [[ "$TIER" == "free" ]]; then
71
+
72
+ # Patch config to use the absolute pypi path so jupyter-lite can find the
73
+ # custom wheels built by build-gen3sdk-lite.
74
+ PATCHED_CONFIG="$BUILD_DIR/jupyter_lite_config.json"
75
+ python - <<PYEOF
76
+ import json
77
+
78
+ with open('$CONFIG_FILE') as fh:
79
+ cfg = json.load(fh)
80
+
81
+ addon = cfg.get('PyodideLockAddon', {})
82
+ if 'wheels' in addon:
83
+ addon['wheels'] = ['$PYPI/']
84
+ cfg['PyodideLockAddon'] = addon
85
+
86
+ with open('$PATCHED_CONFIG', 'w') as fh:
87
+ json.dump(cfg, fh, indent=2)
88
+ PYEOF
89
+
90
+ info "Looking for wheels in $PYPI"
91
+ WHEEL_ARGS=()
92
+ if [[ -d "$PYPI" ]]; then
93
+ while IFS= read -r -d '' whl; do
94
+ WHEEL_ARGS+=(--piplite-wheels "$whl")
95
+ done < <(find "$PYPI" -maxdepth 1 -name "*.whl" -print0 | sort -z)
96
+ fi
97
+
98
+ info "Running: jupyter-lite build (free tier, ${#WHEEL_ARGS[@]} custom wheels)"
99
+ "$VENV_JUPYTER_LITE" build \
100
+ --config "$PATCHED_CONFIG" \
101
+ --lite-dir "$SRC_DIR" ${WHEEL_ARGS[@]+"${WHEEL_ARGS[@]}"} \
102
+ --output-dir "$BUILD_DIR/$TIER"
103
+ else
104
+ info "Running: jupyter-lite build (remote tier)"
105
+ "$VENV_JUPYTER_LITE" build \
106
+ --config "$CONFIG_FILE" \
107
+ --lite-dir "$SRC_DIR" \
108
+ --output-dir "$BUILD_DIR/$TIER"
109
+ fi
110
+
111
+ success "$TIER-tier JupyterLite build complete: $BUILD_DIR/$TIER"