diff --git a/.github/workflows/web-test.yml b/.github/workflows/web-test.yml index 589c988637..16ec03a873 100644 --- a/.github/workflows/web-test.yml +++ b/.github/workflows/web-test.yml @@ -24,7 +24,7 @@ jobs: TURBO_TEAM: signalco TURBO_REMOTE_ONLY: true container: - image: mcr.microsoft.com/playwright:v1.39.0-focal + image: mcr.microsoft.com/playwright:v1.40.0-focal steps: - uses: actions/checkout@v4 with: diff --git a/cloud/infrastructure/package.json b/cloud/infrastructure/package.json index 3dce751e0d..e0894eda7c 100644 --- a/cloud/infrastructure/package.json +++ b/cloud/infrastructure/package.json @@ -11,7 +11,7 @@ "@types/node": "18.18.9", "@typescript-eslint/eslint-plugin": "6.11.0", "@typescript-eslint/parser": "6.11.0", - "eslint": "8.53.0", + "eslint": "8.54.0", "eslint-config-standard": "17.1.0", "eslint-plugin-import": "2.29.0", "eslint-plugin-n": "16.3.1", @@ -26,6 +26,6 @@ "@pulumi/cloudflare": "5.15.0", "@pulumi/command": "0.9.2", "@pulumi/docker": "4.4.5", - "@pulumi/pulumi": "3.94.1" + "@pulumi/pulumi": "3.94.2" } } diff --git a/cloud/infrastructure/pnpm-lock.yaml b/cloud/infrastructure/pnpm-lock.yaml index b85b076651..bbf1b3b780 100644 --- a/cloud/infrastructure/pnpm-lock.yaml +++ b/cloud/infrastructure/pnpm-lock.yaml @@ -24,8 +24,8 @@ dependencies: specifier: 4.4.5 version: 4.4.5 '@pulumi/pulumi': - specifier: 3.94.1 - version: 3.94.1 + specifier: 3.94.2 + version: 3.94.2 devDependencies: '@types/node': @@ -33,28 +33,28 @@ devDependencies: version: 18.18.9 '@typescript-eslint/eslint-plugin': specifier: 6.11.0 - version: 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2) + version: 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0)(typescript@5.2.2) '@typescript-eslint/parser': specifier: 6.11.0 - version: 6.11.0(eslint@8.53.0)(typescript@5.2.2) + version: 6.11.0(eslint@8.54.0)(typescript@5.2.2) eslint: - specifier: 8.53.0 - version: 8.53.0 + specifier: 8.54.0 + version: 8.54.0 eslint-config-standard: specifier: 17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.3.1)(eslint-plugin-promise@6.1.1)(eslint@8.53.0) + version: 17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.3.1)(eslint-plugin-promise@6.1.1)(eslint@8.54.0) eslint-plugin-import: specifier: 2.29.0 - version: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0) + version: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0) eslint-plugin-n: specifier: 16.3.1 - version: 16.3.1(eslint@8.53.0) + version: 16.3.1(eslint@8.54.0) eslint-plugin-node: specifier: 11.1.0 - version: 11.1.0(eslint@8.53.0) + version: 11.1.0(eslint@8.54.0) eslint-plugin-promise: specifier: 6.1.1 - version: 6.1.1(eslint@8.53.0) + version: 6.1.1(eslint@8.54.0) typescript: specifier: 5.2.2 version: 5.2.2 @@ -70,18 +70,18 @@ packages: resolution: {integrity: sha512-YPNYtwEnKu23VDHNFu91xd/Ueu5zYONHcYwKDA5qTvtgZZ1nzrvPJgrO15KF0fLRVlGo7yckirDS26GpvBTe6w==} requiresBuild: true dependencies: - '@pulumi/pulumi': 3.94.1 + '@pulumi/pulumi': 3.94.2 transitivePeerDependencies: - supports-color dev: false - /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.53.0 + eslint: 8.54.0 eslint-visitor-keys: 3.4.3 dev: true @@ -107,8 +107,8 @@ packages: - supports-color dev: true - /@eslint/js@8.53.0: - resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -365,7 +365,7 @@ packages: /@pulumi/aws@6.9.0: resolution: {integrity: sha512-c0ivz01YEuZesfroFSQJdjXivyltdvXBW8hcOhGCwAycjmHpDnXI0HSXk9aIkwxVrUBAW0MQYEa+QRHb5W2V1Q==} dependencies: - '@pulumi/pulumi': 3.94.1 + '@pulumi/pulumi': 3.94.2 builtin-modules: 3.0.0 mime: 2.6.0 read-package-tree: 5.3.1 @@ -377,7 +377,7 @@ packages: /@pulumi/azure-native@2.18.0: resolution: {integrity: sha512-mp6MlTmM1GRj1EXLk5cfwGTZtmAFFjb1taAjs53xHl7YLnW+wLd/Ff0Su+uvloLGUgV2JJIOjdaegQqcR1Aj+w==} dependencies: - '@pulumi/pulumi': 3.94.1 + '@pulumi/pulumi': 3.94.2 transitivePeerDependencies: - supports-color dev: false @@ -385,7 +385,7 @@ packages: /@pulumi/cloudflare@5.15.0: resolution: {integrity: sha512-h7jhFv4hTpdki5F5MwS6CVMUorfiragesGrnIl/YZtw2BZZL7hlFMODnJTZyq7RBVQcoMSigSvfOI8M404egKQ==} dependencies: - '@pulumi/pulumi': 3.94.1 + '@pulumi/pulumi': 3.94.2 transitivePeerDependencies: - supports-color dev: false @@ -394,7 +394,7 @@ packages: resolution: {integrity: sha512-9RaGDiy8jFCiaarj4EOrMW/fVCM/AgBigzwM6CKzlR49x8UFiRDmKrXfEVHb8r2P9IpC4IaAZf5VbNNAHwN/rA==} requiresBuild: true dependencies: - '@pulumi/pulumi': 3.94.1 + '@pulumi/pulumi': 3.94.2 transitivePeerDependencies: - supports-color dev: false @@ -402,14 +402,14 @@ packages: /@pulumi/docker@4.4.5: resolution: {integrity: sha512-Y3q/aI9HQEN3FwgGbTTURFaD+vQLlG5CXiHD4lnlbqt4USU9BhMeYpT6BbwHktFxnNil/8FYr2mX7X4MetQidg==} dependencies: - '@pulumi/pulumi': 3.94.1 + '@pulumi/pulumi': 3.94.2 semver: 5.7.2 transitivePeerDependencies: - supports-color dev: false - /@pulumi/pulumi@3.94.1: - resolution: {integrity: sha512-uftw2Ry9W0s6t5cAYWGPSIzB82n0dSuwUR21k8WaO9P56cO0aaUIdCxsORcNL4kI7+z7LJQOBVYcGNYVHvZeJQ==} + /@pulumi/pulumi@3.94.2: + resolution: {integrity: sha512-3EophVuj7XDtLrY2UcofO0GTgwbr6RCFG1mRC0X1jYImpMGUAP++DYfKMnDGTu9vAAW7h2kJb0s361aLAKunnQ==} engines: {node: '>=8.13.0 || >=10.10.0'} dependencies: '@grpc/grpc-js': 1.9.6 @@ -462,7 +462,7 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true - /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -474,13 +474,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.11.0 - '@typescript-eslint/type-utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.11.0(eslint@8.54.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.11.0(eslint@8.54.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.11.0 debug: 4.3.4 - eslint: 8.53.0 + eslint: 8.54.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -491,7 +491,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.11.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -506,7 +506,7 @@ packages: '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.11.0 debug: 4.3.4 - eslint: 8.53.0 + eslint: 8.54.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -520,7 +520,7 @@ packages: '@typescript-eslint/visitor-keys': 6.11.0 dev: true - /@typescript-eslint/type-utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.11.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -531,9 +531,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.11.0(eslint@8.54.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.53.0 + eslint: 8.54.0 ts-api-utils: 1.0.1(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: @@ -566,19 +566,19 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.11.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 6.11.0 '@typescript-eslint/types': 6.11.0 '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2) - eslint: 8.53.0 + eslint: 8.54.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -984,7 +984,7 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-standard@17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.3.1)(eslint-plugin-promise@6.1.1)(eslint@8.53.0): + /eslint-config-standard@17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.3.1)(eslint-plugin-promise@6.1.1)(eslint@8.54.0): resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} engines: {node: '>=12.0.0'} peerDependencies: @@ -993,10 +993,10 @@ packages: eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 dependencies: - eslint: 8.53.0 - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0) - eslint-plugin-n: 16.3.1(eslint@8.53.0) - eslint-plugin-promise: 6.1.1(eslint@8.53.0) + eslint: 8.54.0 + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0) + eslint-plugin-n: 16.3.1(eslint@8.54.0) + eslint-plugin-promise: 6.1.1(eslint@8.54.0) dev: true /eslint-import-resolver-node@0.3.9: @@ -1009,7 +1009,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.53.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.54.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -1030,37 +1030,37 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.53.0 + eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es-x@7.1.0(eslint@8.53.0): + /eslint-plugin-es-x@7.1.0(eslint@8.54.0): resolution: {integrity: sha512-AhiaF31syh4CCQ+C5ccJA0VG6+kJK8+5mXKKE7Qs1xcPRg02CDPOj3mWlQxuWS/AYtg7kxrDNgW9YW3vc0Q+Mw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@eslint-community/regexpp': 4.6.2 - eslint: 8.53.0 + eslint: 8.54.0 dev: true - /eslint-plugin-es@3.0.1(eslint@8.53.0): + /eslint-plugin-es@3.0.1(eslint@8.54.0): resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.53.0 + eslint: 8.54.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0): + /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0): resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: @@ -1070,16 +1070,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.53.0 + eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.53.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.54.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -1095,16 +1095,16 @@ packages: - supports-color dev: true - /eslint-plugin-n@16.3.1(eslint@8.53.0): + /eslint-plugin-n@16.3.1(eslint@8.54.0): resolution: {integrity: sha512-w46eDIkxQ2FaTHcey7G40eD+FhTXOdKudDXPUO2n9WNcslze/i/HT2qJ3GXjHngYSGDISIgPNhwGtgoix4zeOw==} engines: {node: '>=16.0.0'} peerDependencies: eslint: '>=7.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) builtins: 5.0.1 - eslint: 8.53.0 - eslint-plugin-es-x: 7.1.0(eslint@8.53.0) + eslint: 8.54.0 + eslint-plugin-es-x: 7.1.0(eslint@8.54.0) get-tsconfig: 4.7.0 ignore: 5.2.4 is-builtin-module: 3.2.1 @@ -1114,14 +1114,14 @@ packages: semver: 7.5.4 dev: true - /eslint-plugin-node@11.1.0(eslint@8.53.0): + /eslint-plugin-node@11.1.0(eslint@8.54.0): resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=5.16.0' dependencies: - eslint: 8.53.0 - eslint-plugin-es: 3.0.1(eslint@8.53.0) + eslint: 8.54.0 + eslint-plugin-es: 3.0.1(eslint@8.54.0) eslint-utils: 2.1.0 ignore: 5.2.4 minimatch: 3.1.2 @@ -1129,13 +1129,13 @@ packages: semver: 6.3.1 dev: true - /eslint-plugin-promise@6.1.1(eslint@8.53.0): + /eslint-plugin-promise@6.1.1(eslint@8.54.0): resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.53.0 + eslint: 8.54.0 dev: true /eslint-scope@7.2.2: @@ -1163,15 +1163,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.53.0: - resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.3 - '@eslint/js': 8.53.0 + '@eslint/js': 8.54.0 '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 diff --git a/station/Signal.Beacon.Voice/Signal.Beacon.Voice.csproj b/station/Signal.Beacon.Voice/Signal.Beacon.Voice.csproj index 443dd46ab4..a69740b9f6 100644 --- a/station/Signal.Beacon.Voice/Signal.Beacon.Voice.csproj +++ b/station/Signal.Beacon.Voice/Signal.Beacon.Voice.csproj @@ -21,7 +21,7 @@ - + diff --git a/web/apps/app/package.json b/web/apps/app/package.json index f43e5f4168..55a6579ced 100644 --- a/web/apps/app/package.json +++ b/web/apps/app/package.json @@ -42,7 +42,7 @@ "@tanstack/react-query-devtools": "5.8.4", "@tanstack/react-query-persist-client": "5.8.4", "@vercel/analytics": "1.1.1", - "@vvo/tzdb": "6.112.0", + "@vvo/tzdb": "6.113.0", "autoprefixer": "10.4.16", "classix": "2.1.35", "cobe": "0.6.3", @@ -72,7 +72,7 @@ "@axe-core/playwright": "4.8.1", "@ducanh2912/next-pwa": "9.7.2", "@next/bundle-analyzer": "14.0.3", - "@playwright/test": "1.39.0", + "@playwright/test": "1.40.0", "@signalco/eslint-config-signalco": "workspace:*", "@signalco/tsconfig": "workspace:*", "@total-typescript/ts-reset": "0.5.1", @@ -88,7 +88,7 @@ "@types/uuid": "9.0.7", "colorette": "2.0.20", "cross-env": "7.0.3", - "eslint": "8.53.0", + "eslint": "8.54.0", "fs-extra": "11.1.1", "next-sitemap": "4.2.3", "openapi-types": "12.1.3", diff --git a/web/apps/blog/package.json b/web/apps/blog/package.json index 62fb85c8ec..193a0793cb 100644 --- a/web/apps/blog/package.json +++ b/web/apps/blog/package.json @@ -47,7 +47,7 @@ "@axe-core/playwright": "4.8.1", "@babel/core": "7.23.3", "@next/bundle-analyzer": "14.0.3", - "@playwright/test": "1.39.0", + "@playwright/test": "1.40.0", "@signalco/eslint-config-signalco": "workspace:*", "@signalco/tsconfig": "workspace:*", "@total-typescript/ts-reset": "0.5.1", @@ -59,7 +59,7 @@ "@types/react-dom": "18.2.15", "colorette": "2.0.20", "cross-env": "7.0.3", - "eslint": "8.53.0", + "eslint": "8.54.0", "next-sitemap": "4.2.3", "postcss": "8.4.31", "rimraf": "5.0.5", diff --git a/web/apps/brandgrab/package.json b/web/apps/brandgrab/package.json index 3b35e80280..af4c970184 100644 --- a/web/apps/brandgrab/package.json +++ b/web/apps/brandgrab/package.json @@ -37,7 +37,7 @@ "@axe-core/playwright": "4.8.1", "@babel/core": "7.23.3", "@next/bundle-analyzer": "14.0.3", - "@playwright/test": "1.39.0", + "@playwright/test": "1.40.0", "@signalco/eslint-config-signalco": "workspace:*", "@signalco/tsconfig": "workspace:*", "@types/color": "3.0.6", @@ -46,7 +46,7 @@ "@types/react-dom": "18.2.15", "@types/sharp": "0.31.1", "cross-env": "7.0.3", - "eslint": "8.53.0", + "eslint": "8.54.0", "next-sitemap": "4.2.3", "postcss": "8.4.31", "rimraf": "5.0.5", diff --git a/web/apps/doprocess.app/app/(embedded)/processes/[id]/embedded/page.tsx b/web/apps/doprocess.app/app/(embedded)/processes/[id]/embedded/page.tsx index 0324997d78..55d890f737 100644 --- a/web/apps/doprocess.app/app/(embedded)/processes/[id]/embedded/page.tsx +++ b/web/apps/doprocess.app/app/(embedded)/processes/[id]/embedded/page.tsx @@ -1,5 +1,5 @@ import { TaskDetails } from '../../../../../components/processes/tasks/TaskDetails'; -import { ProcessDetails } from '../../../../../components/processes/ProcessDetails'; +import { ProcessDetails } from '../../../../../components/processes/processes/ProcessDetails'; import { SplitView } from '../../../../../components/layouts/SplitView'; export default function ProcessEmbeddedPage({ params }: { params: { id: string } }) { diff --git a/web/apps/doprocess.app/app/(embedded)/processes/[id]/runs/[runId]/embedded/page.tsx b/web/apps/doprocess.app/app/(embedded)/processes/[id]/runs/[runId]/embedded/page.tsx index 16c52151f9..562d6728b8 100644 --- a/web/apps/doprocess.app/app/(embedded)/processes/[id]/runs/[runId]/embedded/page.tsx +++ b/web/apps/doprocess.app/app/(embedded)/processes/[id]/runs/[runId]/embedded/page.tsx @@ -1,5 +1,5 @@ import { TaskDetails } from '../../../../../../../components/processes/tasks/TaskDetails'; -import { ProcessDetails } from '../../../../../../../components/processes/ProcessDetails'; +import { ProcessDetails } from '../../../../../../../components/processes/processes/ProcessDetails'; import { SplitView } from '../../../../../../../components/layouts/SplitView'; export default function ProcessEmbeddedPage({ params }: { params: { id: string, runId: string } }) { diff --git a/web/apps/doprocess.app/app/(rest)/(app)/processes/[id]/layout.tsx b/web/apps/doprocess.app/app/(rest)/(app)/processes/[id]/layout.tsx index 6454c5795d..c68502fb2f 100644 --- a/web/apps/doprocess.app/app/(rest)/(app)/processes/[id]/layout.tsx +++ b/web/apps/doprocess.app/app/(rest)/(app)/processes/[id]/layout.tsx @@ -5,8 +5,8 @@ import { usePathname } from 'next/navigation'; import { Stack } from '@signalco/ui/dist/Stack'; import { Breadcrumbs } from '@signalco/ui/dist/Breadcrumbs'; import { KnownPages } from '../../../../../src/knownPages'; -import { TypographyProcessName } from '../../../../../components/processes/TypographyProcessName'; -import { ProcessDetails } from '../../../../../components/processes/ProcessDetails'; +import { TypographyProcessName } from '../../../../../components/processes/processes/TypographyProcessName'; +import { ProcessDetails } from '../../../../../components/processes/processes/ProcessDetails'; import { SplitView } from '../../../../../components/layouts/SplitView'; export default function ProcessLayout({ children, params }: PropsWithChildren<{ params: { id: string } }>) { diff --git a/web/apps/doprocess.app/app/(rest)/(app)/processes/[id]/runs/page.tsx b/web/apps/doprocess.app/app/(rest)/(app)/processes/[id]/runs/page.tsx index 80464a1d92..2460e2f6fb 100644 --- a/web/apps/doprocess.app/app/(rest)/(app)/processes/[id]/runs/page.tsx +++ b/web/apps/doprocess.app/app/(rest)/(app)/processes/[id]/runs/page.tsx @@ -1,4 +1,4 @@ -import { RunsListView } from '../../../../../../components/processes/RunsListView'; +import { RunsListView } from '../../../../../../components/processes/processes/RunsListView'; export default function ProcessRunsPage({ params }: { params: { id: string } }) { const processId = params.id; diff --git a/web/apps/doprocess.app/app/(rest)/(app)/processes/page.tsx b/web/apps/doprocess.app/app/(rest)/(app)/processes/page.tsx index 85aacd1418..e22b51a00e 100644 --- a/web/apps/doprocess.app/app/(rest)/(app)/processes/page.tsx +++ b/web/apps/doprocess.app/app/(rest)/(app)/processes/page.tsx @@ -1,4 +1,4 @@ -import { ProcessesListView } from '../../../../components/processes/ProcessesListView'; +import { ProcessesListView } from '../../../../components/processes/processes/ProcessesListView'; export default function ProcessesPage() { return ( diff --git a/web/apps/doprocess.app/app/(rest)/(app)/runs/page.tsx b/web/apps/doprocess.app/app/(rest)/(app)/runs/page.tsx index 2a8dd4ffed..3ef7419d16 100644 --- a/web/apps/doprocess.app/app/(rest)/(app)/runs/page.tsx +++ b/web/apps/doprocess.app/app/(rest)/(app)/runs/page.tsx @@ -1,4 +1,4 @@ -import { RunsListView } from '../../../../components/processes/RunsListView'; +import { RunsListView } from '../../../../components/processes/processes/RunsListView'; export default function RunsPage() { return ( diff --git a/web/apps/doprocess.app/app/api/processes/[id]/runs/[runId]/route.ts b/web/apps/doprocess.app/app/api/processes/[id]/runs/[runId]/route.ts index 6da86528fe..62feae1422 100644 --- a/web/apps/doprocess.app/app/api/processes/[id]/runs/[runId]/route.ts +++ b/web/apps/doprocess.app/app/api/processes/[id]/runs/[runId]/route.ts @@ -1,4 +1,4 @@ -import { deleteProcessRun, getProcessIdByPublicId, getProcessRun, getProcessRunIdByPublicId } from '../../../../../../src/lib/repo/processesRepository'; +import { deleteProcessRun, getProcessIdByPublicId, getProcessRun, getProcessRunIdByPublicId, renameProcessRun } from '../../../../../../src/lib/repo/processesRepository'; import { ensureUserId } from '../../../../../../src/lib/auth/apiAuth'; import { requiredParamString } from '../../../../../../src/lib/api/apiParam'; @@ -28,6 +28,27 @@ export async function GET(_request: Request, { params }: { params: { id: string, return Response.json(processRunDto); } +export async function PUT(request: Request, { params }: { params: { id: string, runId: string } }) { + const processPublicId = requiredParamString(params.id); + const runPublicId = requiredParamString(params.runId); + + const { userId } = ensureUserId(); + + const processId = await getProcessIdByPublicId(processPublicId); + if (processId == null) + return new Response(null, { status: 404 }); + const runId = await getProcessRunIdByPublicId(processPublicId, runPublicId); + if (runId == null) + return new Response(null, { status: 404 }); + + const data = await request.json(); + if (data != null && typeof data === 'object' && 'name' in data && typeof data.name === 'string') { + await renameProcessRun(userId, processId, runId, data.name); + } + + return Response.json(null); +} + export async function DELETE(_request: Request, { params }: { params: { id: string, runId: string } }) { const processPublicId = requiredParamString(params.id); const runPublicId = requiredParamString(params.runId); diff --git a/web/apps/doprocess.app/app/api/processes/[id]/task-definitions/[taskDefinitionId]/route.ts b/web/apps/doprocess.app/app/api/processes/[id]/task-definitions/[taskDefinitionId]/route.ts index 0d39e70c0d..ae5e4a2203 100644 --- a/web/apps/doprocess.app/app/api/processes/[id]/task-definitions/[taskDefinitionId]/route.ts +++ b/web/apps/doprocess.app/app/api/processes/[id]/task-definitions/[taskDefinitionId]/route.ts @@ -1,4 +1,4 @@ -import { changeTaskDefinitionText, changeTaskDefinitionType, deleteTaskDefinition, getProcess, getProcessIdByPublicId, getTaskDefinition, getTaskDefinitionIdByPublicId } from '../../../../../../src/lib/repo/processesRepository'; +import { changeTaskDefinitionOrder, changeTaskDefinitionText, changeTaskDefinitionType, deleteTaskDefinition, getProcess, getProcessIdByPublicId, getTaskDefinition, getTaskDefinitionIdByPublicId } from '../../../../../../src/lib/repo/processesRepository'; import { documentCreate, documentGet } from '../../../../../../src/lib/repo/documentsRepository'; import { ensureUserId } from '../../../../../../src/lib/auth/apiAuth'; import { requiredParamString } from '../../../../../../src/lib/api/apiParam'; @@ -68,6 +68,9 @@ export async function PUT(request: Request, { params }: { params: { id: string, await changeTaskDefinitionType(userId, processId, taskDefinitionId, data.type, typeData); } + if ('order' in data && typeof data.order === 'string') { + await changeTaskDefinitionOrder(userId, processId, taskDefinitionId, data.order); + } } return Response.json(null); diff --git a/web/apps/doprocess.app/components/PageNav.tsx b/web/apps/doprocess.app/components/PageNav.tsx index 8e85f66bb0..6c8f137066 100644 --- a/web/apps/doprocess.app/components/PageNav.tsx +++ b/web/apps/doprocess.app/components/PageNav.tsx @@ -28,10 +28,14 @@ function NavMenu({ cta }: { cta?: boolean }) { ))} - + Sign in - + }> @@ -43,7 +47,7 @@ function NavMenu({ cta }: { cta?: boolean }) { {cta && ( }> Go to app diff --git a/web/apps/doprocess.app/components/layouts/Sidebar.tsx b/web/apps/doprocess.app/components/layouts/Sidebar.tsx index dda2de2fd6..9b9ef43adb 100644 --- a/web/apps/doprocess.app/components/layouts/Sidebar.tsx +++ b/web/apps/doprocess.app/components/layouts/Sidebar.tsx @@ -13,8 +13,8 @@ export function Sidebar({ open, onOpenChange }: { open: boolean, onOpenChange?: const pathname = usePathname(); const links = useMemo(() => [ - { href: KnownPages.Processes, label: 'Processes', Icon: ListChecks }, { href: KnownPages.Runs, label: 'Runs', Icon: Play }, + { href: KnownPages.Processes, label: 'Processes', Icon: ListChecks }, { href: KnownPages.Documents, label: 'Documents', Icon: FileText }, ], []); diff --git a/web/apps/doprocess.app/components/processes/ProcessDeleteModal.tsx b/web/apps/doprocess.app/components/processes/ProcessDeleteModal.tsx deleted file mode 100644 index cb6814737e..0000000000 --- a/web/apps/doprocess.app/components/processes/ProcessDeleteModal.tsx +++ /dev/null @@ -1,34 +0,0 @@ -'use client'; - -import { useRouter } from 'next/navigation'; -import { ModalConfirm, ModalConfirmProps } from '@signalco/ui/dist/ModalConfirm'; -import { useProcessDelete } from '../../src/hooks/useProcessDelete'; -import { ProcessDto } from '../../app/api/dtos/dtos'; - -type ProcessDeleteModalProps = Omit & { - process: ProcessDto; - redirect?: string; -}; - -export function ProecssDeleteModal({ process, redirect, ...rest }: ProcessDeleteModalProps) { - const router = useRouter(); - const processDelete = useProcessDelete(); - - const handleConfirmDelete = async () => { - await processDelete.mutateAsync({ - id: process.id, - }); - if (redirect) { - router.push(redirect); - } - }; - - return ( - - By deleting this process, all existing runs will be deleted too. - - ); -} diff --git a/web/apps/doprocess.app/components/processes/ProcessDetails.tsx b/web/apps/doprocess.app/components/processes/ProcessDetails.tsx deleted file mode 100644 index 71649965b2..0000000000 --- a/web/apps/doprocess.app/components/processes/ProcessDetails.tsx +++ /dev/null @@ -1,97 +0,0 @@ -'use client'; - -import { useState } from 'react'; -import { cx } from 'classix'; -import { Delete, ListChecks, MoreHorizontal, Play } from '@signalco/ui-icons'; -import { Stack } from '@signalco/ui/dist/Stack'; -import { Skeleton } from '@signalco/ui/dist/Skeleton'; -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@signalco/ui/dist/Menu'; -import { Loadable } from '@signalco/ui/dist/Loadable'; -import { IconButton } from '@signalco/ui/dist/IconButton'; -import { ListHeader } from '../shared/ListHeader'; -import { KnownPages } from '../../src/knownPages'; -import { useProcess } from '../../src/hooks/useProcess'; -import { TypographyProcessRunName } from './TypographyProcessRunName'; -import { TypographyProcessName } from './TypographyProcessName'; -import { TaskList } from './tasks/TaskList'; -import { ProcessRunCreateModal } from './ProcessRunCreateModal'; -import { ProecssDeleteModal } from './ProcessDeleteModal'; - -type ProcessDetailsProps = { - id: string; - runId?: string; - editable: boolean; -}; - -export function ProcessDetails({ id, runId, editable }: ProcessDetailsProps) { - const { data: process, isLoading: isLoadingProcess, error: errorProcess } = useProcess(id); - - const [deleteOpen, setDeleteOpen] = useState(false); - - const isRun = Boolean(runId); - - if (process === null) { - return ( - - {isRun ? 'Process run' : 'Process'} not found - The {isRun ? 'process run' : 'process'} you are trying to access does not exist. - - ); - } - - return ( - <> - - } - error={errorProcess}> - : } - header={ - isRun - ? () - : () - } - actions={[ - (process && editable && !isRun) && , - (editable && !isRun) && ( - - - - - - - - } href={KnownPages.ProcessRuns(id)}> - View process runs - - - } onClick={() => setDeleteOpen(true)}> - Delete... - - - - ) - ]} /> - - - - {process && ( - - )} - > - ); -} diff --git a/web/apps/doprocess.app/components/processes/RunsList.tsx b/web/apps/doprocess.app/components/processes/RunsList.tsx deleted file mode 100644 index 773abe94e4..0000000000 --- a/web/apps/doprocess.app/components/processes/RunsList.tsx +++ /dev/null @@ -1,18 +0,0 @@ -'use client'; - -import { List } from '../shared/List'; -import { useProcessRuns } from '../../src/hooks/useProcessRuns'; -import { useProcessesRuns } from '../../src/hooks/useProcessesRuns'; -import { RunsListItem } from './RunsListItem'; - -export function RunsList({ processId }: { processId?: string }) { - const processRuns = useProcessRuns(processId); - const processesRuns = useProcessesRuns(!processId); - - return ( - processId ? processRuns : processesRuns} - itemRender={(item) => ()} - /> - ); -} diff --git a/web/apps/doprocess.app/components/processes/documents/DocumentsList.tsx b/web/apps/doprocess.app/components/processes/documents/DocumentsList.tsx index 1503faed68..35b4670c17 100644 --- a/web/apps/doprocess.app/components/processes/documents/DocumentsList.tsx +++ b/web/apps/doprocess.app/components/processes/documents/DocumentsList.tsx @@ -11,7 +11,7 @@ export function DocumentsList() { query={useDocuments} itemRender={(item) => ()} editable - itemCreateLabel="Create new document" + itemCreateLabel="New document" createForm={} /> ); diff --git a/web/apps/doprocess.app/components/processes/ProcessCreateForm.tsx b/web/apps/doprocess.app/components/processes/processes/ProcessCreateForm.tsx similarity index 91% rename from web/apps/doprocess.app/components/processes/ProcessCreateForm.tsx rename to web/apps/doprocess.app/components/processes/processes/ProcessCreateForm.tsx index c003d6774f..dc7d063012 100644 --- a/web/apps/doprocess.app/components/processes/ProcessCreateForm.tsx +++ b/web/apps/doprocess.app/components/processes/processes/ProcessCreateForm.tsx @@ -7,8 +7,8 @@ import { Tooltip } from '@signalco/ui/dist/Tooltip'; import { Stack } from '@signalco/ui/dist/Stack'; import { Input } from '@signalco/ui/dist/Input'; import { Button } from '@signalco/ui/dist/Button'; -import { KnownPages } from '../../src/knownPages'; -import { useProcessCreate } from '../../src/hooks/useProcessCreate'; +import { KnownPages } from '../../../src/knownPages'; +import { useProcessCreate } from '../../../src/hooks/useProcessCreate'; export function ProcessCreateForm({ redirect }: { redirect?: boolean }) { const router = useRouter(); diff --git a/web/apps/doprocess.app/components/processes/processes/ProcessDetails.tsx b/web/apps/doprocess.app/components/processes/processes/ProcessDetails.tsx new file mode 100644 index 0000000000..18697f08c9 --- /dev/null +++ b/web/apps/doprocess.app/components/processes/processes/ProcessDetails.tsx @@ -0,0 +1,26 @@ +import { Stack } from '@signalco/ui/dist/Stack'; +import { TaskList } from '../tasks/TaskList'; +import { ProcessDetailsHeader } from './ProcessDetailsHeader'; + +type ProcessDetailsProps = { + id: string; + runId?: string; + editable: boolean; +}; + +export function ProcessDetails({ id, runId, editable }: ProcessDetailsProps) { + return ( + <> + + + + + > + ); +} diff --git a/web/apps/doprocess.app/components/processes/processes/ProcessDetailsHeader.tsx b/web/apps/doprocess.app/components/processes/processes/ProcessDetailsHeader.tsx new file mode 100644 index 0000000000..f03de3a7e1 --- /dev/null +++ b/web/apps/doprocess.app/components/processes/processes/ProcessDetailsHeader.tsx @@ -0,0 +1,78 @@ +'use client'; + +import { useState } from 'react'; +import { cx } from 'classix'; +import { Delete, ListChecks, MoreHorizontal, Play } from '@signalco/ui-icons'; +import { Skeleton } from '@signalco/ui/dist/Skeleton'; +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@signalco/ui/dist/Menu'; +import { Loadable } from '@signalco/ui/dist/Loadable'; +import { IconButton } from '@signalco/ui/dist/IconButton'; +import { ListHeader } from '../../shared/ListHeader'; +import { KnownPages } from '../../../src/knownPages'; +import { useProcess } from '../../../src/hooks/useProcess'; +import { TypographyProcessRunName } from './TypographyProcessRunName'; +import { TypographyProcessName } from './TypographyProcessName'; +import { ProcessRunCreateModal } from './ProcessRunCreateModal'; +import { ProcessOrRunDeleteModal } from './ProcessOrRunDeleteModal'; + +export function ProcessDetailsHeader({ + processId, runId, editable +}: { + processId: string; + runId?: string; + editable: boolean; +}) { + const { data: process, isLoading: isLoadingProcess, error: errorProcess } = useProcess(processId); + const [deleteOpen, setDeleteOpen] = useState(false); + + const isRun = Boolean(runId); + + return ( + } + error={errorProcess}> + : } + header={isRun + ? () + : ()} + actions={[ + (process && editable && !isRun) && , + (editable) && ( + + + + + + + + {!isRun && ( + <> + } href={KnownPages.ProcessRuns(processId)}> + View process runs + + + > + )} + } onClick={() => setDeleteOpen(true)}> + Delete... + + + + ) + ]} /> + + + ); +} diff --git a/web/apps/doprocess.app/components/processes/processes/ProcessOrRunDeleteModal.tsx b/web/apps/doprocess.app/components/processes/processes/ProcessOrRunDeleteModal.tsx new file mode 100644 index 0000000000..a1ad7ecb84 --- /dev/null +++ b/web/apps/doprocess.app/components/processes/processes/ProcessOrRunDeleteModal.tsx @@ -0,0 +1,43 @@ +'use client'; + +import { useRouter } from 'next/navigation'; +import { ModalConfirm, ModalConfirmProps } from '@signalco/ui/dist/ModalConfirm'; +import { useProcessRunDelete } from '../../../src/hooks/useProcessRunDelete'; +import { useProcessDelete } from '../../../src/hooks/useProcessDelete'; + +type ProcessDeleteModalProps = Omit & { + processId: string; + runId?: string; + redirect?: string; +}; + +export function ProcessOrRunDeleteModal({ processId, runId, redirect, ...rest }: ProcessDeleteModalProps) { + const router = useRouter(); + const processDelete = useProcessDelete(); + const processRunDelete = useProcessRunDelete(); + + const handleConfirmDelete = async () => { + if (runId) { + await processRunDelete.mutateAsync({ + processId, + runId, + }); + } else { + await processDelete.mutateAsync({ + processId, + }); + } + if (redirect) { + router.push(redirect); + } + }; + + return ( + + {runId ? 'By deleting this process run, all process run progress will be lost.' :'By deleting this process, all existing runs will be deleted too.'} + + ); +} diff --git a/web/apps/doprocess.app/components/processes/ProcessRunCreateForm.tsx b/web/apps/doprocess.app/components/processes/processes/ProcessRunCreateForm.tsx similarity index 65% rename from web/apps/doprocess.app/components/processes/ProcessRunCreateForm.tsx rename to web/apps/doprocess.app/components/processes/processes/ProcessRunCreateForm.tsx index b22c90eb91..5e09b252bc 100644 --- a/web/apps/doprocess.app/components/processes/ProcessRunCreateForm.tsx +++ b/web/apps/doprocess.app/components/processes/processes/ProcessRunCreateForm.tsx @@ -1,21 +1,26 @@ 'use client'; -import { useState } from 'react'; + +import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { Play } from '@signalco/ui-icons'; import { Stack } from '@signalco/ui/dist/Stack'; import { Row } from '@signalco/ui/dist/Row'; import { Input } from '@signalco/ui/dist/Input'; import { Button } from '@signalco/ui/dist/Button'; -import { KnownPages } from '../../src/knownPages'; -import { useProcessRunCreate } from '../../src/hooks/useProcessRunCreate'; -import { ProcessDto } from '../../app/api/dtos/dtos'; +import { KnownPages } from '../../../src/knownPages'; +import { useProcessRunCreate } from '../../../src/hooks/useProcessRunCreate'; +import { useProcess } from '../../../src/hooks/useProcess'; -export function ProcessRunCreateForm({ process }: { process: ProcessDto; }) { - const { id: processId, name: processName } = process; +export function ProcessRunCreateForm({ processId, redirect }: { processId: string, redirect?: boolean }) { + const { data: process } = useProcess(processId); const router = useRouter(); const processRunCreate = useProcessRunCreate(); - const [name, setName] = useState(`${processName} - ${new Date().toLocaleString()} run`); + const [name, setName] = useState(`${process?.name} - ${new Date().toLocaleString()} run`); + + useEffect(() => { + setName(`${process?.name} - ${new Date().toLocaleString()} run`); + }, [process?.name]); const handleRunProcess = async () => { if (!name.length) { @@ -26,7 +31,7 @@ export function ProcessRunCreateForm({ process }: { process: ProcessDto; }) { processId: processId.toString(), name }); - if (result?.id) { + if (redirect && result?.id) { router.push(KnownPages.ProcessRun(processId, result.id)); } }; diff --git a/web/apps/doprocess.app/components/processes/ProcessRunCreateModal.tsx b/web/apps/doprocess.app/components/processes/processes/ProcessRunCreateModal.tsx similarity index 80% rename from web/apps/doprocess.app/components/processes/ProcessRunCreateModal.tsx rename to web/apps/doprocess.app/components/processes/processes/ProcessRunCreateModal.tsx index 95fedb3185..f09ccf1b2c 100644 --- a/web/apps/doprocess.app/components/processes/ProcessRunCreateModal.tsx +++ b/web/apps/doprocess.app/components/processes/processes/ProcessRunCreateModal.tsx @@ -7,14 +7,13 @@ import { Stack } from '@signalco/ui/dist/Stack'; import { Row } from '@signalco/ui/dist/Row'; import { Modal } from '@signalco/ui/dist/Modal'; import { IconButton } from '@signalco/ui/dist/IconButton'; -import { ProcessDto } from '../../app/api/dtos/dtos'; import { ProcessRunCreateForm } from './ProcessRunCreateForm'; type ProcessRunCreateModalProps = { - process: ProcessDto; + processId: string; }; -export function ProcessRunCreateModal({ process }: ProcessRunCreateModalProps) { +export function ProcessRunCreateModal({ processId }: ProcessRunCreateModalProps) { return ( @@ -26,7 +25,7 @@ export function ProcessRunCreateModal({ process }: ProcessRunCreateModalProps) { Run process - + ); diff --git a/web/apps/doprocess.app/components/processes/ProcessesList.tsx b/web/apps/doprocess.app/components/processes/processes/ProcessesList.tsx similarity index 72% rename from web/apps/doprocess.app/components/processes/ProcessesList.tsx rename to web/apps/doprocess.app/components/processes/processes/ProcessesList.tsx index cf5641727f..2b50e23a54 100644 --- a/web/apps/doprocess.app/components/processes/ProcessesList.tsx +++ b/web/apps/doprocess.app/components/processes/processes/ProcessesList.tsx @@ -1,7 +1,7 @@ 'use client'; -import { List } from '../shared/List'; -import { useProcesses } from '../../src/hooks/useProcesses'; +import { List } from '../../shared/List'; +import { useProcesses } from '../../../src/hooks/useProcesses'; import { ProcessesListItem } from './ProcessesListItem'; import { ProcessCreateForm } from './ProcessCreateForm'; @@ -11,7 +11,7 @@ export function ProcessesList() { query={useProcesses} itemRender={(item) => ()} editable - itemCreateLabel="Create new process" + itemCreateLabel="New process" createForm={} /> ); } diff --git a/web/apps/doprocess.app/components/processes/ProcessesListItem.tsx b/web/apps/doprocess.app/components/processes/processes/ProcessesListItem.tsx similarity index 75% rename from web/apps/doprocess.app/components/processes/ProcessesListItem.tsx rename to web/apps/doprocess.app/components/processes/processes/ProcessesListItem.tsx index 2715aaa301..eac4b8b305 100644 --- a/web/apps/doprocess.app/components/processes/ProcessesListItem.tsx +++ b/web/apps/doprocess.app/components/processes/processes/ProcessesListItem.tsx @@ -1,7 +1,7 @@ import { ListChecks, Navigate } from '@signalco/ui-icons'; -import { ListItem } from '../shared/ListItem'; -import { KnownPages } from '../../src/knownPages'; -import { ProcessDto } from '../../app/api/dtos/dtos'; +import { ListItem } from '../../shared/ListItem'; +import { KnownPages } from '../../../src/knownPages'; +import { ProcessDto } from '../../../app/api/dtos/dtos'; export type ProcessListItemProps = { process: ProcessDto; diff --git a/web/apps/doprocess.app/components/processes/ProcessesListView.tsx b/web/apps/doprocess.app/components/processes/processes/ProcessesListView.tsx similarity index 85% rename from web/apps/doprocess.app/components/processes/ProcessesListView.tsx rename to web/apps/doprocess.app/components/processes/processes/ProcessesListView.tsx index 8b79519865..afd96be588 100644 --- a/web/apps/doprocess.app/components/processes/ProcessesListView.tsx +++ b/web/apps/doprocess.app/components/processes/processes/ProcessesListView.tsx @@ -1,5 +1,5 @@ import { Stack } from '@signalco/ui/dist/Stack'; -import { ListHeader } from '../shared/ListHeader'; +import { ListHeader } from '../../shared/ListHeader'; import { ProcessesList } from './ProcessesList'; export function ProcessesListView() { diff --git a/web/apps/doprocess.app/components/processes/processes/RunsList.tsx b/web/apps/doprocess.app/components/processes/processes/RunsList.tsx new file mode 100644 index 0000000000..4b361988b5 --- /dev/null +++ b/web/apps/doprocess.app/components/processes/processes/RunsList.tsx @@ -0,0 +1,41 @@ +'use client'; + +import { Play } from '@signalco/ui-icons'; +import { Typography } from '@signalco/ui/dist/Typography'; +import { Stack } from '@signalco/ui/dist/Stack'; +import { NavigatingButton } from '@signalco/ui/dist/NavigatingButton'; +import { List } from '../../shared/List'; +import { KnownPages } from '../../../src/knownPages'; +import { useProcessRuns } from '../../../src/hooks/useProcessRuns'; +import { useProcessesRuns } from '../../../src/hooks/useProcessesRuns'; +import { RunsListItem } from './RunsListItem'; +import { ProcessRunCreateForm } from './ProcessRunCreateForm'; + +function RunsListEmptyPlaceholder() { + return ( + + + + No runs + You do not have any process runs yet. You can start by creating a process. + + Processes + + ); +} + +export function RunsList({ processId }: { processId?: string }) { + const processRuns = useProcessRuns(processId); + const processesRuns = useProcessesRuns(!processId); + + return ( + processId ? processRuns : processesRuns} + itemRender={(item) => ()} + editable={Boolean(processId)} + itemCreateLabel="New process run" + createForm={processId ? : undefined} + emptyPlaceholder={} + /> + ); +} diff --git a/web/apps/doprocess.app/components/processes/RunsListItem.tsx b/web/apps/doprocess.app/components/processes/processes/RunsListItem.tsx similarity index 84% rename from web/apps/doprocess.app/components/processes/RunsListItem.tsx rename to web/apps/doprocess.app/components/processes/processes/RunsListItem.tsx index 385b3fd2f3..3d3d609048 100644 --- a/web/apps/doprocess.app/components/processes/RunsListItem.tsx +++ b/web/apps/doprocess.app/components/processes/processes/RunsListItem.tsx @@ -1,8 +1,8 @@ import { ListChecks, Navigate, Play } from '@signalco/ui-icons'; import { Row } from '@signalco/ui/dist/Row'; -import { ListItem } from '../shared/ListItem'; -import { KnownPages } from '../../src/knownPages'; -import { ProcessRunDto } from '../../app/api/dtos/dtos'; +import { ListItem } from '../../shared/ListItem'; +import { KnownPages } from '../../../src/knownPages'; +import { ProcessRunDto } from '../../../app/api/dtos/dtos'; import { TypographyProcessName } from './TypographyProcessName'; export type RunsListItemProps = { diff --git a/web/apps/doprocess.app/components/processes/RunsListView.tsx b/web/apps/doprocess.app/components/processes/processes/RunsListView.tsx similarity index 94% rename from web/apps/doprocess.app/components/processes/RunsListView.tsx rename to web/apps/doprocess.app/components/processes/processes/RunsListView.tsx index ff496ecb9e..c31114d255 100644 --- a/web/apps/doprocess.app/components/processes/RunsListView.tsx +++ b/web/apps/doprocess.app/components/processes/processes/RunsListView.tsx @@ -3,7 +3,7 @@ import { Typography } from '@signalco/ui/dist/Typography'; import { Stack } from '@signalco/ui/dist/Stack'; import { useSearchParam } from '@signalco/hooks/dist/useSearchParam'; -import { ListHeader } from '../shared/ListHeader'; +import { ListHeader } from '../../shared/ListHeader'; import { TypographyProcessName } from './TypographyProcessName'; import { RunsList } from './RunsList'; diff --git a/web/apps/doprocess.app/components/processes/TypographyProcessName.tsx b/web/apps/doprocess.app/components/processes/processes/TypographyProcessName.tsx similarity index 92% rename from web/apps/doprocess.app/components/processes/TypographyProcessName.tsx rename to web/apps/doprocess.app/components/processes/processes/TypographyProcessName.tsx index 1bdfe1cd7d..f77f909f79 100644 --- a/web/apps/doprocess.app/components/processes/TypographyProcessName.tsx +++ b/web/apps/doprocess.app/components/processes/processes/TypographyProcessName.tsx @@ -3,8 +3,8 @@ import { TypographyEditable, TypographyEditableProps } from '@signalco/ui/dist/TypographyEditable'; import { Typography } from '@signalco/ui/dist/Typography'; import { Loadable } from '@signalco/ui/dist/Loadable'; -import { useProcessUpdate } from '../../src/hooks/useProcessUpdate'; -import { useProcess } from '../../src/hooks/useProcess'; +import { useProcessUpdate } from '../../../src/hooks/useProcessUpdate'; +import { useProcess } from '../../../src/hooks/useProcess'; export type TypographyProcessNameProps = Omit & { id: string | undefined; diff --git a/web/apps/doprocess.app/components/processes/TypographyProcessRunName.tsx b/web/apps/doprocess.app/components/processes/processes/TypographyProcessRunName.tsx similarity index 92% rename from web/apps/doprocess.app/components/processes/TypographyProcessRunName.tsx rename to web/apps/doprocess.app/components/processes/processes/TypographyProcessRunName.tsx index edb9ee25cb..2ff69f8a0b 100644 --- a/web/apps/doprocess.app/components/processes/TypographyProcessRunName.tsx +++ b/web/apps/doprocess.app/components/processes/processes/TypographyProcessRunName.tsx @@ -3,8 +3,8 @@ import { TypographyEditable, TypographyEditableProps } from '@signalco/ui/dist/TypographyEditable'; import { Typography } from '@signalco/ui/dist/Typography'; import { Loadable } from '@signalco/ui/dist/Loadable'; -import { useProcessRunUpdate } from '../../src/hooks/useProcessRunUpdate'; -import { useProcessRun } from '../../src/hooks/useProcessRun'; +import { useProcessRunUpdate } from '../../../src/hooks/useProcessRunUpdate'; +import { useProcessRun } from '../../../src/hooks/useProcessRun'; export type TypographyProcessRunNameProps = Omit & { id: string | undefined; diff --git a/web/apps/doprocess.app/components/processes/tasks/TaskList.tsx b/web/apps/doprocess.app/components/processes/tasks/TaskList.tsx index 25fb726f9a..a36341daf2 100644 --- a/web/apps/doprocess.app/components/processes/tasks/TaskList.tsx +++ b/web/apps/doprocess.app/components/processes/tasks/TaskList.tsx @@ -4,9 +4,14 @@ import { useMemo } from 'react'; import { NoDataPlaceholder } from '@signalco/ui/dist/NoDataPlaceholder'; import { Loadable } from '@signalco/ui/dist/Loadable'; import { List } from '@signalco/ui/dist/List'; +import { lexinsert } from '@signalco/lexorder'; +import { orderBy } from '@signalco/js'; import { useSearchParam } from '@signalco/hooks/dist/useSearchParam'; +import { SortableContext, arrayMove, verticalListSortingStrategy } from '@dnd-kit/sortable'; +import { DndContext, DragEndEvent } from '@dnd-kit/core'; import { ListSkeleton } from '../../shared/ListSkeleton'; import { ListItemCreate } from '../../shared/ListItemCreate'; +import { useProcessTaskDefinitionUpdate } from '../../../src/hooks/useProcessTaskDefinitionUpdate'; import { useProcessTaskDefinitions } from '../../../src/hooks/useProcessTaskDefinitions'; import { useProcessTaskDefinitionCreate } from '../../../src/hooks/useProcessTaskDefinitionCreate'; import { useProcessRunTasks } from '../../../src/hooks/useProcessRunTasks'; @@ -21,16 +26,17 @@ type TaskListProps = { export function TaskList({ processId, runId, editable }: TaskListProps) { const [selectedTaskId, setSelectedTask] = useSearchParam('task'); const taskDefinitionCreate = useProcessTaskDefinitionCreate(); + const taskDefinitionUpdate = useProcessTaskDefinitionUpdate(); const { data: taskDefinitions, isLoading: isLoadingTaskDefinitions, error: errorTaskDefinitions } = useProcessTaskDefinitions(processId); const { data: tasks, isLoading: isLoadingTasks, error: errorTasks } = useProcessRunTasks(processId, runId); - const taskListItems = useMemo(() => - taskDefinitions?.map(td => ({ + const taskListItems = useMemo(() => { + return orderBy(taskDefinitions?.map(td => ({ taskDefinition: td, task: tasks?.find(t => t.taskDefinitionId === td.id) - })) ?? [], - [taskDefinitions, tasks]); + })) ?? [], (a, b) => a.taskDefinition.order.localeCompare(b.taskDefinition.order)); + }, [taskDefinitions, tasks]); const handleCreateTaskDefinition = async () => { const result = await taskDefinitionCreate.mutateAsync({ @@ -42,33 +48,74 @@ export function TaskList({ processId, runId, editable }: TaskListProps) { } }; + const orderedItems = useMemo(() => { + return taskListItems.map(tdi => tdi.taskDefinition.id.toString()); + }, [taskListItems]); + + const handleDragEnd = async ({ active, over }: DragEndEvent) => { + if (!over) return; + + const overIndex = orderedItems.indexOf(over.id.toString()); + const activeIndex = orderedItems.indexOf(active.id.toString()); + + const reorderedArray = arrayMove(orderedItems, activeIndex, overIndex); + + console.log('reorderedArray', reorderedArray); + + const newLocationIdex = reorderedArray.indexOf(active.id.toString()); + const beforeId = reorderedArray[newLocationIdex - 1]; + const afterId = reorderedArray[newLocationIdex + 1]; + + // Determine previous and next task definition + const activeTaskDefinition = taskListItems.find(tdi => tdi.taskDefinition.id === active.id); + if (!activeTaskDefinition) return; + + const beforeTaskDefinition = taskListItems.find(tdi => tdi.taskDefinition.id === beforeId); + const afterTaskDefinition = taskListItems.find(tdi => tdi.taskDefinition.id === afterId); + + console.log('lexinsert', beforeTaskDefinition?.taskDefinition?.order, afterTaskDefinition?.taskDefinition?.order) + const newOrder = lexinsert(beforeTaskDefinition?.taskDefinition?.order, afterTaskDefinition?.taskDefinition?.order); + + console.log('newOrder', newOrder); + + await taskDefinitionUpdate.mutateAsync({ + processId, + taskDefinitionId: activeTaskDefinition.taskDefinition.id, + order: newOrder + }); + }; + return ( } error={errorTaskDefinitions || errorTasks}> - - {taskListItems.map((item, taskIndex) => ( - - ))} - {editable && ( - - )} - {!editable && taskListItems.length <= 0 && ( - No tasks - )} - + + + + {taskListItems.map((item, taskIndex) => ( + + ))} + {editable && ( + + )} + {!editable && taskListItems.length <= 0 && ( + No tasks + )} + + + ); } diff --git a/web/apps/doprocess.app/components/processes/tasks/TaskListItem.tsx b/web/apps/doprocess.app/components/processes/tasks/TaskListItem.tsx index f0bbbd1a11..a9ea6e7e1c 100644 --- a/web/apps/doprocess.app/components/processes/tasks/TaskListItem.tsx +++ b/web/apps/doprocess.app/components/processes/tasks/TaskListItem.tsx @@ -1,16 +1,18 @@ 'use client'; import { cx } from 'classix'; -import { Delete } from '@signalco/ui-icons'; +import { Delete, Drag } from '@signalco/ui-icons'; import { TypographyEditable } from '@signalco/ui/dist/TypographyEditable'; import { Typography } from '@signalco/ui/dist/Typography'; import { Row } from '@signalco/ui/dist/Row'; import { IconButton } from '@signalco/ui/dist/IconButton'; import { Checkbox } from '@signalco/ui/dist/Checkbox'; import { useSearchParam } from '@signalco/hooks/dist/useSearchParam'; +import { CSS } from '@dnd-kit/utilities'; +import { useSortable } from '@dnd-kit/sortable'; import { ListItem } from '../../shared/ListItem'; import { useProcessTaskDefinitionUpdate } from '../../../src/hooks/useProcessTaskDefinitionUpdate'; -import { useProcessRunTaskCreate } from '../../../src/hooks/useProcessRunTaskCreate'; +import { useProcessRunTaskUpsert } from '../../../src/hooks/useProcessRunTaskUpsert'; import { ProcessRunTaskDto, ProcessTaskDefinitionDto } from '../../../app/api/dtos/dtos'; import { TaskDeleteModal } from './TaskDeleteModal'; @@ -24,8 +26,22 @@ export type TaskListItemProps = { } export function TaskListItem({ selected, taskDefinition, runId, task, taskIndex, editable }: TaskListItemProps) { + const { + attributes, + listeners, + setNodeRef, + setActivatorNodeRef, + transform, + transition + } = useSortable({ id: taskDefinition.id, disabled: !editable || Boolean(runId) }); + + const style = { + transform: CSS.Transform.toString(transform), + transition, + }; + const [, setSelectedTaskId] = useSearchParam('task'); - const taskCreate = useProcessRunTaskCreate(); + const taskCreate = useProcessRunTaskUpsert(); const taskDefinitionUpdate = useProcessTaskDefinitionUpdate(); const handleTextChange = async (text: string) => { @@ -52,51 +68,70 @@ export function TaskListItem({ selected, taskDefinition, runId, task, taskIndex, // TODO: Preload item details on hover (to avoid skeletons) return ( - - - {taskIndex + 1} - {runId - ? - : undefined - } - - )} - nodeId={taskDefinition.id.toString()} - onSelected={setSelectedTaskId} - label={editable ? ( - - {textMutatedOrOriginal} - - ) : ( - {textMutatedOrOriginal ?? 'No description'} - )} - /> - {(!runId && editable) && ( - - - - )} /> + + + {(!runId && editable) && ( + + )} + {taskIndex + 1} + + {runId + ? + : undefined + } + + )} + endDecorator={( + <> + {(!runId && editable) && ( + + + + )} /> + )} + > + )} + nodeId={taskDefinition.id.toString()} + onSelected={setSelectedTaskId} + label={(!runId && editable) ? ( + + {textMutatedOrOriginal} + + ) : ( + {textMutatedOrOriginal ?? 'No description'} )} - + /> ); } diff --git a/web/apps/doprocess.app/components/shared/List.tsx b/web/apps/doprocess.app/components/shared/List.tsx index 4ee2938b64..bdae1a5a4b 100644 --- a/web/apps/doprocess.app/components/shared/List.tsx +++ b/web/apps/doprocess.app/components/shared/List.tsx @@ -19,9 +19,10 @@ type ListProps = { itemCreateLabel?: string; itemRender?: (item: T) => ReactElement; createForm?: ReactNode; + emptyPlaceholder?: ReactNode; }; -export function List({ query, itemRender, editable, itemCreateLabel, createForm }: ListProps) { +export function List({ query, itemRender, editable, itemCreateLabel, createForm, emptyPlaceholder }: ListProps) { const { data, isLoading, error } = query(); const [showCreateModal, setShowCreateModal] = useState(false); @@ -57,10 +58,16 @@ export function List({ query, itemRender, editable, itemCreateLabel, createFo ) : ( <> {!data?.length && ( - + <> + {emptyPlaceholder ? ( + emptyPlaceholder + ) : ( + + )} + > )} > )} diff --git a/web/apps/doprocess.app/components/shared/ListItem.tsx b/web/apps/doprocess.app/components/shared/ListItem.tsx index 68d7f211dd..21e2b5248e 100644 --- a/web/apps/doprocess.app/components/shared/ListItem.tsx +++ b/web/apps/doprocess.app/components/shared/ListItem.tsx @@ -4,7 +4,7 @@ import { ListItem as UiListItem, type ListItemProps } from '@signalco/ui/dist/Li export function ListItem({ className, ...rest }: ListItemProps) { return ( ); } diff --git a/web/apps/doprocess.app/drizzle.config.ts b/web/apps/doprocess.app/drizzle.config.ts index cbad2fb83a..ba9342272e 100644 --- a/web/apps/doprocess.app/drizzle.config.ts +++ b/web/apps/doprocess.app/drizzle.config.ts @@ -10,7 +10,7 @@ export default { out: './src/lib/db/migrations', driver: 'mysql2', dbCredentials: { - connectionString: connectionString, + uri: connectionString, }, breakpoints: true, } satisfies Config diff --git a/web/apps/doprocess.app/package.json b/web/apps/doprocess.app/package.json index 511371f49d..3c5d047099 100644 --- a/web/apps/doprocess.app/package.json +++ b/web/apps/doprocess.app/package.json @@ -22,6 +22,10 @@ "@blocknote/react": "0.9.6", "@clerk/nextjs": "4.27.1", "@clerk/themes": "1.7.9", + "@dnd-kit/core": "6.1.0", + "@dnd-kit/modifiers": "7.0.0", + "@dnd-kit/sortable": "8.0.0", + "@dnd-kit/utilities": "3.2.2", "@enterwell/react-hooks": "0.3.2", "@hcaptcha/react-hcaptcha": "1.9.1", "@next/env": "14.0.3", @@ -54,7 +58,7 @@ "@babel/core": "7.23.3", "@ducanh2912/next-pwa": "9.7.2", "@next/bundle-analyzer": "14.0.3", - "@playwright/test": "1.39.0", + "@playwright/test": "1.40.0", "@signalco/eslint-config-signalco": "workspace:*", "@signalco/tsconfig": "workspace:*", "@total-typescript/ts-reset": "0.5.1", @@ -64,8 +68,8 @@ "@types/react-dom": "18.2.15", "cross-env": "7.0.3", "dotenv": "16.3.1", - "drizzle-kit": "0.20.2", - "eslint": "8.53.0", + "drizzle-kit": "0.20.4", + "eslint": "8.54.0", "next-sitemap": "4.2.3", "postcss": "8.4.31", "rimraf": "5.0.5", diff --git a/web/apps/doprocess.app/src/helpers/queryHelpers.ts b/web/apps/doprocess.app/src/helpers/queryHelpers.ts new file mode 100644 index 0000000000..38ba7ed4f2 --- /dev/null +++ b/web/apps/doprocess.app/src/helpers/queryHelpers.ts @@ -0,0 +1,24 @@ +import { QueryClient, QueryKey } from '@tanstack/react-query'; + +export async function handleOptimisticUpdate(client: QueryClient, key: QueryKey, newItem: T) { + await client.cancelQueries({ queryKey: key }); + const previousItem = client.getQueryData(key); + if (previousItem) { + client.setQueryData(key, (old: T) => ({ ...old, ...newItem })); + } + return previousItem; +} + +export async function handleArrayOptimisticUpdate(client: QueryClient, key: QueryKey, newItem: TNew, itemPredicate: (current: T) => boolean) { + await client.cancelQueries({ queryKey: key }); + const previousItems = client.getQueryData(key); + if (previousItems) { + client.setQueryData(key, (old: T[]) => { + return old.map((item: T) => itemPredicate(item) + ? { ...item, ...newItem } + : item + ); + }); + } + return previousItems; +} diff --git a/web/apps/doprocess.app/src/hooks/useProcess.ts b/web/apps/doprocess.app/src/hooks/useProcess.ts index 7b17caaf27..47e8ec4fdd 100644 --- a/web/apps/doprocess.app/src/hooks/useProcess.ts +++ b/web/apps/doprocess.app/src/hooks/useProcess.ts @@ -2,7 +2,7 @@ import { useQuery } from '@tanstack/react-query'; import { ProcessDto } from '../../app/api/dtos/dtos'; import { processesKey } from './useProcesses'; -export function processKey(id?: string) { +export function processKey(id: string | undefined) { if (id == null) return [...processesKey()]; return [...processesKey(), id]; diff --git a/web/apps/doprocess.app/src/hooks/useProcessDelete.ts b/web/apps/doprocess.app/src/hooks/useProcessDelete.ts index f970e99b1e..6c8fe71c73 100644 --- a/web/apps/doprocess.app/src/hooks/useProcessDelete.ts +++ b/web/apps/doprocess.app/src/hooks/useProcessDelete.ts @@ -2,7 +2,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { processesKey } from './useProcesses'; type ProcessDeleteArgs = { - id: string; + processId: string; } async function fetchDeleteProcessAsync(id: string) { @@ -14,7 +14,7 @@ async function fetchDeleteProcessAsync(id: string) { export function useProcessDelete() { const client = useQueryClient(); return useMutation({ - mutationFn: ({ id }: ProcessDeleteArgs) => fetchDeleteProcessAsync(id), + mutationFn: ({ processId: id }: ProcessDeleteArgs) => fetchDeleteProcessAsync(id), onSuccess: () => { client.invalidateQueries({ queryKey: processesKey() }); } diff --git a/web/apps/doprocess.app/src/hooks/useProcessRun.ts b/web/apps/doprocess.app/src/hooks/useProcessRun.ts index c48634c8c4..34e0093555 100644 --- a/web/apps/doprocess.app/src/hooks/useProcessRun.ts +++ b/web/apps/doprocess.app/src/hooks/useProcessRun.ts @@ -2,7 +2,7 @@ import { useQuery } from '@tanstack/react-query'; import { ProcessRunDto } from '../../app/api/dtos/dtos'; import { processRunsKey } from './useProcessRuns'; -export function processRunKey(processId?: string, runId?: string) { +export function processRunKey(processId: string | undefined, runId: string | undefined) { if (runId == null) return processRunsKey(processId); return [...processRunsKey(processId), runId]; diff --git a/web/apps/doprocess.app/src/hooks/useProcessRunDelete.ts b/web/apps/doprocess.app/src/hooks/useProcessRunDelete.ts new file mode 100644 index 0000000000..cfaf75d24a --- /dev/null +++ b/web/apps/doprocess.app/src/hooks/useProcessRunDelete.ts @@ -0,0 +1,23 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { processRunsKey } from './useProcessRuns'; + +type ProcessRunDeleteArgs = { + processId: string; + runId: string; +} + +async function fetchDeleteProcessAsync(processId: string, runId: string) { + await fetch(`/api/processes/${processId}/runs/${runId}`, { + method: 'DELETE', + }); +} + +export function useProcessRunDelete() { + const client = useQueryClient(); + return useMutation({ + mutationFn: ({ processId, runId }: ProcessRunDeleteArgs) => fetchDeleteProcessAsync(processId, runId), + onSuccess: (_, { processId }) => { + client.invalidateQueries({ queryKey: processRunsKey(processId) }); + } + }); +} diff --git a/web/apps/doprocess.app/src/hooks/useProcessRunTaskCreate.ts b/web/apps/doprocess.app/src/hooks/useProcessRunTaskUpsert.ts similarity index 54% rename from web/apps/doprocess.app/src/hooks/useProcessRunTaskCreate.ts rename to web/apps/doprocess.app/src/hooks/useProcessRunTaskUpsert.ts index 0396a3b81d..5e55916ca3 100644 --- a/web/apps/doprocess.app/src/hooks/useProcessRunTaskCreate.ts +++ b/web/apps/doprocess.app/src/hooks/useProcessRunTaskUpsert.ts @@ -1,5 +1,5 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { ProcessRunTaskDto } from '../../app/api/dtos/dtos'; +import { handleArrayOptimisticUpdate } from '../helpers/queryHelpers'; import { tasksKey } from './useProcessRunTasks'; type TaskCreateArgs = { @@ -16,27 +16,13 @@ async function fetchPostProcessRunTask(processId: string, runId: string, data: o }); } -export function useProcessRunTaskCreate() { +export function useProcessRunTaskUpsert() { const client = useQueryClient(); return useMutation({ mutationFn: ({ processId, runId, ...rest }: TaskCreateArgs) => fetchPostProcessRunTask(processId, runId, { processId, runId, ...rest }), - onMutate: async (newItem) => { - await client.cancelQueries({ queryKey: tasksKey(newItem.processId, newItem.runId) }); - - const previousItems = client.getQueryData(tasksKey(newItem.processId, newItem.runId)); - if (previousItems) { - client.setQueryData(tasksKey(newItem.processId, newItem.runId), (old: ProcessRunTaskDto[]) => { - return old.map((item: ProcessRunTaskDto) => { - if (item.taskDefinitionId === newItem.taskDefinitionId) { - return { ...item, ...newItem }; - } - return item; - }); - }); - } - - return { previousItems }; - }, + onMutate: async (newItem) => ({ + previousItems: await handleArrayOptimisticUpdate(client, tasksKey(newItem.processId, newItem.runId), newItem, (curr: TaskCreateArgs) => curr.taskDefinitionId === newItem.taskDefinitionId) + }), onError: (_, { processId, runId }, context) => { if (context?.previousItems) { client.setQueryData(tasksKey(processId, runId), context.previousItems); diff --git a/web/apps/doprocess.app/src/hooks/useProcessRunUpdate.ts b/web/apps/doprocess.app/src/hooks/useProcessRunUpdate.ts index f5a2fbdcaf..b6857e47cd 100644 --- a/web/apps/doprocess.app/src/hooks/useProcessRunUpdate.ts +++ b/web/apps/doprocess.app/src/hooks/useProcessRunUpdate.ts @@ -19,10 +19,9 @@ export function useProcessRunUpdate() { const client = useQueryClient(); return useMutation({ mutationFn: ({ processId, runId, name }: ProcessRunUpdateArgs) => fetchPutProcessRun(processId, runId, ({ processId, runId, name })), - onSettled: (_, __, { processId, runId }) => { client.invalidateQueries({ queryKey: processRunKey(processId, runId) }); - client.invalidateQueries({ queryKey: processRunsKey() }); + client.invalidateQueries({ queryKey: processRunsKey(processId) }); } }); } diff --git a/web/apps/doprocess.app/src/hooks/useProcessRuns.ts b/web/apps/doprocess.app/src/hooks/useProcessRuns.ts index 9ecc6670a1..25943022b8 100644 --- a/web/apps/doprocess.app/src/hooks/useProcessRuns.ts +++ b/web/apps/doprocess.app/src/hooks/useProcessRuns.ts @@ -2,7 +2,7 @@ import { useQuery } from '@tanstack/react-query'; import { ProcessRunDto } from '../../app/api/dtos/dtos'; import { processKey } from './useProcess'; -export function processRunsKey(processId?: string) { +export function processRunsKey(processId: string | undefined) { return [...processKey(processId), 'runs']; } diff --git a/web/apps/doprocess.app/src/hooks/useProcessTaskDefinitionUpdate.ts b/web/apps/doprocess.app/src/hooks/useProcessTaskDefinitionUpdate.ts index 1583a202da..278fba011c 100644 --- a/web/apps/doprocess.app/src/hooks/useProcessTaskDefinitionUpdate.ts +++ b/web/apps/doprocess.app/src/hooks/useProcessTaskDefinitionUpdate.ts @@ -1,4 +1,5 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { handleArrayOptimisticUpdate, handleOptimisticUpdate } from '../helpers/queryHelpers'; import { ProcessTaskDefinitionDto } from '../../app/api/dtos/dtos'; import { processTaskDefinitionsKey } from './useProcessTaskDefinitions'; import { processTaskDefinitionKey } from './useProcessTaskDefinition'; @@ -9,6 +10,7 @@ type TaskDefinitionUpdateArgs = { text?: string; type?: string; typeData?: string; + order?: string; }; async function fetchPutProcessTaskDefinition(processId: string, taskDefinitionId: string, data: object) { @@ -26,30 +28,10 @@ export function useProcessTaskDefinitionUpdate() { taskDefinitionId, ...rest }), - onMutate: async (newItem) => { - await client.cancelQueries({ queryKey: processTaskDefinitionsKey(newItem.processId) }); - - const previousItem = client.getQueryData(processTaskDefinitionKey(newItem.processId, newItem.taskDefinitionId)); - if (previousItem) { - client.setQueryData(processTaskDefinitionKey(newItem.processId, newItem.taskDefinitionId), (old: ProcessTaskDefinitionDto) => { - return { ...old, ...newItem }; - }); - } - - const previousItems = client.getQueryData(processTaskDefinitionsKey(newItem.processId)); - if (previousItems) { - client.setQueryData(processTaskDefinitionsKey(newItem.processId), (old: ProcessTaskDefinitionDto[]) => { - return old.map((item: ProcessTaskDefinitionDto) => { - if (item.id === newItem.taskDefinitionId) { - return { ...item, ...newItem }; - } - return item; - }); - }); - } - - return { previousItems, previousItem }; - }, + onMutate: async (newItem) => ({ + previousItems: await handleArrayOptimisticUpdate(client, processTaskDefinitionsKey(newItem.processId), newItem, (curr) => curr.id === newItem.taskDefinitionId), + previousItem: await handleOptimisticUpdate(client, processTaskDefinitionKey(newItem.processId, newItem.taskDefinitionId), newItem) + }), onError: (_, { processId, taskDefinitionId }, context) => { if (context?.previousItems) { client.setQueryData(processTaskDefinitionsKey(processId), context.previousItems); diff --git a/web/apps/doprocess.app/src/hooks/useProcessTaskDefinitions.ts b/web/apps/doprocess.app/src/hooks/useProcessTaskDefinitions.ts index 35eb4bf2f1..447bbc207f 100644 --- a/web/apps/doprocess.app/src/hooks/useProcessTaskDefinitions.ts +++ b/web/apps/doprocess.app/src/hooks/useProcessTaskDefinitions.ts @@ -22,5 +22,5 @@ export function useProcessTaskDefinitions(processId?: string) { return await fetchGetProcess(processId); }, enabled: processId != null, - }) + }); } diff --git a/web/apps/doprocess.app/src/lib/db/schema.ts b/web/apps/doprocess.app/src/lib/db/schema.ts index 05fc660b1a..2a795b94e6 100644 --- a/web/apps/doprocess.app/src/lib/db/schema.ts +++ b/web/apps/doprocess.app/src/lib/db/schema.ts @@ -1,16 +1,18 @@ -import { datetime, int, json, mysqlTable, serial, text, varchar } from 'drizzle-orm/mysql-core'; +import { datetime, index, int, json, mysqlTable, serial, text, uniqueIndex, varchar } from 'drizzle-orm/mysql-core'; import { relations, sql } from 'drizzle-orm'; export const process = mysqlTable('process', { id: serial('id').primaryKey(), publicId: varchar('public_id', { length: 32 }).notNull().unique(), name: varchar('name', { length: 255 }).notNull(), - sharedWithUsers: json('shared_with_users').notNull(), + sharedWithUsers: json('shared_with_users').$type().notNull(), createdBy: varchar('created_by', { length: 255 }).notNull(), createdAt: datetime('created_at', { mode: 'date' }).notNull().default(sql`current_timestamp`), updatedBy: varchar('updated_by', { length: 255 }), updatedAt: datetime('updated_at', { mode: 'date' }), -}); +}, (table) => ({ + publicIdIdx: uniqueIndex('public_id_idx').on(table.publicId) +})); export type Process = typeof process.$inferSelect; @@ -24,7 +26,10 @@ export const processRun = mysqlTable('process_run', { createdAt: datetime('created_at', { mode: 'date' }).notNull().default(sql`current_timestamp`), updatedBy: varchar('updated_by', { length: 255 }), updatedAt: datetime('updated_at', { mode: 'date' }), -}); +}, (table) => ({ + processIdIdx: index('process_id_idx').on(table.processId), + publicIdIdx: index('public_id_idx').on(table.publicId), +})); export type ProcessRun = typeof processRun.$inferSelect; @@ -40,7 +45,10 @@ export const taskDefinition = mysqlTable('task_definition', { createdAt: datetime('created_at', { mode: 'date' }).notNull().default(sql`current_timestamp`), updatedBy: varchar('updated_by', { length: 255 }), updatedAt: datetime('updated_at', { mode: 'date' }), -}); +}, (table) => ({ + processIdIdx: index('process_id_idx').on(table.processId), + publicIdIdx: index('public_id_idx').on(table.publicId), +})); export type TaskDefinition = typeof taskDefinition.$inferSelect; @@ -49,12 +57,14 @@ export const document = mysqlTable('document', { publicId: varchar('public_id', { length: 32 }).notNull().unique(), name: text('name').notNull(), data: json('data'), - sharedWithUsers: json('shared_with_users').notNull(), + sharedWithUsers: json('shared_with_users').$type().notNull(), createdBy: varchar('created_by', { length: 255 }).notNull(), createdAt: datetime('created_at', { mode: 'date' }).notNull().default(sql`current_timestamp`), updatedBy: varchar('updated_by', { length: 255 }), updatedAt: datetime('updated_at', { mode: 'date' }), -}); +}, (table) => ({ + publicIdIdx: uniqueIndex('public_id_idx').on(table.publicId), +})); export type Document = typeof document.$inferSelect; @@ -80,7 +90,12 @@ export const task = mysqlTable('task', { createdAt: datetime('created_at', { mode: 'date' }).notNull().default(sql`current_timestamp`), updatedBy: varchar('changed_by', { length: 255 }), updatedAt: datetime('changed_at', { mode: 'date' }) -}); +}, (table) => ({ + processIdIdx: index('process_id_idx').on(table.processId), + runIdIdx: index('run_id_idx').on(table.runId), + taskDefinitionIdIdx: index('task_definition_id_idx').on(table.taskDefinitionId), + publicIdIdx: index('public_id_idx').on(table.publicId), +})); export type TaskState = 'new' | 'completed'; diff --git a/web/apps/doprocess.app/src/lib/repo/processesRepository.ts b/web/apps/doprocess.app/src/lib/repo/processesRepository.ts index 04a03a47cf..5b14e00012 100644 --- a/web/apps/doprocess.app/src/lib/repo/processesRepository.ts +++ b/web/apps/doprocess.app/src/lib/repo/processesRepository.ts @@ -118,6 +118,14 @@ export async function runProcess(userId: string, processId: number, name: string })).insertId; } +export async function renameProcessRun(userId: string, processId: number, runId: number, name: string) { + if (!await isProcessSharedWithUser(userId, processId)) + throw new Error('Not found'); + // TODO: Check permissions + + await db.update(processRun).set({ name, updatedBy: userId, updatedAt: new Date() }).where(and(eq(processRun.processId, processId), eq(processRun.id, runId))); +} + export async function deleteProcessRun(userId: string, processId: number, runId: number) { if (!await isProcessSharedWithUser(userId, processId)) throw new Error('Not found'); @@ -181,6 +189,13 @@ export async function changeTaskDefinitionType(userId: string, processId: number await db.update(taskDefinition).set({ type, typeData, updatedBy: userId, updatedAt: new Date() }).where(and(eq(taskDefinition.processId, processId), eq(taskDefinition.id, id))); } +export async function changeTaskDefinitionOrder(userId: string, processId: number, id: number, order: string) { + if (!await isProcessSharedWithUser(userId, processId)) + throw new Error('Not found'); + // TODO: Check permissions + await db.update(taskDefinition).set({ order, updatedBy: userId, updatedAt: new Date() }).where(and(eq(taskDefinition.processId, processId), eq(taskDefinition.id, id))); +} + export async function deleteTaskDefinition(userId: string, processId: number, id: number) { if (!await isProcessSharedWithUser(userId, processId)) throw new Error('Not found'); diff --git a/web/apps/slco/package.json b/web/apps/slco/package.json index fbd310d0f6..2464b6b821 100644 --- a/web/apps/slco/package.json +++ b/web/apps/slco/package.json @@ -38,7 +38,7 @@ "@axe-core/playwright": "4.8.1", "@babel/core": "7.23.3", "@next/bundle-analyzer": "14.0.3", - "@playwright/test": "1.39.0", + "@playwright/test": "1.40.0", "@signalco/eslint-config-signalco": "workspace:*", "@signalco/tsconfig": "workspace:*", "@total-typescript/ts-reset": "0.5.1", @@ -47,7 +47,7 @@ "@types/react": "18.2.37", "@types/react-dom": "18.2.15", "cross-env": "7.0.3", - "eslint": "8.53.0", + "eslint": "8.54.0", "next-sitemap": "4.2.3", "postcss": "8.4.31", "rimraf": "5.0.5", diff --git a/web/apps/web/package.json b/web/apps/web/package.json index 336900557a..ec1b24d421 100644 --- a/web/apps/web/package.json +++ b/web/apps/web/package.json @@ -50,7 +50,7 @@ "@babel/core": "7.23.3", "@ducanh2912/next-pwa": "9.7.2", "@next/bundle-analyzer": "14.0.3", - "@playwright/test": "1.39.0", + "@playwright/test": "1.40.0", "@signalco/eslint-config-signalco": "workspace:*", "@signalco/tsconfig": "workspace:*", "@total-typescript/ts-reset": "0.5.1", @@ -63,7 +63,7 @@ "babel-loader": "9.1.3", "colorette": "2.0.20", "cross-env": "7.0.3", - "eslint": "8.53.0", + "eslint": "8.54.0", "next-sitemap": "4.2.3", "openapi-types": "12.1.3", "postcss": "8.4.31", diff --git a/web/packages/data/package.json b/web/packages/data/package.json index 6b0ada397c..fbd5e6f3c3 100644 --- a/web/packages/data/package.json +++ b/web/packages/data/package.json @@ -22,7 +22,7 @@ "devDependencies": { "@signalco/tsconfig": "workspace:*", "rimraf": "5.0.5", - "tsup": "7.2.0", + "tsup": "7.3.0", "typescript": "5.2.2" } } diff --git a/web/packages/eslint-config-signalco/package.json b/web/packages/eslint-config-signalco/package.json index e523b1a61e..1eca7a3559 100644 --- a/web/packages/eslint-config-signalco/package.json +++ b/web/packages/eslint-config-signalco/package.json @@ -7,7 +7,7 @@ "dependencies": { "@typescript-eslint/eslint-plugin": "6.11.0", "@typescript-eslint/parser": "6.11.0", - "eslint": "8.53.0", + "eslint": "8.54.0", "eslint-config-next": "14.0.3", "eslint-config-turbo": "1.10.16", "eslint-import-resolver-typescript": "3.6.1", diff --git a/web/packages/hooks/package.json b/web/packages/hooks/package.json index 56366db1e2..a2f79d8a31 100644 --- a/web/packages/hooks/package.json +++ b/web/packages/hooks/package.json @@ -27,7 +27,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "rimraf": "5.0.5", - "tsup": "7.2.0", + "tsup": "7.3.0", "typescript": "5.2.2" }, "peerDependencies": { diff --git a/web/packages/js/package.json b/web/packages/js/package.json index 49066b1a29..850a578124 100644 --- a/web/packages/js/package.json +++ b/web/packages/js/package.json @@ -24,7 +24,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "rimraf": "5.0.5", - "tsup": "7.2.0", + "tsup": "7.3.0", "typescript": "5.2.2" }, "peerDependencies": { diff --git a/web/packages/lexorder/package.json b/web/packages/lexorder/package.json index 6b3e618023..31cf3c05a3 100644 --- a/web/packages/lexorder/package.json +++ b/web/packages/lexorder/package.json @@ -21,7 +21,7 @@ "devDependencies": { "@signalco/tsconfig": "workspace:*", "rimraf": "5.0.5", - "tsup": "7.2.0", + "tsup": "7.3.0", "typescript": "5.2.2" } } \ No newline at end of file diff --git a/web/packages/ui-icons/package.json b/web/packages/ui-icons/package.json index de638fecf0..b2b62a5a65 100644 --- a/web/packages/ui-icons/package.json +++ b/web/packages/ui-icons/package.json @@ -25,7 +25,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "rimraf": "5.0.5", - "tsup": "7.2.0", + "tsup": "7.3.0", "typescript": "5.2.2" }, "peerDependencies": { diff --git a/web/packages/ui-icons/src/lucide/index.ts b/web/packages/ui-icons/src/lucide/index.ts index 00c89e5299..043d49a459 100644 --- a/web/packages/ui-icons/src/lucide/index.ts +++ b/web/packages/ui-icons/src/lucide/index.ts @@ -32,6 +32,7 @@ export { LogOut, Shield, History, + GripVertical as Drag, Bug, Zap as Lightning, Share2 as Share, diff --git a/web/packages/ui/package.json b/web/packages/ui/package.json index ffeb996c05..c22c5e502f 100644 --- a/web/packages/ui/package.json +++ b/web/packages/ui/package.json @@ -32,7 +32,7 @@ "postcss-preset-env": "9.3.0", "rimraf": "5.0.5", "sass": "1.69.5", - "tsup": "7.2.0", + "tsup": "7.3.0", "typescript": "5.2.2" }, "dependencies": { diff --git a/web/packages/ui/src/ListItem/ListItem.tsx b/web/packages/ui/src/ListItem/ListItem.tsx index e2b6745eef..b4a5942462 100644 --- a/web/packages/ui/src/ListItem/ListItem.tsx +++ b/web/packages/ui/src/ListItem/ListItem.tsx @@ -1,4 +1,4 @@ -import { type ReactElement } from 'react'; +import { Ref, type ReactElement } from 'react'; import { cx } from 'classix'; import { Row } from '../Row'; import { Button } from '../Button'; @@ -8,16 +8,22 @@ export type ListItemPropsOptions = { nodeId?: never; selected?: boolean | undefined; onSelected?: never; + divRef?: never; + buttonRef?: Ref; } | { href?: never; nodeId: string; selected?: boolean; onSelected: (nodeId: string) => void; + divRef?: never; + buttonRef?: Ref; } | { href?: never; nodeId?: never; selected?: never; onSelected?: never; + divRef?: Ref; + buttonRef?: never; }; export type ListItemPropsCommon = { @@ -27,11 +33,14 @@ export type ListItemPropsCommon = { endDecorator?: ReactElement; className?: string; title?: string; + style?: React.CSSProperties; }; export type ListItemProps = ListItemPropsCommon & ListItemPropsOptions; export function ListItem({ + divRef, + buttonRef, nodeId, label, startDecorator, @@ -41,7 +50,8 @@ export function ListItem({ disabled, href, className, - title + title, + style }: ListItemProps) { const handleClick = () => { if (onSelected) { @@ -51,7 +61,12 @@ export function ListItem({ if (!href && !nodeId && !onSelected) { return ( - + {typeof startDecorator === 'string' ? {startDecorator} : startDecorator ?? null} {label} <> @@ -63,11 +78,13 @@ export function ListItem({ return ( {typeof startDecorator === 'string' ? {startDecorator} : startDecorator ?? null} {Boolean(label) && {label}} diff --git a/web/packages/ui/src/Row/Row.tsx b/web/packages/ui/src/Row/Row.tsx index f1763510d3..c8d4cf7daa 100644 --- a/web/packages/ui/src/Row/Row.tsx +++ b/web/packages/ui/src/Row/Row.tsx @@ -1,4 +1,4 @@ -import type { HTMLAttributes, CSSProperties } from 'react'; +import { type HTMLAttributes, type CSSProperties, forwardRef } from 'react'; import { cx } from 'classix'; export type RowProps = HTMLAttributes & { @@ -9,9 +9,10 @@ export type RowProps = HTMLAttributes & { style?: CSSProperties | undefined; }; -export function Row({ spacing, alignItems, justifyContent, justifyItems, style, className, ...props }: RowProps) { +const Row = forwardRef(({ spacing, alignItems, justifyContent, justifyItems, style, className, ...props }, ref) => { return ( ) -} +}); +Row.displayName = 'Row'; +export { Row }; diff --git a/web/packages/ui/src/TypographyEditable/TypographyEditable.tsx b/web/packages/ui/src/TypographyEditable/TypographyEditable.tsx index f265d517d1..68513e8cb6 100644 --- a/web/packages/ui/src/TypographyEditable/TypographyEditable.tsx +++ b/web/packages/ui/src/TypographyEditable/TypographyEditable.tsx @@ -60,7 +60,7 @@ export function TypographyEditable({ children, className, onChange, onEditingCha {...rest}> {children || placeholder} {!hideEditIcon && ( - + )} ); diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index c95fcafc23..ef56f9a3c6 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -90,8 +90,8 @@ importers: specifier: 1.1.1 version: 1.1.1 '@vvo/tzdb': - specifier: 6.112.0 - version: 6.112.0 + specifier: 6.113.0 + version: 6.113.0 autoprefixer: specifier: 10.4.16 version: 10.4.16(postcss@8.4.31) @@ -167,7 +167,7 @@ importers: devDependencies: '@axe-core/playwright': specifier: 4.8.1 - version: 4.8.1(playwright-core@1.39.0) + version: 4.8.1(playwright-core@1.40.0) '@ducanh2912/next-pwa': specifier: 9.7.2 version: 9.7.2(next@14.0.3)(webpack@5.89.0) @@ -175,8 +175,8 @@ importers: specifier: 14.0.3 version: 14.0.3 '@playwright/test': - specifier: 1.39.0 - version: 1.39.0 + specifier: 1.40.0 + version: 1.40.0 '@signalco/eslint-config-signalco': specifier: workspace:* version: link:../../packages/eslint-config-signalco @@ -223,8 +223,8 @@ importers: specifier: 7.0.3 version: 7.0.3 eslint: - specifier: 8.53.0 - version: 8.53.0 + specifier: 8.54.0 + version: 8.54.0 fs-extra: specifier: 11.1.1 version: 11.1.1 @@ -333,7 +333,7 @@ importers: devDependencies: '@axe-core/playwright': specifier: 4.8.1 - version: 4.8.1(playwright-core@1.39.0) + version: 4.8.1(playwright-core@1.40.0) '@babel/core': specifier: 7.23.3 version: 7.23.3 @@ -341,8 +341,8 @@ importers: specifier: 14.0.3 version: 14.0.3 '@playwright/test': - specifier: 1.39.0 - version: 1.39.0 + specifier: 1.40.0 + version: 1.40.0 '@signalco/eslint-config-signalco': specifier: workspace:* version: link:../../packages/eslint-config-signalco @@ -377,8 +377,8 @@ importers: specifier: 7.0.3 version: 7.0.3 eslint: - specifier: 8.53.0 - version: 8.53.0 + specifier: 8.54.0 + version: 8.54.0 next-sitemap: specifier: 4.2.3 version: 4.2.3(next@14.0.3) @@ -445,7 +445,7 @@ importers: devDependencies: '@axe-core/playwright': specifier: 4.8.1 - version: 4.8.1(playwright-core@1.39.0) + version: 4.8.1(playwright-core@1.40.0) '@babel/core': specifier: 7.23.3 version: 7.23.3 @@ -453,8 +453,8 @@ importers: specifier: 14.0.3 version: 14.0.3 '@playwright/test': - specifier: 1.39.0 - version: 1.39.0 + specifier: 1.40.0 + version: 1.40.0 '@signalco/eslint-config-signalco': specifier: workspace:* version: link:../../packages/eslint-config-signalco @@ -480,8 +480,8 @@ importers: specifier: 7.0.3 version: 7.0.3 eslint: - specifier: 8.53.0 - version: 8.53.0 + specifier: 8.54.0 + version: 8.54.0 next-sitemap: specifier: 4.2.3 version: 4.2.3(next@14.0.3) @@ -540,6 +540,18 @@ importers: '@clerk/themes': specifier: 1.7.9 version: 1.7.9(react@18.2.0) + '@dnd-kit/core': + specifier: 6.1.0 + version: 6.1.0(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/modifiers': + specifier: 7.0.0 + version: 7.0.0(@dnd-kit/core@6.1.0)(react@18.2.0) + '@dnd-kit/sortable': + specifier: 8.0.0 + version: 8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0) + '@dnd-kit/utilities': + specifier: 3.2.2 + version: 3.2.2(react@18.2.0) '@enterwell/react-hooks': specifier: 0.3.2 version: 0.3.2(react-dom@18.2.0)(react@18.2.0) @@ -621,7 +633,7 @@ importers: devDependencies: '@axe-core/playwright': specifier: 4.8.1 - version: 4.8.1(playwright-core@1.39.0) + version: 4.8.1(playwright-core@1.40.0) '@babel/core': specifier: 7.23.3 version: 7.23.3 @@ -632,8 +644,8 @@ importers: specifier: 14.0.3 version: 14.0.3 '@playwright/test': - specifier: 1.39.0 - version: 1.39.0 + specifier: 1.40.0 + version: 1.40.0 '@signalco/eslint-config-signalco': specifier: workspace:* version: link:../../packages/eslint-config-signalco @@ -662,11 +674,11 @@ importers: specifier: 16.3.1 version: 16.3.1 drizzle-kit: - specifier: 0.20.2 - version: 0.20.2 + specifier: 0.20.4 + version: 0.20.4 eslint: - specifier: 8.53.0 - version: 8.53.0 + specifier: 8.54.0 + version: 8.54.0 next-sitemap: specifier: 4.2.3 version: 4.2.3(next@14.0.3) @@ -736,7 +748,7 @@ importers: devDependencies: '@axe-core/playwright': specifier: 4.8.1 - version: 4.8.1(playwright-core@1.39.0) + version: 4.8.1(playwright-core@1.40.0) '@babel/core': specifier: 7.23.3 version: 7.23.3 @@ -744,8 +756,8 @@ importers: specifier: 14.0.3 version: 14.0.3 '@playwright/test': - specifier: 1.39.0 - version: 1.39.0 + specifier: 1.40.0 + version: 1.40.0 '@signalco/eslint-config-signalco': specifier: workspace:* version: link:../../packages/eslint-config-signalco @@ -771,8 +783,8 @@ importers: specifier: 7.0.3 version: 7.0.3 eslint: - specifier: 8.53.0 - version: 8.53.0 + specifier: 8.54.0 + version: 8.54.0 next-sitemap: specifier: 4.2.3 version: 4.2.3(next@14.0.3) @@ -978,7 +990,7 @@ importers: devDependencies: '@axe-core/playwright': specifier: 4.8.1 - version: 4.8.1(playwright-core@1.39.0) + version: 4.8.1(playwright-core@1.40.0) '@babel/core': specifier: 7.23.3 version: 7.23.3 @@ -989,8 +1001,8 @@ importers: specifier: 14.0.3 version: 14.0.3 '@playwright/test': - specifier: 1.39.0 - version: 1.39.0 + specifier: 1.40.0 + version: 1.40.0 '@signalco/eslint-config-signalco': specifier: workspace:* version: link:../../packages/eslint-config-signalco @@ -1028,8 +1040,8 @@ importers: specifier: 7.0.3 version: 7.0.3 eslint: - specifier: 8.53.0 - version: 8.53.0 + specifier: 8.54.0 + version: 8.54.0 next-sitemap: specifier: 4.2.3 version: 4.2.3(next@14.0.3) @@ -1058,8 +1070,8 @@ importers: specifier: 5.0.5 version: 5.0.5 tsup: - specifier: 7.2.0 - version: 7.2.0(postcss@8.4.31)(typescript@5.2.2) + specifier: 7.3.0 + version: 7.3.0(postcss@8.4.31)(typescript@5.2.2) typescript: specifier: 5.2.2 version: 5.2.2 @@ -1068,28 +1080,28 @@ importers: dependencies: '@typescript-eslint/eslint-plugin': specifier: 6.11.0 - version: 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2) + version: 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0)(typescript@5.2.2) '@typescript-eslint/parser': specifier: 6.11.0 - version: 6.11.0(eslint@8.53.0)(typescript@5.2.2) + version: 6.11.0(eslint@8.54.0)(typescript@5.2.2) eslint: - specifier: 8.53.0 - version: 8.53.0 + specifier: 8.54.0 + version: 8.54.0 eslint-config-next: specifier: 14.0.3 - version: 14.0.3(eslint@8.53.0)(typescript@5.2.2) + version: 14.0.3(eslint@8.54.0)(typescript@5.2.2) eslint-config-turbo: specifier: 1.10.16 - version: 1.10.16(eslint@8.53.0) + version: 1.10.16(eslint@8.54.0) eslint-import-resolver-typescript: specifier: 3.6.1 - version: 3.6.1(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.53.0) + version: 3.6.1(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.54.0) eslint-plugin-import: specifier: 2.29.0 - version: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) + version: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) eslint-plugin-react: specifier: 7.33.2 - version: 7.33.2(eslint@8.53.0) + version: 7.33.2(eslint@8.54.0) eslint-plugin-tailwindcss: specifier: 3.13.0 version: 3.13.0(tailwindcss@3.3.5) @@ -1121,8 +1133,8 @@ importers: specifier: 5.0.5 version: 5.0.5 tsup: - specifier: 7.2.0 - version: 7.2.0(postcss@8.4.31)(typescript@5.2.2) + specifier: 7.3.0 + version: 7.3.0(postcss@8.4.31)(typescript@5.2.2) typescript: specifier: 5.2.2 version: 5.2.2 @@ -1142,8 +1154,8 @@ importers: specifier: 5.0.5 version: 5.0.5 tsup: - specifier: 7.2.0 - version: 7.2.0(postcss@8.4.31)(typescript@5.2.2) + specifier: 7.3.0 + version: 7.3.0(postcss@8.4.31)(typescript@5.2.2) typescript: specifier: 5.2.2 version: 5.2.2 @@ -1157,8 +1169,8 @@ importers: specifier: 5.0.5 version: 5.0.5 tsup: - specifier: 7.2.0 - version: 7.2.0(postcss@8.4.31)(typescript@5.2.2) + specifier: 7.3.0 + version: 7.3.0(postcss@8.4.31)(typescript@5.2.2) typescript: specifier: 5.2.2 version: 5.2.2 @@ -1271,8 +1283,8 @@ importers: specifier: 1.69.5 version: 1.69.5 tsup: - specifier: 7.2.0 - version: 7.2.0(postcss@8.4.31)(typescript@5.2.2) + specifier: 7.3.0 + version: 7.3.0(postcss@8.4.31)(typescript@5.2.2) typescript: specifier: 5.2.2 version: 5.2.2 @@ -1295,8 +1307,8 @@ importers: specifier: 5.0.5 version: 5.0.5 tsup: - specifier: 7.2.0 - version: 7.2.0(postcss@8.4.31)(typescript@5.2.2) + specifier: 7.3.0 + version: 7.3.0(postcss@8.4.31)(typescript@5.2.2) typescript: specifier: 5.2.2 version: 5.2.2 @@ -1352,13 +1364,13 @@ packages: default-browser-id: 3.0.0 dev: true - /@axe-core/playwright@4.8.1(playwright-core@1.39.0): + /@axe-core/playwright@4.8.1(playwright-core@1.40.0): resolution: {integrity: sha512-KC1X++UdRAwMLRvB+BIKFheyLHUnbJTL0t0Wbv6TJMozn2V2QyEtAcN6jyUiudtGiLUGhHCtj/eWorBnVZ4dAA==} peerDependencies: playwright-core: '>= 1.0.0' dependencies: axe-core: 4.8.2 - playwright-core: 1.39.0 + playwright-core: 1.40.0 dev: true /@babel/code-frame@7.22.13: @@ -4217,13 +4229,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.53.0 + eslint: 8.54.0 eslint-visitor-keys: 3.4.3 /@eslint-community/regexpp@4.10.0: @@ -4246,8 +4258,8 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.53.0: - resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /@fal-works/esbuild-plugin-global-externals@2.1.2: @@ -5069,7 +5081,7 @@ packages: resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} engines: {node: '>=8.0.0'} dependencies: - tslib: 2.4.1 + tslib: 2.6.2 dev: false /@peculiar/webcrypto@1.4.1: @@ -5079,7 +5091,7 @@ packages: '@peculiar/asn1-schema': 2.3.8 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.5 - tslib: 2.4.1 + tslib: 2.6.2 webcrypto-core: 1.7.7 dev: false @@ -5095,12 +5107,12 @@ packages: engines: {node: '>=16'} dev: false - /@playwright/test@1.39.0: - resolution: {integrity: sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==} + /@playwright/test@1.40.0: + resolution: {integrity: sha512-PdW+kn4eV99iP5gxWNSDQCbhMaDVej+RXL5xr6t04nbKLCBwYtA046t7ofoczHOm8u6c+45hpDKQVZqtqwkeQg==} engines: {node: '>=16'} hasBin: true dependencies: - playwright: 1.39.0 + playwright: 1.40.0 dev: true /@pmmmwh/react-refresh-webpack-plugin@0.5.11(react-refresh@0.11.0)(webpack@5.89.0): @@ -8505,7 +8517,7 @@ packages: '@types/yargs-parser': 21.0.3 dev: true - /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -8517,13 +8529,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.11.0 - '@typescript-eslint/type-utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.11.0(eslint@8.54.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.11.0(eslint@8.54.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.11.0 debug: 4.3.4 - eslint: 8.53.0 + eslint: 8.54.0 graphemer: 1.4.0 ignore: 5.3.0 natural-compare: 1.4.0 @@ -8534,7 +8546,7 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.11.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -8549,7 +8561,7 @@ packages: '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.11.0 debug: 4.3.4 - eslint: 8.53.0 + eslint: 8.54.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -8563,7 +8575,7 @@ packages: '@typescript-eslint/visitor-keys': 6.11.0 dev: false - /@typescript-eslint/type-utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.11.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -8574,9 +8586,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.11.0(eslint@8.54.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.53.0 + eslint: 8.54.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: @@ -8609,19 +8621,19 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.11.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.5 '@typescript-eslint/scope-manager': 6.11.0 '@typescript-eslint/types': 6.11.0 '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2) - eslint: 8.53.0 + eslint: 8.54.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -8656,8 +8668,8 @@ packages: - '@swc/helpers' dev: true - /@vvo/tzdb@6.112.0: - resolution: {integrity: sha512-N6FQ/bnx11+9PrBKVDmYZQrAZPUc3xriKIHPJj9hKRQ+ioHRosljPeuoC0MixX1U4a2MDimCfK/FVriO8U6DWg==} + /@vvo/tzdb@6.113.0: + resolution: {integrity: sha512-1cf8T5BWJ9oRbk0QN+ilnfAQhYKYEcnWwtTH+A/XGOst76e6Jz5GTvzQLZ5zfHVCD1mde2XzppGqc6N2zy913Q==} dev: false /@webassemblyjs/ast@1.11.6: @@ -9532,13 +9544,13 @@ packages: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} dev: true - /bundle-require@4.0.2(esbuild@0.18.20): + /bundle-require@4.0.2(esbuild@0.19.5): resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' dependencies: - esbuild: 0.18.20 + esbuild: 0.19.5 load-tsconfig: 0.2.5 dev: true @@ -9775,7 +9787,7 @@ packages: webpack: '>=4.0.0 <6.0.0' dependencies: del: 4.1.1 - webpack: 5.89.0 + webpack: 5.89.0(esbuild@0.18.20) dev: true /cli-color@2.0.3: @@ -10847,7 +10859,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.2 /dotenv-expand@10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} @@ -10871,8 +10883,8 @@ packages: wordwrap: 1.0.0 dev: true - /drizzle-kit@0.20.2: - resolution: {integrity: sha512-4iwjsIj2sY3B3MleKeyNzg/6myjXbTE/CBOXwfePoRVXayM3VwHGZboMkxUkmIQk6o7UAKRb2ODDpO24YNoL2g==} + /drizzle-kit@0.20.4: + resolution: {integrity: sha512-pfaryOMS4jtQ6PNIanggsXqZnl34nMeoFd6Mmc9mZA+amSym0izLTuOO3xnivPT2BDsDVOoPhrC47QzKij7fRA==} hasBin: true dependencies: '@drizzle-team/studio': 0.0.27 @@ -11343,7 +11355,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-next@14.0.3(eslint@8.53.0)(typescript@5.2.2): + /eslint-config-next@14.0.3(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-IKPhpLdpSUyKofmsXUfrvBC49JMUTdeaD8ZIH4v9Vk0sC1X6URTuTJCLtA0Vwuj7V/CQh0oISuSTvNn5//Buew==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 @@ -11354,27 +11366,27 @@ packages: dependencies: '@next/eslint-plugin-next': 14.0.3 '@rushstack/eslint-patch': 1.5.1 - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) - eslint: 8.53.0 + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) + eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.53.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.53.0) - eslint-plugin-react: 7.33.2(eslint@8.53.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.53.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.54.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.54.0) + eslint-plugin-react: 7.33.2(eslint@8.54.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.54.0) typescript: 5.2.2 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color dev: false - /eslint-config-turbo@1.10.16(eslint@8.53.0): + /eslint-config-turbo@1.10.16(eslint@8.54.0): resolution: {integrity: sha512-O3NQI72bQHV7FvSC6lWj66EGx8drJJjuT1kuInn6nbMLOHdMBhSUX/8uhTAlHRQdlxZk2j9HtgFCIzSc93w42g==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 8.53.0 - eslint-plugin-turbo: 1.10.16(eslint@8.53.0) + eslint: 8.54.0 + eslint-plugin-turbo: 1.10.16(eslint@8.54.0) dev: false /eslint-import-resolver-node@0.3.9: @@ -11387,7 +11399,7 @@ packages: - supports-color dev: false - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.53.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.54.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -11396,9 +11408,9 @@ packages: dependencies: debug: 4.3.4 enhanced-resolve: 5.15.0 - eslint: 8.53.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) + eslint: 8.54.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) fast-glob: 3.3.2 get-tsconfig: 4.7.2 is-core-module: 2.13.1 @@ -11410,7 +11422,7 @@ packages: - supports-color dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -11431,16 +11443,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.53.0 + eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.53.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.54.0) transitivePeerDependencies: - supports-color dev: false - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0): + /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0): resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: @@ -11450,16 +11462,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.53.0 + eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -11475,7 +11487,7 @@ packages: - supports-color dev: false - /eslint-plugin-jsx-a11y@6.8.0(eslint@8.53.0): + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.54.0): resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} engines: {node: '>=4.0'} peerDependencies: @@ -11491,7 +11503,7 @@ packages: damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 es-iterator-helpers: 1.0.15 - eslint: 8.53.0 + eslint: 8.54.0 hasown: 2.0.0 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -11500,16 +11512,16 @@ packages: object.fromentries: 2.0.7 dev: false - /eslint-plugin-react-hooks@4.6.0(eslint@8.53.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.54.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.53.0 + eslint: 8.54.0 dev: false - /eslint-plugin-react@7.33.2(eslint@8.53.0): + /eslint-plugin-react@7.33.2(eslint@8.54.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: @@ -11520,7 +11532,7 @@ packages: array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 es-iterator-helpers: 1.0.15 - eslint: 8.53.0 + eslint: 8.54.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -11545,13 +11557,13 @@ packages: tailwindcss: 3.3.5 dev: false - /eslint-plugin-turbo@1.10.16(eslint@8.53.0): + /eslint-plugin-turbo@1.10.16(eslint@8.54.0): resolution: {integrity: sha512-ZjrR88MTN64PNGufSEcM0tf+V1xFYVbeiMeuIqr0aiABGomxFLo4DBkQ7WI4WzkZtWQSIA2sP+yxqSboEfL9MQ==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 8.53.0 + eslint: 8.54.0 dev: false /eslint-scope@5.1.1: @@ -11572,15 +11584,15 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint@8.53.0: - resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.3 - '@eslint/js': 8.53.0 + '@eslint/js': 8.54.0 '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -13716,7 +13728,7 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.4.1 + tslib: 2.6.2 /lru-cache@10.0.2: resolution: {integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==} @@ -14987,7 +14999,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.4.1 + tslib: 2.6.2 /node-abi@3.51.0: resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} @@ -15594,18 +15606,18 @@ packages: find-up: 6.3.0 dev: true - /playwright-core@1.39.0: - resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} + /playwright-core@1.40.0: + resolution: {integrity: sha512-fvKewVJpGeca8t0ipM56jkVSU6Eo0RmFvQ/MaCQNDYm+sdvKkMBBWTE1FdeMqIdumRaXXjZChWHvIzCGM/tA/Q==} engines: {node: '>=16'} hasBin: true dev: true - /playwright@1.39.0: - resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==} + /playwright@1.40.0: + resolution: {integrity: sha512-gyHAgQjiDf1m34Xpwzaqb76KgfzYrhK7iih+2IzcOCoZWr/8ZqmdBw+t0RU85ZmfJMgtgAiNtBQ/KS2325INXw==} engines: {node: '>=16'} hasBin: true dependencies: - playwright-core: 1.39.0 + playwright-core: 1.40.0 optionalDependencies: fsevents: 2.3.2 dev: true @@ -17218,14 +17230,6 @@ packages: fsevents: 2.3.3 dev: true - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.3 - dev: true - /rollup@4.4.1: resolution: {integrity: sha512-idZzrUpWSblPJX66i+GzrpjKE3vbYrlWirUHteoAbjKReZwa0cohAErOYA5efoMmNCdvG9yrJS+w9Kl6csaH4w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -17586,7 +17590,7 @@ packages: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: dot-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.2 dev: false /snakecase-keys@3.2.1: @@ -18438,18 +18442,19 @@ packages: /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + dev: false /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsup@7.2.0(postcss@8.4.31)(typescript@5.2.2): - resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} - engines: {node: '>=16.14'} + /tsup@7.3.0(postcss@8.4.31)(typescript@5.2.2): + resolution: {integrity: sha512-Ja1eaSRrE+QarmATlNO5fse2aOACYMBX+IZRKy1T+gpyH+jXgRrl5l4nHIQJQ1DoDgEjHDTw8cpE085UdBZuWQ==} + engines: {node: '>=18'} hasBin: true peerDependencies: '@swc/core': ^1 postcss: ^8.4.12 - typescript: '>=4.1.0' + typescript: '>=4.5.0' peerDependenciesMeta: '@swc/core': optional: true @@ -18458,18 +18463,18 @@ packages: typescript: optional: true dependencies: - bundle-require: 4.0.2(esbuild@0.18.20) + bundle-require: 4.0.2(esbuild@0.19.5) cac: 6.7.14 chokidar: 3.5.3 debug: 4.3.4 - esbuild: 0.18.20 + esbuild: 0.19.5 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 postcss: 8.4.31 postcss-load-config: 4.0.1(postcss@8.4.31) resolve-from: 5.0.0 - rollup: 3.29.4 + rollup: 4.4.1 source-map: 0.8.0-beta.0 sucrase: 3.34.0 tree-kill: 1.2.2 @@ -19188,7 +19193,7 @@ packages: '@peculiar/json-schema': 1.1.12 asn1js: 3.0.5 pvtsutils: 1.3.5 - tslib: 2.4.1 + tslib: 2.6.2 dev: false /webidl-conversions@3.0.1: @@ -19735,7 +19740,7 @@ packages: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.89.0 + webpack: 5.89.0(esbuild@0.18.20) webpack-sources: 1.4.3 workbox-build: 7.0.0 transitivePeerDependencies:
{isRun ? 'Process run' : 'Process'} not found
The {isRun ? 'process run' : 'process'} you are trying to access does not exist.