diff --git a/package-lock.json b/package-lock.json index e7dd10a..44307e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -559,7 +559,6 @@ "node_modules/@babel/runtime": { "version": "7.27.0", "license": "MIT", - "peer": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -8078,36 +8077,30 @@ }, "node_modules/@types/d3-array": { "version": "3.2.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.3", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "license": "MIT", - "peer": true, "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { "version": "3.1.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.9", "license": "MIT", - "peer": true, "dependencies": { "@types/d3-time": "*" } @@ -8115,20 +8108,17 @@ "node_modules/@types/d3-shape": { "version": "3.1.7", "license": "MIT", - "peer": true, "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { "version": "3.0.4", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/debug": { "version": "4.1.12", @@ -9503,26 +9493,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/builtins": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-2.0.1.tgz", - "integrity": "sha512-XkkVe5QAb6guWPXTzpSrYpSlN3nqEmrrE2TkAr/tp7idSF6+MONh9WvKrAuR3HiKLvoSgmbs8l1U9IPmMrIoLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - } - }, - "node_modules/builtins/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -10062,7 +10032,6 @@ "node_modules/clsx": { "version": "2.1.1", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -10485,7 +10454,6 @@ "node_modules/d3-array": { "version": "3.2.4", "license": "ISC", - "peer": true, "dependencies": { "internmap": "1 - 2" }, @@ -10496,7 +10464,6 @@ "node_modules/d3-color": { "version": "3.1.0", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -10504,7 +10471,6 @@ "node_modules/d3-ease": { "version": "3.0.1", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=12" } @@ -10512,7 +10478,6 @@ "node_modules/d3-format": { "version": "3.1.0", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -10520,7 +10485,6 @@ "node_modules/d3-interpolate": { "version": "3.0.1", "license": "ISC", - "peer": true, "dependencies": { "d3-color": "1 - 3" }, @@ -10531,7 +10495,6 @@ "node_modules/d3-path": { "version": "3.1.0", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -10539,7 +10502,6 @@ "node_modules/d3-scale": { "version": "4.0.2", "license": "ISC", - "peer": true, "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -10554,7 +10516,6 @@ "node_modules/d3-shape": { "version": "3.2.0", "license": "ISC", - "peer": true, "dependencies": { "d3-path": "^3.1.0" }, @@ -10565,7 +10526,6 @@ "node_modules/d3-time": { "version": "3.1.0", "license": "ISC", - "peer": true, "dependencies": { "d3-array": "2 - 3" }, @@ -10576,7 +10536,6 @@ "node_modules/d3-time-format": { "version": "4.1.0", "license": "ISC", - "peer": true, "dependencies": { "d3-time": "1 - 3" }, @@ -10587,7 +10546,6 @@ "node_modules/d3-timer": { "version": "3.0.1", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -10649,7 +10607,6 @@ "node_modules/date-fns": { "version": "3.6.0", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -10674,8 +10631,7 @@ }, "node_modules/decimal.js-light": { "version": "2.5.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/decode-bmp": { "version": "0.2.1", @@ -11009,7 +10965,6 @@ "node_modules/dom-helpers": { "version": "5.2.1", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -12170,7 +12125,6 @@ "node_modules/fast-equals": { "version": "5.2.2", "license": "MIT", - "peer": true, "engines": { "node": ">=6.0.0" } @@ -13366,13 +13320,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", @@ -13650,7 +13597,6 @@ "node_modules/internmap": { "version": "2.0.3", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -14359,13 +14305,6 @@ "version": "3.0.1", "license": "MIT" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -14543,46 +14482,6 @@ "dev": true, "license": "MIT" }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/loader-utils": { "version": "3.3.1", "dev": true, @@ -16281,29 +16180,6 @@ "dev": true, "license": "MIT" }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -17995,7 +17871,6 @@ "node_modules/react-day-picker": { "version": "9.0.4", "license": "MIT", - "peer": true, "dependencies": { "date-fns": "^3.6.0" }, @@ -18020,8 +17895,7 @@ }, "node_modules/react-is": { "version": "18.3.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/react-reconciler": { "version": "0.32.0", @@ -18094,7 +17968,6 @@ "node_modules/react-smooth": { "version": "4.0.4", "license": "MIT", - "peer": true, "dependencies": { "fast-equals": "^5.0.1", "prop-types": "^15.8.1", @@ -18129,7 +18002,6 @@ "node_modules/react-transition-group": { "version": "4.4.5", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -18144,7 +18016,6 @@ "node_modules/react-virtualized-auto-sizer": { "version": "1.0.25", "license": "MIT", - "peer": true, "peerDependencies": { "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -18170,44 +18041,6 @@ "node": ">=0.10.0" } }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -18237,7 +18070,6 @@ "node_modules/recharts": { "version": "2.15.1", "license": "MIT", - "peer": true, "dependencies": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", @@ -18259,7 +18091,6 @@ "node_modules/recharts-scale": { "version": "0.4.5", "license": "MIT", - "peer": true, "dependencies": { "decimal.js-light": "^2.4.1" } @@ -18357,8 +18188,7 @@ }, "node_modules/regenerator-runtime": { "version": "0.14.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/regex": { "version": "6.1.0", @@ -18888,33 +18718,14 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-auto-external": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-auto-external/-/rollup-plugin-auto-external-2.0.0.tgz", - "integrity": "sha512-HQM3ZkZYfSam1uoZtAB9sK26EiAsfs1phrkf91c/YX+S07wugyRXSigBxrIwiLr5EPPilKYmoMxsrnlGBsXnuQ==", + "node_modules/rollup-plugin-peer-deps-external": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-peer-deps-external/-/rollup-plugin-peer-deps-external-2.2.4.tgz", + "integrity": "sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==", "dev": true, "license": "MIT", - "dependencies": { - "builtins": "^2.0.0", - "read-pkg": "^3.0.0", - "safe-resolve": "^1.0.0", - "semver": "^5.5.0" - }, - "engines": { - "node": ">=6" - }, "peerDependencies": { - "rollup": ">=0.45.2" - } - }, - "node_modules/rollup-plugin-auto-external/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "rollup": "*" } }, "node_modules/rollup-plugin-postcss": { @@ -19131,13 +18942,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-resolve/-/safe-resolve-1.0.0.tgz", - "integrity": "sha512-aQpRvfxoi1y0UxKEU0tNO327kb0/LMo8Xrk64M2u172UqOOLCCM0khxN2OTClDiTqTJz5864GMD1X92j4YiHTg==", - "dev": true, - "license": "MIT" - }, "node_modules/safe-stable-stringify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", @@ -19717,42 +19521,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -19990,16 +19758,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/strip-final-newline": { "version": "3.0.0", "license": "MIT", @@ -20164,7 +19922,6 @@ "node_modules/tailwind-merge": { "version": "2.3.0", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.24.1" }, @@ -20477,8 +20234,7 @@ }, "node_modules/tiny-invariant": { "version": "1.3.3", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", @@ -21292,17 +21048,6 @@ "uuid": "dist/esm/bin/uuid" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -21392,7 +21137,6 @@ "node_modules/victory-vendor": { "version": "36.9.2", "license": "MIT AND ISC", - "peer": true, "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", @@ -22904,7 +22648,7 @@ }, "packages/subframe-cli": { "name": "@subframe/cli", - "version": "1.198.0", + "version": "1.199.0", "license": "ISC", "dependencies": { "@antfu/ni": "0.21.8", @@ -23032,8 +22776,14 @@ }, "packages/subframe-core": { "name": "@subframe/core", - "version": "1.150.0", + "version": "1.153.0", "license": "ISC", + "dependencies": { + "react-day-picker": "^9.0.4", + "react-virtualized-auto-sizer": "^1.0.25", + "recharts": "^2.15.1", + "tailwind-merge": "^2.3.0" + }, "devDependencies": { "@rollup/plugin-commonjs": "25.0.7", "@rollup/plugin-node-resolve": "15.2.3", @@ -23041,7 +22791,7 @@ "@types/react-dom": "^18", "postcss": "8.4.21", "rollup": "4.2.0", - "rollup-plugin-auto-external": "^2.0.0", + "rollup-plugin-peer-deps-external": "^2.2.4", "rollup-plugin-postcss": "4.0.2", "rollup-plugin-preserve-directives": "0.4.0", "rollup-plugin-typescript2": "0.36.0", @@ -23071,12 +22821,8 @@ "classnames": "^2.5.1", "copy-to-clipboard": "^3.3.3", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-day-picker": "^9.0.4", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-virtualized-auto-sizer": "^1.0.25", - "recharts": "^2.15.1", - "sonner": "^1.7.2", - "tailwind-merge": "^2.3.0" + "sonner": "^1.7.2" } }, "packages/subframe-core/node_modules/@rollup/plugin-node-resolve": { diff --git a/packages/shared/types.ts b/packages/shared/types.ts index 5a29ab6..3c269b5 100644 --- a/packages/shared/types.ts +++ b/packages/shared/types.ts @@ -67,6 +67,7 @@ export interface InitProjectResponse { cssType: CodeGenCSSType oldImportAlias?: string projectInfo: { + teamId: number truncatedProjectId: TruncatedProjectId name: string } @@ -109,6 +110,7 @@ export interface SyncProjectResponse { otherFiles: CodeGenFileValid[] missingComponents: string[] projectInfo: { + teamId: number truncatedProjectId: TruncatedProjectId name: string } diff --git a/packages/subframe-cli/package.json b/packages/subframe-cli/package.json index 08b4089..15b57eb 100644 --- a/packages/subframe-cli/package.json +++ b/packages/subframe-cli/package.json @@ -1,6 +1,6 @@ { "name": "@subframe/cli", - "version": "1.198.0", + "version": "1.199.0", "description": "Subframe's CLI tool for syncing your code with Subframe designs.", "main": "dist/index.js", "module": "dist/index.es.js", diff --git a/packages/subframe-cli/src/access-token.ts b/packages/subframe-cli/src/access-token.ts index 74b56d9..e388694 100644 --- a/packages/subframe-cli/src/access-token.ts +++ b/packages/subframe-cli/src/access-token.ts @@ -3,14 +3,19 @@ import prompt from "prompts" import { CLI_AUTH_ROUTE } from "shared/routes" import { apiVerifyToken } from "./api-endpoints" import { isDev } from "./common" -import { readAuthConfig, writeAuthConfig } from "./config" +import { getToken, storeToken } from "./config" import { CLILogger } from "./logger/logger-cli" import { link } from "./output/format" import { abortOnState } from "./prompt-helpers" const BASE_URL = isDev ? "http://localhost:6501" : "https://app.subframe.com" -export async function verifyTokenWithOra(cliLogger: CLILogger, token: string): Promise { +interface TokenWithTeam { + token: string + teamId: number +} + +export async function verifyTokenWithOra(cliLogger: CLILogger, token: string): Promise { try { const { userId, teamId } = await oraPromise(apiVerifyToken(token), { prefixText: "", @@ -26,41 +31,52 @@ export async function verifyTokenWithOra(cliLogger: CLILogger, token: string): P groupId: String(teamId), }, }) - return true + return { token, teamId } } catch (error) { await cliLogger.trackWarningAndFlush("[CLI]: verifyToken failed", { error: error.toString() }) - return false + return null } } -export async function promptForNewAccessToken(cliLogger: CLILogger): Promise { +export async function promptForNewAccessToken(cliLogger: CLILogger): Promise { console.log("> To get new credentials, please visit the following URL in your web browser:") console.log(`> ${link(`${BASE_URL}${CLI_AUTH_ROUTE}`)}`) console.log() console.log("> You will need to login then enter the provided credentials below.") - const { token } = await prompt({ + + let tokenWithTeam: TokenWithTeam | null = null + + await prompt({ type: "text", name: "token", message: "Access token", validate: async (token: string) => { - const isValid = await verifyTokenWithOra(cliLogger, token) - return isValid ? true : `Invalid token` + tokenWithTeam = await verifyTokenWithOra(cliLogger, token) + return tokenWithTeam ? true : `Invalid token` }, onState: abortOnState, }) - await writeAuthConfig({ token }) + if (!tokenWithTeam) { + throw new Error("Unexpected error: failed to verify token") + } + + await storeToken(cliLogger, tokenWithTeam) - return token + return tokenWithTeam } -export async function getAccessToken(cliLogger: CLILogger): Promise { - const authConfig = await readAuthConfig(cliLogger) - if (authConfig && (await verifyTokenWithOra(cliLogger, authConfig.token))) { - return authConfig.token +export async function getAccessToken(cliLogger: CLILogger, { teamId }: { teamId?: number }): Promise { + if (!teamId) { + return promptForNewAccessToken(cliLogger) + } + + const token = await getToken(cliLogger, { teamId }) + if (token && (await verifyTokenWithOra(cliLogger, token))) { + return { token, teamId } } - if (!authConfig) { + if (!token) { console.log("> No existing credentials found.") } else { console.log("> Credentials are no longer valid.") diff --git a/packages/subframe-cli/src/config.ts b/packages/subframe-cli/src/config.ts index 448fe78..85fb151 100644 --- a/packages/subframe-cli/src/config.ts +++ b/packages/subframe-cli/src/config.ts @@ -1,21 +1,25 @@ import { mkdir, readFile, writeFile } from "node:fs/promises" import { join } from "node:path" import XDGAppPaths from "xdg-app-paths" +import { isDev } from "./common" import { CLILogger } from "./logger/logger-cli" import { exists } from "./utils/fs" const SUBFRAME_DIRECTORY = XDGAppPaths("com.subframe.cli").dataDirs()[0] -const SUBFRAME_AUTH_CONFIG_PATH = join(SUBFRAME_DIRECTORY, "auth.json") +const AUTH_CONFIG_FILENAME = isDev ? "auth.dev.json" : "auth.json" +const SUBFRAME_AUTH_CONFIG_PATH = join(SUBFRAME_DIRECTORY, AUTH_CONFIG_FILENAME) interface AuthConfig { - token: string + tokens: { + [teamId: number]: string + } } function isAuthConfig(config: any): config is AuthConfig { - return typeof config === "object" && config !== null && typeof config.token === "string" + return typeof config === "object" && config !== null && typeof config.tokens === "object" } -export async function readAuthConfig(cliLogger: CLILogger): Promise { +async function readAuthConfig(cliLogger: CLILogger): Promise { try { if (!(await exists(SUBFRAME_AUTH_CONFIG_PATH))) { return null @@ -33,7 +37,22 @@ export async function readAuthConfig(cliLogger: CLILogger): Promise { +async function writeAuthConfig(authConfig: AuthConfig): Promise { await mkdir(SUBFRAME_DIRECTORY, { recursive: true }) await writeFile(SUBFRAME_AUTH_CONFIG_PATH, JSON.stringify(authConfig, null, 2)) } + +export async function getToken(cliLogger: CLILogger, { teamId }: { teamId: number }): Promise { + const config = await readAuthConfig(cliLogger) + return config?.tokens[teamId] ?? null +} + +export async function storeToken( + cliLogger: CLILogger, + { teamId, token }: { teamId: number; token: string }, +): Promise { + const config = await readAuthConfig(cliLogger) + const tokens = config?.tokens ?? {} + tokens[teamId] = token + await writeAuthConfig({ tokens }) +} diff --git a/packages/subframe-cli/src/init-project.ts b/packages/subframe-cli/src/init-project.ts index 6045765..fd459e1 100644 --- a/packages/subframe-cli/src/init-project.ts +++ b/packages/subframe-cli/src/init-project.ts @@ -33,7 +33,7 @@ export async function initProject({ } catch (error) { if (error.message === FAILED_TO_FETCH_PROJECT_ERROR) { console.log("> Unable to fetch project. Try authenticating again.") - const newAccessToken = await promptForNewAccessToken(cliLogger) + const { token: newAccessToken } = await promptForNewAccessToken(cliLogger) return initProject({ cliLogger, accessToken: newAccessToken, truncatedProjectId, cssType }) } diff --git a/packages/subframe-cli/src/init.ts b/packages/subframe-cli/src/init.ts index 9481355..84f9976 100644 --- a/packages/subframe-cli/src/init.ts +++ b/packages/subframe-cli/src/init.ts @@ -29,7 +29,7 @@ import { TruncatedProjectId } from "shared/types" import { getAccessToken, verifyTokenWithOra } from "./access-token" import { apiUpdateImportAlias } from "./api-endpoints" import { localSyncSettings } from "./common" -import { writeAuthConfig } from "./config" +import { storeToken } from "./config" import { SUBFRAME_INIT_MESSAGE } from "./constants" import { initProject } from "./init-project" import { initSync } from "./init-sync" @@ -79,14 +79,14 @@ initCommand.action(async (opts) => { let accessToken = opts.authToken if (accessToken) { - const isValid = await verifyTokenWithOra(cliLogger, accessToken) - if (!isValid) { + const tokenWithTeam = await verifyTokenWithOra(cliLogger, accessToken) + if (!tokenWithTeam) { throw new Error("Failed to authenticate with provided token") } - - await writeAuthConfig({ token: accessToken }) + await storeToken(cliLogger, tokenWithTeam) } else { - accessToken = await getAccessToken(cliLogger) + const tokenWithTeam = await getAccessToken(cliLogger, { teamId: localSyncSettings?.teamId }) + accessToken = tokenWithTeam.token } console.time(SUBFRAME_INIT_MESSAGE) @@ -108,6 +108,7 @@ initCommand.action(async (opts) => { directory: opts.dir ?? localSyncSettings?.directory, importAlias: localSyncSettings?.importAlias, projectId: truncatedProjectId, + teamId: projectInfo.teamId, cssType: styleInfo.cssType, }, opts, diff --git a/packages/subframe-cli/src/push-component.ts b/packages/subframe-cli/src/push-component.ts index 2430948..8210517 100644 --- a/packages/subframe-cli/src/push-component.ts +++ b/packages/subframe-cli/src/push-component.ts @@ -2,9 +2,10 @@ import { Command } from "@commander-js/extra-typings" import { readFile } from "node:fs/promises" import { isAbsolute, join } from "node:path" import { oraPromise } from "ora" +import { TruncatedProjectId } from "shared/types" import { getAccessToken } from "./access-token" import { apiPushComponent } from "./api-endpoints" -import { cwd } from "./common" +import { cwd, localSyncSettings } from "./common" import { makeCLILogger } from "./logger/logger-cli" import { highlight } from "./output/format" @@ -18,7 +19,8 @@ export const pushComponentCommand = new Command() const cliLogger = makeCLILogger() try { - const accessToken = await getAccessToken(cliLogger) + const tokenWithTeam = await getAccessToken(cliLogger, { teamId: localSyncSettings?.teamId }) + const accessToken = tokenWithTeam.token // read file from path const resolvedPath = isAbsolute(componentFilePath) ? componentFilePath : join(cwd, componentFilePath) @@ -34,7 +36,7 @@ export const pushComponentCommand = new Command() try { await oraPromise( apiPushComponent(accessToken, { - truncatedProjectId: opts.projectId, + truncatedProjectId: opts.projectId as TruncatedProjectId, componentName, componentFile, skipNormalize: opts.skipNormalize, diff --git a/packages/subframe-cli/src/sync-settings.ts b/packages/subframe-cli/src/sync-settings.ts index 0ff89df..8de92ab 100644 --- a/packages/subframe-cli/src/sync-settings.ts +++ b/packages/subframe-cli/src/sync-settings.ts @@ -13,6 +13,7 @@ export interface SyncSettingsConfig { directory: string importAlias: string projectId?: TruncatedProjectId + teamId?: number cssType?: "tailwind" | "tailwind-v4" } @@ -66,6 +67,7 @@ export async function setupSyncSettings( directory: options.directory, importAlias: options.importAlias, projectId: options.projectId, + teamId: options.teamId, cssType: options.cssType, } @@ -130,6 +132,17 @@ export async function setupSyncSettings( directory: config.directory!, importAlias: config.importAlias!, projectId: options.projectId, + teamId: options.teamId, cssType: options.cssType, } } + +/** + * Writes sync settings to sync.json file + */ +export async function updateSyncSettings(cwd: string, settings: SyncSettingsConfig): Promise { + const subframeDirPath = join(cwd, SUBFRAME_DIR) + const syncSettingsPath = join(subframeDirPath, SYNC_SETTINGS_FILENAME) + + await writeFile(syncSettingsPath, JSON.stringify(settings, null, 2)) +} diff --git a/packages/subframe-cli/src/sync.ts b/packages/subframe-cli/src/sync.ts index 1e4fabf..46026f0 100644 --- a/packages/subframe-cli/src/sync.ts +++ b/packages/subframe-cli/src/sync.ts @@ -16,6 +16,7 @@ import { MALFORMED_INIT_MESSAGE, SUBFRAME_SYNC_MESSAGE, WRONG_PROJECT_MESSAGE } import { installDependencies } from "./install-dependencies" import { makeCLILogger } from "./logger/logger-cli" import { syncComponents } from "./sync-components" +import { updateSyncSettings } from "./sync-settings" export const syncCommand = new Command() .name("sync") @@ -40,7 +41,14 @@ export const syncCommand = new Command() process.exit(1) } - const accessToken = await getAccessToken(cliLogger) + const tokenWithTeam = await getAccessToken(cliLogger, { teamId: localSyncSettings?.teamId }) + + const accessToken = tokenWithTeam.token + + // Update sync.json with teamId if it's missing (legacy project migration) + if (!localSyncSettings.teamId) { + await updateSyncSettings(cwd, { ...localSyncSettings, teamId: tokenWithTeam.teamId }) + } // strip /* which is used for tsconfig.json const importAlias = localSyncSettings.importAlias.endsWith("/*")