From 41afa304b7719464e8deb59b6968964816fc5214 Mon Sep 17 00:00:00 2001 From: Jakob Ackermann Date: Fri, 19 Sep 2025 13:02:48 +0200 Subject: [PATCH] [web] switch storybook build to Jenkins (#28590) * [web] add Jenkins pipeline for storybook * [web] fix storybook build * [terraform] dev-project: switch writer for storybook bucket to Jenkins * [web] remove explicit dependency * [terraform] dev-project: link service account * [web] tweak storybook index.html - explicitly sort entries - remove index.html * [packer] jenkins-worker: install m4 * [web] remove cloud build trigger for storybook GitOrigin-RevId: a1aa70ee91644f876d95ae7bc6643b0a1ef59759 --- package-lock.json | 252 +++++++++++------- services/web/.storybook/.jenkinsIncludeFile | 50 ++++ services/web/.storybook/Jenkinsfile | 55 ++++ .../index.html.m4} | 0 services/web/.storybook/main.ts | 6 + services/web/Makefile | 20 +- services/web/cloudbuild-storybook.yaml | 70 ----- services/web/data/.gitignore | 2 +- services/web/package.json | 1 + 9 files changed, 284 insertions(+), 172 deletions(-) create mode 100644 services/web/.storybook/.jenkinsIncludeFile create mode 100644 services/web/.storybook/Jenkinsfile rename services/web/{cloudbuild-storybook-index.html.m4 => .storybook/index.html.m4} (100%) delete mode 100644 services/web/cloudbuild-storybook.yaml diff --git a/package-lock.json b/package-lock.json index 6b0743be0b..4feceed416 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7339,16 +7339,16 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -7356,13 +7356,13 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -7399,18 +7399,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", - "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.27.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "engines": { @@ -7455,15 +7455,25 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -7502,22 +7512,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -7543,15 +7553,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -7561,32 +7571,32 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -7631,12 +7641,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -7746,6 +7756,24 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", @@ -7778,6 +7806,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.25.9.tgz", @@ -9142,47 +9186,77 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -12454,17 +12528,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -12476,15 +12547,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", @@ -12503,10 +12565,11 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -52537,6 +52600,7 @@ "devDependencies": { "@babel/cli": "^7.27.0", "@babel/core": "^7.26.10", + "@babel/plugin-proposal-decorators": "^7.27.0", "@babel/preset-env": "^7.26.9", "@babel/preset-react": "^7.26.3", "@babel/preset-typescript": "^7.27.0", diff --git a/services/web/.storybook/.jenkinsIncludeFile b/services/web/.storybook/.jenkinsIncludeFile new file mode 100644 index 0000000000..62b68002e6 --- /dev/null +++ b/services/web/.storybook/.jenkinsIncludeFile @@ -0,0 +1,50 @@ +services/web/Makefile +services/web/.storybook/** +services/web/config/settings.webpack.js +services/web/frontend/** +services/web/locales/en.json +services/web/public/** + +# echo services/web/modules/*/frontend | xargs -n1 | grep -v writefull | xargs -I% echo '%/**' | sort +# BEGIN GENERATED +services/web/modules/admin-panel/frontend/** +services/web/modules/ai/frontend/** +services/web/modules/algolia-search/frontend/** +services/web/modules/cms/frontend/** +services/web/modules/dropbox/frontend/** +services/web/modules/full-project-search/frontend/** +services/web/modules/git-bridge/frontend/** +services/web/modules/github-sync/frontend/** +services/web/modules/group-audit-log/frontend/** +services/web/modules/group-settings/frontend/** +services/web/modules/institutions/frontend/** +services/web/modules/labs/frontend/** +services/web/modules/launchpad/frontend/** +services/web/modules/learn/frontend/** +services/web/modules/metrics/frontend/** +services/web/modules/oauth2-server/frontend/** +services/web/modules/offline-mode/frontend/** +services/web/modules/onboarding/frontend/** +services/web/modules/open-in-overleaf/frontend/** +services/web/modules/portals/frontend/** +services/web/modules/publish-modal/frontend/** +services/web/modules/references-search/frontend/** +services/web/modules/split-test/frontend/** +services/web/modules/subscriptions/frontend/** +services/web/modules/support/frontend/** +services/web/modules/survey/frontend/** +services/web/modules/symbol-palette/frontend/** +services/web/modules/templates/frontend/** +services/web/modules/tpr-webmodule/frontend/** +services/web/modules/two-factor-authentication/frontend/** +services/web/modules/user-activate/frontend/** +services/web/modules/v1-projects/frontend/** +services/web/modules/v2-templates/frontend/** +# END GENERATED + +# Do not include the Writefull integration. +services/web/modules/writefull/frontend/components/** +services/web/modules/writefull/frontend/shared/** + +package.json +package-lock.json diff --git a/services/web/.storybook/Jenkinsfile b/services/web/.storybook/Jenkinsfile new file mode 100644 index 0000000000..bdfad305f5 --- /dev/null +++ b/services/web/.storybook/Jenkinsfile @@ -0,0 +1,55 @@ +pipeline { + agent { + node { + // Select a VM with the given tabel. + label 'jenkins-agent-web' + // Use the monorepo checkout in /workspace. + customWorkspace '/workspace' + } + } + options { + // Print timestamp next to each log line. + timestamps() + retry(3) + timeout(time: 15, unit: 'MINUTES') + } + environment { + BRANCH_NAME = "${env.CHANGE_BRANCH ? env.CHANGE_BRANCH : env.BRANCH_NAME}" + BUCKET = "gs://overleaf-dev-storybook" + } + stages { + stage('Install') { + steps { + sh 'make install' + } + } + stage('Build') { + steps { + sh 'bin/run -e BRANCH_NAME -w /overleaf/services/web monorepo make build_storybook' + } + } + stage('Copy stories') { + steps { + sh 'gsutil -m copy -r services/web/data/storybook/* "${BUCKET}/"' + } + } + stage('Generate index') { + steps { + dir('services/web') { + sh 'make storybook_index' + } + } + } + stage('Copy index') { + steps { + sh 'gsutil copy services/web/data/storybook/index.html "${BUCKET}/index.html"' + } + } + } + post { + cleanup { + sh 'rm -rf services/web/data/storybook/' + sh 'make clean_jenkins' + } + } +} \ No newline at end of file diff --git a/services/web/cloudbuild-storybook-index.html.m4 b/services/web/.storybook/index.html.m4 similarity index 100% rename from services/web/cloudbuild-storybook-index.html.m4 rename to services/web/.storybook/index.html.m4 diff --git a/services/web/.storybook/main.ts b/services/web/.storybook/main.ts index ad07cd5345..b340d6c612 100644 --- a/services/web/.storybook/main.ts +++ b/services/web/.storybook/main.ts @@ -83,6 +83,7 @@ const config: StorybookConfig = { return { ...options, plugins: [ + ['@babel/plugin-proposal-decorators', { legacy: true }], // ensure that TSX files are transformed before other plugins run ['@babel/plugin-transform-typescript', { isTSX: true }], ...(options.plugins ?? []), @@ -106,6 +107,11 @@ const config: StorybookConfig = { ...storybookConfig.resolve?.alias, // custom prefixes for import paths '@': path.join(rootDir, 'frontend/js/'), + '@ol-types': path.join(rootDir, 'types/'), + '@wf': path.join( + rootDir, + 'modules/writefull/frontend/js/integration/src/' + ), }, }, module: { diff --git a/services/web/Makefile b/services/web/Makefile index e7dd7e7575..ad606ebc65 100644 --- a/services/web/Makefile +++ b/services/web/Makefile @@ -604,13 +604,19 @@ tar: build_storybook: npm run lezer-latex:generate - npm run build-storybook - if [ -n "$(BRANCH_NAME)" ]; then \ - echo "Renaming storybook-static -> $(BRANCH_NAME)."; \ - d=$$(dirname "$(BRANCH_NAME)"); \ - mkdir -p "storybook-output/$$d"; \ - mv storybook-static "storybook-output/$$d/$$(basename "$(BRANCH_NAME)")/"; \ - fi + mkdir -p data/storybook/ + npm run build-storybook -- --output-dir data/storybook/$(BRANCH_NAME) + +storybook_index: + mkdir -p data/storybook/ + m4 \ + -DLIST="$(shell gsutil ls "${BUCKET}/" \ + | sed -E "s@^${BUCKET}/([^/]+)/@\1@" \ + | grep -v -e index.html \ + | sort \ + | tr '\n' ,)" \ + -DBRANCH_NAME="$BRANCH_NAME" .storybook/index.html.m4 \ + > data/storybook/index.html MODULE_TARGETS = \ $(TEST_ACCEPTANCE_MODULES_SAAS) \ diff --git a/services/web/cloudbuild-storybook.yaml b/services/web/cloudbuild-storybook.yaml deleted file mode 100644 index ac1a0b21de..0000000000 --- a/services/web/cloudbuild-storybook.yaml +++ /dev/null @@ -1,70 +0,0 @@ -steps: - - id: npm_ci - name: "node:22.18.0" - entrypoint: /bin/bash - args: - - '-c' - - 'bin/npm_install_subset . libraries/* services/web' - - - id: build-storybook - name: 'node:22.18.0' - env: - - 'BRANCH_NAME=$BRANCH_NAME' - - 'BUILD_ID=$BUILD_ID' - script: | - #!/bin/bash - set -e - make -C services/web BRANCH_NAME="${BRANCH_NAME:-$BUILD_ID}" build_storybook - - - id: deploy-storybook - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' - env: - - 'BRANCH_NAME=$BRANCH_NAME' - - 'BUILD_ID=$BUILD_ID' - - 'BUCKET=gs://overleaf-dev-storybook' - dir: services/web - script: | - #!/bin/bash - : ${BRANCH_NAME:=$BUILD_ID} - [[ "$BRANCH_NAME" ]] || { - echo 1>&2 "ERROR: BRANCH_NAME not set" - exit 2 - } - gsutil -m copy -r storybook-output/* "${BUCKET}/" - waitFor: - - build-storybook - - - id: read-storybook-bucket - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' - dir: services/web - env: - - 'BUCKET=gs://overleaf-dev-storybook' - script: | - #!/bin/bash - set -ex - gsutil ls "${BUCKET}/" \ - | sed -E "s@^${BUCKET}/([^/]+)/@\1@" \ - > storybook-bucket-listing.txt - waitFor: - - deploy-storybook - - - id: create-storybook-index - name: 'node:22.18.0' - dir: services/web - env: - - 'BRANCH_NAME=$BRANCH_NAME' - script: | - #!/bin/bash - set -ex - LIST=$(tr '\n' , < storybook-bucket-listing.txt) - m4 -DLIST="$LIST" -DBRANCH_NAME="$BRANCH_NAME" cloudbuild-storybook-index.html.m4 > storybook-index.html - waitFor: - - read-storybook-bucket - - - id: update-storybook-index - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' - dir: services/web - entrypoint: 'gsutil' - args: [ "copy", "storybook-index.html", "gs://overleaf-dev-storybook/index.html" ] - waitFor: - - create-storybook-index diff --git a/services/web/data/.gitignore b/services/web/data/.gitignore index 0fa27a178d..8790881c38 100644 --- a/services/web/data/.gitignore +++ b/services/web/data/.gitignore @@ -1,4 +1,4 @@ -gnore everything in this directory +# ignore everything in this directory * # Except this file !.gitignore diff --git a/services/web/package.json b/services/web/package.json index 95b9b3d4d5..651b56ac58 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -194,6 +194,7 @@ "devDependencies": { "@babel/cli": "^7.27.0", "@babel/core": "^7.26.10", + "@babel/plugin-proposal-decorators": "^7.27.0", "@babel/preset-env": "^7.26.9", "@babel/preset-react": "^7.26.3", "@babel/preset-typescript": "^7.27.0",