@rancher/shell 0.4.0 → 0.5.1

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 (243) hide show
  1. package/assets/images/providers/ovhcloudmks.svg +122 -0
  2. package/assets/images/providers/ovhcloudpubliccloud.svg +122 -0
  3. package/assets/styles/global/_layout.scss +99 -0
  4. package/assets/translations/en-us.yaml +30 -5
  5. package/assets/translations/zh-hans.yaml +1 -1
  6. package/babel.config.js +7 -1
  7. package/chart/monitoring/alerting/index.vue +7 -21
  8. package/chart/monitoring/grafana/index.vue +55 -0
  9. package/chart/monitoring/index.vue +51 -17
  10. package/chart/monitoring/prometheus/index.vue +37 -43
  11. package/chart/rancher-backup/index.vue +2 -1
  12. package/cloud-credential/azure.vue +4 -17
  13. package/components/Certificates.vue +164 -0
  14. package/components/CodeMirror.vue +19 -21
  15. package/components/CruResource.vue +1 -0
  16. package/components/EtcdInfoBanner.vue +1 -1
  17. package/components/ExplorerProjectsNamespaces.vue +25 -1
  18. package/components/IconOrSvg.vue +1 -1
  19. package/components/LandingPagePreference.vue +1 -4
  20. package/components/Questions/index.vue +1 -1
  21. package/components/ResourceDetail/Masthead.vue +16 -3
  22. package/components/ResourceTable.vue +14 -2
  23. package/components/ResourceYaml.vue +5 -0
  24. package/components/SideNav.vue +1 -1
  25. package/components/SingleClusterInfo.vue +1 -4
  26. package/components/Tabbed/index.vue +12 -0
  27. package/components/fleet/FleetRepos.vue +62 -27
  28. package/components/fleet/FleetResources.vue +6 -1
  29. package/components/form/ArrayListSelect.vue +10 -0
  30. package/components/form/KeyValue.vue +4 -0
  31. package/components/form/LabeledSelect.vue +4 -0
  32. package/components/formatter/Checked.vue +11 -3
  33. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  34. package/components/formatter/FleetSummaryGraph.vue +23 -11
  35. package/components/formatter/LiveDuration.vue +1 -1
  36. package/components/formatter/PercentageBar.vue +1 -1
  37. package/components/formatter/__tests__/Checked.test.ts +19 -0
  38. package/components/nav/Group.vue +2 -2
  39. package/components/nav/Header.vue +0 -1
  40. package/components/nav/TopLevelMenu.vue +36 -6
  41. package/components/nav/Type.vue +1 -3
  42. package/components/nav/WindowManager/ContainerLogs.vue +101 -3
  43. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  44. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  45. package/components/nav/WindowManager/index.vue +11 -10
  46. package/components/nav/__tests__/TopLevelMenu.test.ts +33 -0
  47. package/components/nav/__tests__/Type.test.ts +1 -1
  48. package/components/nuxt/nuxt-child.js +14 -78
  49. package/components/nuxt/nuxt.js +1 -1
  50. package/{layouts → components/templates}/blank.vue +1 -1
  51. package/{layouts → components/templates}/default.vue +8 -98
  52. package/{layouts → components/templates}/error.vue +10 -19
  53. package/{layouts → components/templates}/home.vue +4 -1
  54. package/{layouts → components/templates}/plain.vue +4 -1
  55. package/{layouts → components/templates}/standalone.vue +1 -1
  56. package/{layouts → components/templates}/unauthenticated.vue +1 -1
  57. package/composables/useCompactInput.ts +20 -0
  58. package/composables/useLabeledFormElement.ts +138 -0
  59. package/config/harvester-manager-types.js +2 -0
  60. package/config/private-label.js +22 -0
  61. package/config/product/explorer.js +3 -0
  62. package/config/product/fleet.js +6 -1
  63. package/config/product/manager.js +8 -2
  64. package/config/query-params.js +1 -0
  65. package/config/router.js +385 -364
  66. package/config/settings.ts +1 -0
  67. package/config/store.js +1 -1
  68. package/config/system-namespaces.js +3 -0
  69. package/config/table-headers.js +47 -0
  70. package/core/plugin-routes.ts +56 -114
  71. package/core/plugin.ts +16 -10
  72. package/core/plugins-loader.js +7 -9
  73. package/core/plugins.js +0 -3
  74. package/creators/app/files/.gitlab-ci.yml +1 -1
  75. package/detail/fleet.cattle.io.cluster.vue +11 -1
  76. package/detail/provisioning.cattle.io.cluster.vue +4 -3
  77. package/dialog/ScaleMachineDownDialog.vue +34 -17
  78. package/edit/__tests__/service.test.ts +89 -0
  79. package/edit/auth/googleoauth.vue +1 -5
  80. package/edit/catalog.cattle.io.clusterrepo.vue +18 -0
  81. package/edit/cloudcredential.vue +2 -0
  82. package/edit/configmap.vue +2 -1
  83. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
  84. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +15 -7
  85. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +112 -0
  86. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  87. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +4 -0
  88. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  89. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  90. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +7 -1
  91. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +386 -0
  92. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  93. package/edit/provisioning.cattle.io.cluster/index.vue +92 -36
  94. package/edit/provisioning.cattle.io.cluster/rke2.vue +171 -583
  95. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  96. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +157 -0
  97. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +94 -19
  98. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  99. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  100. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +189 -0
  101. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +144 -0
  102. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  103. package/edit/service.vue +12 -0
  104. package/edit/workload/mixins/workload.js +1 -1
  105. package/initialize/App.js +25 -71
  106. package/initialize/client.js +21 -162
  107. package/initialize/index.js +27 -123
  108. package/list/management.cattle.io.feature.vue +1 -7
  109. package/list/node.vue +1 -0
  110. package/machine-config/__tests__/vmwarevsphere.test.ts +100 -21
  111. package/machine-config/vmwarevsphere.vue +73 -51
  112. package/middleware/authenticated.js +10 -17
  113. package/mixins/auth-config.js +2 -7
  114. package/mixins/brand.js +29 -41
  115. package/mixins/labeled-form-element.ts +6 -1
  116. package/models/__tests__/management.cattle.io.node.ts +85 -0
  117. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  118. package/models/__tests__/namespace.test.ts +49 -9
  119. package/models/__tests__/workload.test.ts +91 -0
  120. package/models/cluster/node.js +4 -4
  121. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  122. package/models/fleet.cattle.io.cluster.js +4 -0
  123. package/models/fleet.cattle.io.gitrepo.js +56 -13
  124. package/models/management.cattle.io.kontainerdriver.js +1 -1
  125. package/models/management.cattle.io.node.js +18 -14
  126. package/models/management.cattle.io.nodepool.js +17 -0
  127. package/models/namespace.js +1 -1
  128. package/models/pod.js +20 -0
  129. package/models/provisioning.cattle.io.cluster.js +20 -3
  130. package/models/secret.js +117 -18
  131. package/models/workload.js +16 -0
  132. package/models/workload.service.js +18 -0
  133. package/package.json +10 -9
  134. package/pages/about.vue +0 -1
  135. package/pages/account/create-key.vue +0 -1
  136. package/pages/account/index.vue +0 -1
  137. package/pages/auth/login.vue +0 -1
  138. package/pages/auth/logout.vue +0 -2
  139. package/pages/auth/setup.vue +0 -4
  140. package/pages/auth/verify.vue +14 -8
  141. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  142. package/pages/c/_cluster/apps/index.vue +0 -2
  143. package/pages/c/_cluster/auth/index.vue +0 -2
  144. package/pages/c/_cluster/ecm/index.vue +0 -2
  145. package/pages/c/_cluster/explorer/index.vue +28 -2
  146. package/pages/c/_cluster/fleet/index.vue +1 -1
  147. package/pages/c/_cluster/index.vue +0 -2
  148. package/pages/c/_cluster/settings/banners.vue +0 -2
  149. package/pages/c/_cluster/settings/brand.vue +0 -2
  150. package/pages/c/_cluster/settings/index.vue +0 -2
  151. package/pages/c/_cluster/settings/links.vue +0 -1
  152. package/pages/c/_cluster/settings/performance.vue +0 -1
  153. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +2 -1
  154. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  155. package/pages/c/_cluster/uiplugins/index.vue +0 -2
  156. package/pages/diagnostic.vue +1 -2
  157. package/pages/fail-whale.vue +0 -1
  158. package/pages/prefs.vue +0 -1
  159. package/pages/support/index.vue +2 -8
  160. package/pkg/auto-import.js +1 -1
  161. package/plugins/axios.js +0 -36
  162. package/plugins/back-button.js +3 -5
  163. package/plugins/codemirror-loader.js +1 -1
  164. package/plugins/codemirror.js +41 -0
  165. package/plugins/dashboard-store/__tests__/{mutations.spec.ts → mutations.test.ts} +1 -1
  166. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  167. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  168. package/plugins/dashboard-store/actions.js +30 -4
  169. package/plugins/dashboard-store/classify.js +1 -18
  170. package/plugins/dashboard-store/getters.js +10 -5
  171. package/plugins/dashboard-store/index.js +0 -12
  172. package/plugins/dashboard-store/mutations.js +0 -4
  173. package/plugins/dashboard-store/resource-class.js +59 -18
  174. package/plugins/steve/__tests__/steve-class.spec.ts +59 -0
  175. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  176. package/plugins/steve/getters.js +4 -1
  177. package/plugins/steve/norman-class.js +19 -0
  178. package/plugins/steve/steve-class.js +22 -0
  179. package/plugins/steve/subscribe.js +4 -10
  180. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  181. package/rancher-components/Accordion/Accordion.vue +85 -0
  182. package/rancher-components/Accordion/index.ts +1 -0
  183. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +19 -2
  184. package/rancher-components/Form/LabeledInput/LabeledInput.vue +12 -1
  185. package/rancher-components/Form/Radio/RadioButton.test.ts +7 -3
  186. package/rancher-components/Form/Radio/RadioGroup.test.ts +30 -0
  187. package/rancher-components/Form/Radio/RadioGroup.vue +4 -0
  188. package/rancher-components/StringList/StringList.test.ts +270 -0
  189. package/rancher-components/StringList/StringList.vue +57 -18
  190. package/rancher-components/components/Accordion/Accordion.test.ts +45 -0
  191. package/rancher-components/components/Accordion/Accordion.vue +85 -0
  192. package/rancher-components/components/Accordion/index.ts +1 -0
  193. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +19 -2
  194. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +4 -1
  195. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +50 -0
  196. package/scripts/extension/parse-tag-name +2 -2
  197. package/scripts/publish-shell.sh +10 -0
  198. package/scripts/test-plugins-build.sh +85 -9
  199. package/server/har-file.js +183 -0
  200. package/store/catalog.js +1 -1
  201. package/store/features.js +1 -0
  202. package/store/i18n.js +11 -0
  203. package/store/index.js +10 -11
  204. package/store/prefs.js +33 -35
  205. package/store/type-map.js +8 -7
  206. package/tsconfig.json +35 -9
  207. package/tsconfig.paths.json +18 -0
  208. package/types/shell/index.d.ts +345 -214
  209. package/utils/__tests__/create-yaml.test.ts +60 -0
  210. package/utils/axios.js +0 -19
  211. package/utils/azure.js +24 -0
  212. package/utils/create-yaml.js +17 -10
  213. package/utils/monitoring.js +1 -1
  214. package/utils/nuxt.js +18 -39
  215. package/utils/object.js +14 -0
  216. package/utils/router.scrollBehavior.js +12 -14
  217. package/utils/time.js +1 -1
  218. package/utils/url.ts +1 -1
  219. package/vue.config.js +23 -2
  220. package/.DS_Store +0 -0
  221. package/assets/images/providers/aks-black.svg +0 -28
  222. package/assets/images/providers/aks.svg +0 -31
  223. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -234
  224. package/initialize/layouts.ts +0 -26
  225. package/mixins/fetch.server.js +0 -73
  226. package/pages/c/index.vue +0 -9
  227. package/pages/rio/mesh.vue +0 -508
  228. package/plugins/transitions.js +0 -4
  229. package/scripts/.DS_Store +0 -0
  230. package/scripts/verdaccio.log +0 -205
  231. package/tsconfig.default.json +0 -46
  232. package/yarn-error.log +0 -200
  233. /package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +0 -0
  234. /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +0 -0
  235. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  236. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  237. /package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +0 -0
  238. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  239. /package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +0 -0
  240. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  241. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  242. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  243. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
@@ -7,6 +7,9 @@ echo "Checking plugin build"
7
7
  SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
8
8
  BASE_DIR="$( cd $SCRIPT_DIR && cd ../.. & pwd)"
9
9
  SHELL_DIR=$BASE_DIR/shell/
10
+ SHELL_VERSION="99.99.99"
11
+ DEFAULT_YARN_REGISTRY="https://registry.npmjs.org"
12
+ VERDACCIO_YARN_REGISTRY="http://localhost:4873"
10
13
 
11
14
  echo ${SCRIPT_DIR}
12
15
 
@@ -66,21 +69,24 @@ else
66
69
  rm -rf ~/.config/verdaccio/storage/@rancher/*
67
70
  fi
68
71
 
69
- export YARN_REGISTRY=http://localhost:4873
72
+ export YARN_REGISTRY=$VERDACCIO_YARN_REGISTRY
70
73
  export NUXT_TELEMETRY_DISABLED=1
71
74
 
72
75
  # Remove test package from previous run, if present
73
- rm -rf ${BASE_DIR}/pkg/test-pkg
76
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
77
+ echo "Removing folder ${BASE_DIR}/pkg/test-pkg"
78
+ rm -rf ${BASE_DIR}/pkg/test-pkg
79
+ fi
74
80
 
75
81
  # We need to patch the version number of the shell, otherwise if we are running
76
82
  # with the currently published version, things will fail as those versions
77
83
  # are already published and Verdaccio will check, since it is a read-through cache
78
- sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\",/\"version\": \"7.7.7\",/g" ${SHELL_DIR}/package.json
84
+ sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\(-alpha\.[0-9]*\|-release[0-9]*.[0-9]*.[0-9]*\|-rc\.[0-9]*\)\{0,1\}\",/\"version\": \"${SHELL_VERSION}\",/g" ${SHELL_DIR}/package.json
79
85
  rm ${SHELL_DIR}/package.json.bak
80
86
 
81
87
  # Same as above for Rancher Components
82
88
  # We might have bumped the version number but its not published yet, so this will fail
83
- sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\",/\"version\": \"7.7.7\",/g" ${BASE_DIR}/pkg/rancher-components/package.json
89
+ sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\(-alpha\.[0-9]*\|-release[0-9]*.[0-9]*.[0-9]*\|-rc\.[0-9]*\)\{0,1\}\",/\"version\": \"${SHELL_VERSION}\",/g" ${BASE_DIR}/pkg/rancher-components/package.json
84
90
 
85
91
  # Publish shell
86
92
  echo "Publishing shell packages to local registry"
@@ -108,6 +114,7 @@ if [ "${SKIP_STANDALONE}" == "false" ]; then
108
114
  yarn install
109
115
 
110
116
  echo "Building skeleton app"
117
+
111
118
  FORCE_COLOR=true yarn build | cat
112
119
 
113
120
  # Package creator
@@ -127,22 +134,91 @@ if [ "${SKIP_STANDALONE}" == "false" ]; then
127
134
  echo "Cleaning temporary dir"
128
135
  popd > /dev/null
129
136
 
130
- rm -rf ${DIR}
137
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
138
+ echo "Removing folder ${DIR}"
139
+ rm -rf ${DIR}
140
+ fi
131
141
  fi
132
142
 
133
143
  pushd $BASE_DIR
134
- pwd
135
- ls
136
144
 
137
145
  # Now try a plugin within the dashboard codebase
138
146
  echo "Validating in-tree package"
139
147
 
140
148
  yarn install
141
149
 
142
- rm -rf ./pkg/test-pkg
150
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
151
+ echo "Removing folder ./pkg/test-pkg"
152
+ rm -rf ./pkg/test-pkg
153
+ fi
154
+
143
155
  yarn create @rancher/pkg test-pkg -t
144
156
  cp ${SHELL_DIR}/list/catalog.cattle.io.clusterrepo.vue ./pkg/test-pkg/list
145
157
  FORCE_COLOR=true yarn build-pkg test-pkg | cat
146
- rm -rf ./pkg/test-pkg
158
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
159
+ echo "Removing folder ./pkg/test-pkg"
160
+ rm -rf ./pkg/test-pkg
161
+ fi
162
+
163
+ # function to clone repos and install dependencies (including the newly published shell version)
164
+ function clone_repo_test_extension_build() {
165
+ REPO_NAME=$1
166
+ PKG_NAME=$2
167
+
168
+ echo -e "\nSetting up $REPO_NAME repository locally\n"
169
+
170
+ # set registry to default (to install all of the other dependencies)
171
+ yarn config set registry ${DEFAULT_YARN_REGISTRY}
172
+
173
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
174
+ echo "Removing folder ${BASE_DIR}/$REPO_NAME"
175
+ rm -rf ${BASE_DIR}/$REPO_NAME
176
+ fi
177
+
178
+ # cloning repo
179
+ git clone https://github.com/rancher/$REPO_NAME.git
180
+ pushd ${BASE_DIR}/$REPO_NAME
181
+
182
+ echo -e "\nInstalling dependencies for $REPO_NAME\n"
183
+ yarn install
184
+
185
+ # set registry to local verdaccio (to install new shell)
186
+ yarn config set registry ${VERDACCIO_YARN_REGISTRY}
187
+
188
+ # update package.json to use a specific version of shell
189
+ sed -i.bak -e "s/\"\@rancher\/shell\": \"[0-9]*.[0-9]*.[0-9]*\",/\"\@rancher\/shell\": \"${SHELL_VERSION}\",/g" package.json
190
+ rm package.json.bak
191
+
192
+ # we need to remove yarn.lock, otherwise it would install a version that we don't want
193
+ rm yarn.lock
194
+
195
+ echo -e "\nInstalling newly built shell version\n"
196
+
197
+ # installing new version of shell
198
+ yarn add @rancher/shell@${SHELL_VERSION}
199
+
200
+ # test build-pkg
201
+ FORCE_COLOR=true yarn build-pkg $PKG_NAME | cat
202
+
203
+ # kubewarden has some unit tests and they should be quick to run... Let's check them as well
204
+ if [ "${REPO_NAME}" == "kubewarden-ui" ]; then
205
+ yarn test:ci
206
+ fi
207
+
208
+ # return back to the base path
209
+ popd
210
+
211
+ # delete folder
212
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
213
+ echo "Removing folder ${BASE_DIR}/$REPO_NAME"
214
+ rm -rf ${BASE_DIR}/$REPO_NAME
215
+ fi
216
+ yarn config set registry ${DEFAULT_YARN_REGISTRY}
217
+ }
218
+
219
+ # Here we just add the extension that we want to include as a check (all our official extensions should be included here)
220
+ # Don't forget to add the unit tests exception to clone_repo_test_extension_build function if a new extension has those
221
+ clone_repo_test_extension_build "kubewarden-ui" "kubewarden"
222
+ clone_repo_test_extension_build "elemental-ui" "elemental"
147
223
 
148
224
  echo "All done"
@@ -0,0 +1,183 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+
4
+ // When we receive a request to this URL we will reset the session to replay again from the HAR file
5
+ // This allows the user to refresh the browser and replay the HAR file again
6
+ const RESET_URL = '/api/v1/namespaces/cattle-ui-plugin-system/services/http:ui-plugin-operator:80/proxy/index.json';
7
+
8
+ const EXCLUDES_QS = '?exclude=metadata.managedFields';
9
+
10
+ /**
11
+ * Load the network requests/responses from the har file
12
+ * @param name name/path of the file
13
+ * @param port port that the local dev server is running on
14
+ * @returns har file data
15
+ */
16
+ function loadFile(name, port, dashboard) {
17
+ const newBase = `https://127.0.0.1:${ port }`;
18
+ const data = {};
19
+
20
+ console.log(`Loading HAR file: ${ name }`); // eslint-disable-line no-console
21
+
22
+ const rawData = fs.readFileSync(name);
23
+ const har = JSON.parse(rawData);
24
+ let base = '';
25
+ let uri = '';
26
+
27
+ if (har?.log?.pages) {
28
+ const page = har.log.pages.find((page) => page.title.includes('/dashboard/'));
29
+
30
+ if (page) {
31
+ const parts = page.title.split('/dashboard');
32
+
33
+ base = parts[0];
34
+ uri = parts[1];
35
+ }
36
+ }
37
+
38
+ if (har?.log?.entries) {
39
+ console.log('Network requests:'); // eslint-disable-line no-console
40
+
41
+ har.log.entries.forEach((r) => {
42
+ const mimeType = r.response.content.mimeType;
43
+
44
+ // Only cache json responses
45
+ if (mimeType === 'application/json' || mimeType === 'text/plain') {
46
+ let url = r.request.url;
47
+
48
+ if (url.startsWith(base)) {
49
+ url = url.substr(base.length);
50
+ }
51
+
52
+ console.log(` ${ r.request.method } ${ decodeURIComponent(url) }`); // eslint-disable-line no-console
53
+
54
+ data[url] = data[url] || {};
55
+ data[url][r.request.method] = data[url][r.request.method] || [];
56
+
57
+ const item = {
58
+ status: r.response.status,
59
+ statusText: r.response.statusText,
60
+ headers: r.response.headers,
61
+ content: r.response.content
62
+ };
63
+
64
+ if (item.content.text) {
65
+ item.content.text = item.content.text.replaceAll(base, newBase);
66
+ data[url][r.request.method].push(item);
67
+ } else {
68
+ console.log(' Warning: Omitting this response as there is no content - UI may not work as expected'); // eslint-disable-line no-console
69
+ }
70
+ }
71
+ });
72
+ }
73
+
74
+ console.log('Page:'); // eslint-disable-line no-console
75
+ console.log(` ${ newBase }${ dashboard }${ uri }`); // eslint-disable-line no-console
76
+ console.log(''); // eslint-disable-line no-console
77
+
78
+ return data;
79
+ }
80
+
81
+ function exportToFiles(data, folder) {
82
+ console.log(`Exporting request data to ${ folder }`); // eslint-disable-line no-console
83
+
84
+ Object.keys(data).forEach((r) => {
85
+ const out = path.join(folder, `.${ r }`);
86
+ const dir = path.dirname(out);
87
+
88
+ console.log(r); // eslint-disable-line no-console
89
+
90
+ Object.keys(data[r]).forEach((method) => {
91
+ const name = `${ path.basename(out) }.${ method.toLowerCase() }.json`;
92
+
93
+ fs.mkdirSync(dir, { recursive: true });
94
+
95
+ data[r][method].forEach((request) => {
96
+ const formatted = JSON.stringify(JSON.parse(request.content.text), null, 2);
97
+
98
+ fs.writeFileSync(path.join(dir, name), formatted);
99
+ });
100
+ });
101
+ });
102
+ }
103
+
104
+ function harProxy(responses, folder) {
105
+ let session = JSON.parse(JSON.stringify(responses));
106
+
107
+ return (req, res, next) => {
108
+ if (req.originalUrl === RESET_URL) {
109
+ session = JSON.parse(JSON.stringify(responses));
110
+ console.log('>>>>>>>> Reset session replay from har file'); // eslint-disable-line no-console
111
+ }
112
+
113
+ const url = decodeURIComponent(req.originalUrl);
114
+ let playback = session[req.originalUrl];
115
+
116
+ // If it did not match, try without the metadata excludes query string that was adding in 2.8.0
117
+ // This might allow HAR captures with Rancher < 2.8.0 to be replayed on >= 2.8.0
118
+ if (!playback && req.originalUrl.endsWith(EXCLUDES_QS)) {
119
+ playback = session[req.originalUrl.slice(0, -EXCLUDES_QS.length)];
120
+ }
121
+
122
+ if (playback && playback[req.method] && playback[req.method].length) {
123
+ const resp = playback[req.method][0];
124
+
125
+ if (playback[req.method].length > 1) {
126
+ playback[req.method].shift();
127
+ }
128
+
129
+ const body = resp.content?.text || '';
130
+
131
+ res.type(resp.content.mimeType);
132
+ res.status(resp.status);
133
+ res.send(Buffer.from(body));
134
+ res.end();
135
+
136
+ const char = !!resp.used ? '*' : ' ';
137
+
138
+ console.log(`${ req.method }${ char } ${ resp.status } ${ url }`); // eslint-disable-line no-console
139
+
140
+ resp.used = true;
141
+
142
+ return;
143
+ }
144
+
145
+ if (req.originalUrl.startsWith('/v1/') || req.originalUrl.startsWith('/v3/') || req.originalUrl.startsWith('/k8s/')) {
146
+ // If we have been configured with a folder, look for a file with the contents to use for the request
147
+ if (folder) {
148
+ // Remove query string
149
+ const name = req.originalUrl.split('?')[0];
150
+ const requestFile = path.join(folder, `.${ name }.${ req.method.toLowerCase() }.json`);
151
+
152
+ if (fs.existsSync(requestFile)) {
153
+ const data = fs.readFileSync(requestFile);
154
+
155
+ console.log(`${ req.method }f 200 ${ url }`); // eslint-disable-line no-console
156
+
157
+ res.type('application/json');
158
+ res.status(200);
159
+ res.send(data);
160
+
161
+ return res.end();
162
+ }
163
+ }
164
+
165
+ // Fallback to sending a 404 response
166
+ res.status(404);
167
+ res.send('Not Found');
168
+
169
+ console.log(`${ req.method }? 404 ${ url }`); // eslint-disable-line no-console
170
+
171
+ return res.end();
172
+ }
173
+
174
+ // Continue on to serve up other resources
175
+ return next();
176
+ };
177
+ }
178
+
179
+ module.exports = {
180
+ loadFile,
181
+ harProxy,
182
+ exportToFiles,
183
+ };
package/store/catalog.js CHANGED
@@ -354,7 +354,7 @@ export const actions = {
354
354
 
355
355
  // As per comment above, when there are no clusters this will be management. Store it such that it can be used for those cases
356
356
  commit('setInStore', inStore);
357
- hash.cluster = hash.cluster.filter((repo) => !(repo?.metadata?.annotations?.[CATALOG_ANNOTATIONS.HIDDEN_REPO] === 'true'));
357
+ hash.cluster = hash.cluster?.filter((repo) => !(repo?.metadata?.annotations?.[CATALOG_ANNOTATIONS.HIDDEN_REPO] === 'true'));
358
358
 
359
359
  commit('setRepos', hash);
360
360
 
package/store/features.js CHANGED
@@ -27,6 +27,7 @@ export const mapFeature = function(name) {
27
27
  export const MULTI_CLUSTER = create('multi-cluster-management', true);
28
28
  export const LEGACY = create('legacy', false);
29
29
  export const RKE2 = create('rke2', true);
30
+ export const RKE1_UI = create('rke1-ui', true);
30
31
  export const UNSUPPORTED_STORAGE_DRIVERS = create('unsupported-storage-drivers', false);
31
32
  export const FLEET = create('continuous-delivery', true);
32
33
  export const HARVESTER = create('harvester', true);
package/store/i18n.js CHANGED
@@ -308,6 +308,17 @@ export const actions = {
308
308
  p.push(dispatch('mergeLoad', { locale, module: fn }));
309
309
  });
310
310
 
311
+ // load all of the default locales from the plugins for fallback
312
+ if (locale !== DEFAULT_LOCALE) {
313
+ const defaultI18nExt = rootState.$plugin?.getDynamic('l10n', DEFAULT_LOCALE);
314
+
315
+ if (defaultI18nExt && defaultI18nExt.length) {
316
+ defaultI18nExt.forEach((fn) => {
317
+ p.push(dispatch('mergeLoad', { locale: DEFAULT_LOCALE, module: fn }));
318
+ });
319
+ }
320
+ }
321
+
311
322
  try {
312
323
  await Promise.all(p);
313
324
  } catch (e) {
package/store/index.js CHANGED
@@ -713,10 +713,7 @@ export const actions = {
713
713
 
714
714
  const promises = {
715
715
  // Clusters guaranteed always available or your money back
716
- clusters: dispatch('management/findAll', {
717
- type: MANAGEMENT.CLUSTER,
718
- opt: { url: MANAGEMENT.CLUSTER }
719
- }),
716
+ clusters: dispatch('management/findAll', { type: MANAGEMENT.CLUSTER }),
720
717
 
721
718
  // Features checks on its own if they are available
722
719
  features: dispatch('features/loadServer'),
@@ -887,6 +884,10 @@ export const actions = {
887
884
  // Try and wait until the schema exists before proceeding
888
885
  await dispatch('management/waitForSchema', { type: MANAGEMENT.CLUSTER });
889
886
 
887
+ // Similar to above, we're still waiting on loadManagement to fetch required resources
888
+ // If we don't have all mgmt clusters yet a request to fetch this cluster and then all clusters (in cleanNamespaces) is kicked off
889
+ await dispatch('management/waitForHaveAll', { type: MANAGEMENT.CLUSTER });
890
+
890
891
  // See if it really exists
891
892
  try {
892
893
  const cluster = await dispatch('management/find', {
@@ -1046,15 +1047,13 @@ export const actions = {
1046
1047
  if ( route.name === 'index' ) {
1047
1048
  router.replace('/auth/login');
1048
1049
  } else {
1049
- if (!process.server) {
1050
- const backTo = window.localStorage.getItem(BACK_TO);
1050
+ const backTo = window.localStorage.getItem(BACK_TO);
1051
1051
 
1052
- const isLogin = route.name === 'auth-login' || route.path === '/login'; // Cover dashboard and case of log out from ember;
1053
- const isLogout = route.name === 'auth-logout';
1052
+ const isLogin = route.name === 'auth-login' || route.path === '/login'; // Cover dashboard and case of log out from ember;
1053
+ const isLogout = route.name === 'auth-logout';
1054
1054
 
1055
- if (!backTo && !isLogin && !isLogout) {
1056
- window.localStorage.setItem(BACK_TO, window.location.href);
1057
- }
1055
+ if (!backTo && !isLogin && !isLogout) {
1056
+ window.localStorage.setItem(BACK_TO, window.location.href);
1058
1057
  }
1059
1058
 
1060
1059
  const QUERY = (LOGGED_OUT in route.query) ? LOGGED_OUT : TIMED_OUT;
package/store/prefs.js CHANGED
@@ -345,46 +345,44 @@ export const actions = {
345
345
  commit('cookiesLoaded');
346
346
  },
347
347
 
348
- loadTheme({ state, dispatch }) {
349
- if ( process.client ) {
350
- const watchDark = window.matchMedia('(prefers-color-scheme: dark)');
351
- const watchLight = window.matchMedia('(prefers-color-scheme: light)');
352
- const watchNone = window.matchMedia('(prefers-color-scheme: no-preference)');
353
-
354
- const interval = 30 * 60 * 1000;
355
- const nextHalfHour = interval - Math.round(new Date().getTime()) % interval;
356
-
357
- setTimeout(() => {
358
- dispatch('loadTheme');
359
- }, nextHalfHour);
360
- // console.log('Update theme in', nextHalfHour, 'ms');
348
+ loadTheme({ dispatch }) {
349
+ const watchDark = window.matchMedia('(prefers-color-scheme: dark)');
350
+ const watchLight = window.matchMedia('(prefers-color-scheme: light)');
351
+ const watchNone = window.matchMedia('(prefers-color-scheme: no-preference)');
352
+
353
+ const interval = 30 * 60 * 1000;
354
+ const nextHalfHour = interval - Math.round(new Date().getTime()) % interval;
355
+
356
+ setTimeout(() => {
357
+ dispatch('loadTheme');
358
+ }, nextHalfHour);
359
+ // console.log('Update theme in', nextHalfHour, 'ms');
360
+
361
+ if ( watchDark.matches ) {
362
+ changed('dark');
363
+ } else if ( watchLight.matches ) {
364
+ changed('light');
365
+ } else {
366
+ changed(fromClock());
367
+ }
361
368
 
362
- if ( watchDark.matches ) {
369
+ watchDark.addListener((e) => {
370
+ if ( e.matches ) {
363
371
  changed('dark');
364
- } else if ( watchLight.matches ) {
365
- changed('light');
366
- } else {
367
- changed(fromClock());
368
372
  }
373
+ });
369
374
 
370
- watchDark.addListener((e) => {
371
- if ( e.matches ) {
372
- changed('dark');
373
- }
374
- });
375
-
376
- watchLight.addListener((e) => {
377
- if ( e.matches ) {
378
- changed('light');
379
- }
380
- });
375
+ watchLight.addListener((e) => {
376
+ if ( e.matches ) {
377
+ changed('light');
378
+ }
379
+ });
381
380
 
382
- watchNone.addListener((e) => {
383
- if ( e.matches ) {
384
- changed(fromClock());
385
- }
386
- });
387
- }
381
+ watchNone.addListener((e) => {
382
+ if ( e.matches ) {
383
+ changed(fromClock());
384
+ }
385
+ });
388
386
 
389
387
  function changed(value) {
390
388
  // console.log('Prefers Theme:', value);
package/store/type-map.js CHANGED
@@ -912,6 +912,10 @@ export const getters = {
912
912
  continue;
913
913
  }
914
914
 
915
+ if (item.ifFeature && !rootGetters['features/get'](item.ifFeature)) {
916
+ continue;
917
+ }
918
+
915
919
  if ( isBasic && !getters.groupForBasicType(product, id) ) {
916
920
  continue;
917
921
  } else if ( mode === FAVORITE && !getters.isFavorite(id) ) {
@@ -1844,15 +1848,12 @@ function _rowValueGetter(col) {
1844
1848
  // We will use JsonPath to look up this value, which is costly - so if we can detect this format
1845
1849
  // Use a more efficient function to get the value
1846
1850
  const value = col.field.startsWith('.') ? `$${ col.field }` : col.field;
1851
+ const found = value.match(FIELD_REGEX);
1847
1852
 
1848
- if (process.client) {
1849
- const found = value.match(FIELD_REGEX);
1853
+ if (found && found.length === 2) {
1854
+ const fieldIndex = parseInt(found[1], 10);
1850
1855
 
1851
- if (found && found.length === 2) {
1852
- const fieldIndex = parseInt(found[1], 10);
1853
-
1854
- return (row) => row.metadata?.fields?.[fieldIndex];
1855
- }
1856
+ return (row) => row.metadata?.fields?.[fieldIndex];
1856
1857
  }
1857
1858
 
1858
1859
  return value;
package/tsconfig.json CHANGED
@@ -1,16 +1,42 @@
1
1
  {
2
- "extends": "./tsconfig.default.json",
2
+ "extends": "./tsconfig.paths.json",
3
3
  "compilerOptions": {
4
+ "target": "ES2018",
5
+ "module": "ESNext",
6
+ "moduleResolution": "Node",
7
+ "lib": [
8
+ "ESNext",
9
+ "ESNext.AsyncIterable",
10
+ "DOM"
11
+ ],
12
+ "allowJs": true,
13
+ "sourceMap": true,
14
+ "strict": true,
15
+ "noEmit": false,
16
+ "esModuleInterop": true,
17
+ "baseUrl": ".",
18
+ "rootDir": ".",
4
19
  "types": [
5
- "@types/node",
6
- "@types/jest",
7
- "@nuxt/types",
8
- ]
20
+ "node",
21
+ "jest",
22
+ ],
23
+ "typeRoots": [
24
+ "./node_modules/@types",
25
+ "../node_modules/@types"
26
+ ],
9
27
  },
10
28
  "exclude": [
11
- "cypress",
12
- "./cypress.config.ts",
13
- "**/*.test.ts",
14
- "**/*.spec.ts"
29
+ "node_modules",
30
+ ".nuxt",
31
+ "dist",
32
+ "dist-pkg",
33
+ "../dist",
34
+ "../dist-pkg",
35
+ "../creators",
36
+ "../scripts",
37
+ "../cypress",
38
+ "../cypress.config.ts",
39
+ "../docusaurus",
40
+ "../**/*.spec.ts"
15
41
  ]
16
42
  }
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "paths": {
4
+ "~/*": [
5
+ "../*"
6
+ ],
7
+ "@/*": [
8
+ "../*"
9
+ ],
10
+ "@shell/*": [
11
+ "../shell/*"
12
+ ],
13
+ "@pkg/*": [
14
+ "../shell/pkg/*"
15
+ ]
16
+ },
17
+ },
18
+ }