ext:migrate now upgrades extensions - #10977
Conversation
### Description Implement the initial Unique Veneer section of the ext:migrate workflow. This includes the extmigration experiment registration, replacements.json integration, table formatting of installed extensions, instance filtering, interactive prompt selection via createMigrationPlan, and the ext:migrate CLI command. ### Scenarios Tested - Unit tests in src/extensions/migrate.spec.ts covering all 9 manual scenarios (no flags, --ext-instance, --extension, and error states). ### Sample Commands firebase ext:migrate --project P firebase ext:migrate --project P --ext-instance E1 firebase ext:migrate --project P --extension storage-resize-images
There was a problem hiding this comment.
Code Review
This pull request introduces the ext:migrate command to support migrating extension instances to function kits, along with updates to parameter prompting, validation, and default handling for multiselect parameters. The review feedback highlights several critical improvements: ensuring that checkbox prompts correctly use computed default options, propagating the --force flag to enforce non-interactive behavior across all sub-prompts, and safely handling potentially undefined instance.config.params to prevent runtime crashes during migration.
| let optsWithDefault = opts; | ||
| if (opts.default === undefined && Array.isArray(opts.choices)) { | ||
| const checkedValues = (opts.choices as Choice<Value>[]) | ||
| .filter((c) => c && typeof c === "object" && "checked" in c && (c as Choice<Value>).checked) | ||
| .map((c) => c.value); | ||
| optsWithDefault = { ...opts, default: checkedValues }; | ||
| } | ||
| const { shouldReturn, value } = guard(optsWithDefault); |
There was a problem hiding this comment.
In interactive mode, the computed default values for the checkbox prompt are ignored because inquirer.checkbox is called with the original opts instead of optsWithDefault. Reassigning opts directly ensures that both guard(opts) and inquirer.checkbox(opts) use the updated options with the correct defaults.
| let optsWithDefault = opts; | |
| if (opts.default === undefined && Array.isArray(opts.choices)) { | |
| const checkedValues = (opts.choices as Choice<Value>[]) | |
| .filter((c) => c && typeof c === "object" && "checked" in c && (c as Choice<Value>).checked) | |
| .map((c) => c.value); | |
| optsWithDefault = { ...opts, default: checkedValues }; | |
| } | |
| const { shouldReturn, value } = guard(optsWithDefault); | |
| if (opts.default === undefined && Array.isArray(opts.choices)) { | |
| const checkedValues = (opts.choices as Choice<Value>[]) | |
| .filter((c) => c && typeof c === "object" && "checked" in c && (c as Choice<Value>).checked) | |
| .map((c) => c.value); | |
| opts = { ...opts, default: checkedValues }; | |
| } | |
| const { shouldReturn, value } = guard(opts); |
| .action(async (options: ExtMigrateOptions) => { | ||
| const projectId = needProjectId(options); | ||
| const plan = await createMigrationPlan(projectId, { | ||
| package: options.package, | ||
| extInstance: options.extInstance, | ||
| extension: options.extension, | ||
| nonInteractive: options.nonInteractive, | ||
| force: options.force, | ||
| }); |
There was a problem hiding this comment.
When the --force flag is passed, the command should run completely non-interactively. However, because options.force is not propagated to sub-prompts (like parameter configuration), they will still prompt the user interactively. Setting options.nonInteractive = true and calling setNonInteractive(true) when options.force is active ensures that all prompts automatically fall back to their default values.
| .action(async (options: ExtMigrateOptions) => { | |
| const projectId = needProjectId(options); | |
| const plan = await createMigrationPlan(projectId, { | |
| package: options.package, | |
| extInstance: options.extInstance, | |
| extension: options.extension, | |
| nonInteractive: options.nonInteractive, | |
| force: options.force, | |
| }); | |
| .action(async (options: ExtMigrateOptions) => { | |
| const projectId = needProjectId(options); | |
| if (options.force) { | |
| options.nonInteractive = true; | |
| const { setNonInteractive } = require("../prompt"); | |
| setNonInteractive(true); | |
| } | |
| const plan = await createMigrationPlan(projectId, { | |
| package: options.package, | |
| extInstance: options.extInstance, | |
| extension: options.extension, | |
| nonInteractive: options.nonInteractive, | |
| force: options.force, | |
| }); |
| ); | ||
|
|
||
| const targetRef = `${baseRef}@${latestVersion}`; | ||
| let finalParams = instance.config.params; |
There was a problem hiding this comment.
instance.config.params can be undefined in some older or malformed extension instances. Initializing finalParams to instance.config.params || {} prevents potential runtime TypeError crashes when accessing or modifying parameter keys.
| let finalParams = instance.config.params; | |
| let finalParams = instance.config.params || {}; |
| const paramBindings = await paramHelper.promptForNewParams({ | ||
| spec: oldSpec, | ||
| newSpec: newExtensionVersion.spec, | ||
| currentParams: instance.config.params, |
There was a problem hiding this comment.
### Description Address review feedback on PR #10974: - Validate `--package` CLI option using `validateNpmPackageName` - Simplify `getKitPackage` lookup logic (removed shortName fallback) - Update error messages when no kit package is found to encourage forking - Add unit test verifying `getKitPackage` returns undefined for extension refs without a replacement package ### Scenarios Tested - Tested `ext:migrate` unit test suite (`npm run mocha:fast src/extensions/migrate.spec.ts`) - Tested `functions:kits:install` unit test suite (`npm run mocha:fast src/commands/functions-kits-install.spec.ts`)
… package names from main
…propagate prompt cancellation ### Description - Rebased cleanly onto PR #10974 (). - Added helper in to separate user params from system params (such as ). - Updated in to accept and forward to . - Refactored in to strictly enforce parameter prompting rules (only prompting for changed types, rejected validator values, newly required unset params, or advanced/system params when old params are dropped or location is unset). - Removed error-swallowing try-catch in () so Ctrl+C or prompt cancellations immediately abort instance updates. - Added log bullet right before execution. ### Scenarios Tested - Executed unit test suite ( mocha tests passing). - Clean build ( > firebase-tools@15.28.1 build > npm run build:mcp-apps && tsc && npm run copyfiles > firebase-tools@15.28.1 build:mcp-apps > vite build --config src/mcp/apps/update_environment/vite.config.ts && vite build --config src/mcp/apps/init/vite.config.ts && vite build --config src/mcp/apps/deploy/vite.config.ts vite v4.2.1 building for production... transforming... ✓ 146 modules transformed. rendering chunks... ../../../../lib/mcp/apps/update_environment/mcp-app.html 139.69 kB ✓ built in 396ms vite v4.2.1 building for production... transforming... ✓ 146 modules transformed. rendering chunks... ../../../../lib/mcp/apps/init/mcp-app.html 142.63 kB ✓ built in 378ms vite v4.2.1 building for production... transforming... ✓ 146 modules transformed. rendering chunks... ../../../../lib/mcp/apps/deploy/mcp-app.html 138.16 kB ✓ built in 371ms src/extensions/askUserForParam.ts(199,15): error TS2554: Expected 1 arguments, but got 2. src/extensions/migrate.spec.ts(362,9): error TS2554: Expected 3 arguments, but got 4. src/extensions/migrate.spec.ts(380,9): error TS2554: Expected 3 arguments, but got 4.) and lint ( > firebase-tools@15.28.1 lint:changed-files > ts-node ./scripts/lint-changed-files.ts Ignoring changed files: - CHANGELOG.md /Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/commands/index.ts 4:33 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 4:51 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 11:18 warning Missing return type on function @typescript-eslint/explicit-function-return-type 12:13 warning Unsafe assignment of an `any` value @typescript-eslint/no-unsafe-assignment 12:32 warning Require statement not part of import statement @typescript-eslint/no-var-requires 13:7 warning Unsafe member access .register on an `any` value @typescript-eslint/no-unsafe-member-access 13:7 warning Unsafe call of an `any` typed value @typescript-eslint/no-unsafe-call 14:7 warning Unsafe return of an `any` typed value @typescript-eslint/no-unsafe-return 14:14 warning Unsafe member access .runner on an `any` value @typescript-eslint/no-unsafe-member-access 14:14 warning Unsafe call of an `any` typed value @typescript-eslint/no-unsafe-call 17:37 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 18:13 warning Unsafe assignment of an `any` value @typescript-eslint/no-unsafe-assignment 19:7 warning Unsafe return of an `any` typed value @typescript-eslint/no-unsafe-return 19:14 warning Unsafe call of an `any` typed value @typescript-eslint/no-unsafe-call 24:7 warning Unsafe member access .command on an `any` value @typescript-eslint/no-unsafe-member-access 24:7 warning Unsafe call of an `any` typed value @typescript-eslint/no-unsafe-call 24:7 warning Require statement not part of import statement @typescript-eslint/no-var-requires 33:3 warning Unsafe member access .debugtokens on an `any` value @typescript-eslint/no-unsafe-member-access 34:3 warning Unsafe member access .debugtokens on an `any` value @typescript-eslint/no-unsafe-member-access 35:3 warning Unsafe member access .debugtokens on an `any` value @typescript-eslint/no-unsafe-member-access 36:3 warning Unsafe member access .debugtokens on an `any` value @typescript-eslint/no-unsafe-member-access 41:5 warning Unsafe member access .services on an `any` value @typescript-eslint/no-unsafe-member-access 42:5 warning Unsafe member access .services on an `any` value @typescript-eslint/no-unsafe-member-access 43:5 warning Unsafe member access .services on an `any` value @typescript-eslint/no-unsafe-member-access 44:5 warning Unsafe member access .services on an `any` value @typescript-eslint/no-unsafe-member-access 45:5 warning Unsafe member access .providers on an `any` value @typescript-eslint/no-unsafe-member-access 46:5 warning Unsafe member access .providers on an `any` value @typescript-eslint/no-unsafe-member-access 47:5 warning Unsafe member access .providers on an `any` value @typescript-eslint/no-unsafe-member-access 48:5 warning Unsafe member access .providers on an `any` value @typescript-eslint/no-unsafe-member-access 49:5 warning Unsafe member access .apps on an `any` value @typescript-eslint/no-unsafe-member-access 50:5 warning Unsafe member access .apps on an `any` value @typescript-eslint/no-unsafe-member-access 53:3 warning Unsafe member access .distribute on an `any` value @typescript-eslint/no-unsafe-member-access 54:3 warning Unsafe member access .testers on an `any` value @typescript-eslint/no-unsafe-member-access 55:3 warning Unsafe member access .testers on an `any` value @typescript-eslint/no-unsafe-member-access 56:3 warning Unsafe member access .testers on an `any` value @typescript-eslint/no-unsafe-member-access 57:3 warning Unsafe member access .testers on an `any` value @typescript-eslint/no-unsafe-member-access 58:3 warning Unsafe member access .groups on an `any` value @typescript-eslint/no-unsafe-member-access 59:3 warning Unsafe member access .groups on an `any` value @typescript-eslint/no-unsafe-member-access 60:3 warning Unsafe member access .groups on an `any` value @typescript-eslint/no-unsafe-member-access 61:3 warning Unsafe member access .groups on an `any` value @typescript-eslint/no-unsafe-member-access 62:3 warning Unsafe assignment of an `any` value @typescript-eslint/no-unsafe-assignment 62:3 warning Unsafe member access .group on an `any` value @typescript-eslint/no-unsafe-member-access 62:34 warning Unsafe member access .groups on an `any` value @typescript-eslint/no-unsafe-member-access 63:3 warning Unsafe member access .testCases on an `any` value @typescript-eslint/no-unsafe-member-access 64:3 warning Unsafe member access .testCases on an `any` value @typescript-eslint/no-unsafe-member-access 65:3 warning Unsafe member access .testCases on an `any` value @typescript-eslint/no-unsafe-member-access 67:3 warning Unsafe member access .execute on an `any` value @typescript-eslint/no-unsafe-member-access 69:5 warning Unsafe member access .wata on an `any` value @typescript-eslint/no-unsafe-member-access 72:3 warning Unsafe member access .create on an `any` value @typescript-eslint/no-unsafe-member-access 73:3 warning Unsafe member access .list on an `any` value @typescript-eslint/no-unsafe-member-access 74:3 warning Unsafe member access .init on an `any` value @typescript-eslint/no-unsafe-member-access 75:3 warning Unsafe member access .sdkconfig on an `any` value @typescript-eslint/no-unsafe-member-access 76:3 warning Unsafe member access .android on an `any` value @typescript-eslint/no-unsafe-member-access 77:3 warning Unsafe member access .android on an `any` value @typescript-eslint/no-unsafe-member-access 78:3 warning Unsafe member access .android on an `any` value @typescript-eslint/no-unsafe-member-access 79:3 warning Unsafe member access .android on an `any` value @typescript-eslint/no-unsafe-member-access 80:3 warning Unsafe member access .android on an `any` value @typescript-eslint/no-unsafe-member-access 82:3 warning Unsafe member access .export on an `any` value @typescript-eslint/no-unsafe-member-access 83:3 warning Unsafe member access .import on an `any` value @typescript-eslint/no-unsafe-member-access 85:3 warning Unsafe member access .onboard on an `any` value @typescript-eslint/no-unsafe-member-access 86:3 warning Unsafe member access .onboard on an `any` value @typescript-eslint/no-unsafe-member-access 87:3 warning Unsafe member access .symbols on an `any` value @typescript-eslint/no-unsafe-member-access 88:3 warning Unsafe member access .symbols on an `any` value @typescript-eslint/no-unsafe-member-access 89:3 warning Unsafe member access .mappingfile on an `any` value @typescript-eslint/no-unsafe-member-access 90:3 warning Unsafe member access .mappingfile on an `any` value @typescript-eslint/no-unsafe-member-access 91:3 warning Unsafe member access .mappingfile on an `any` value @typescript-eslint/no-unsafe-member-access 93:5 warning Unsafe member access .sourcemap on an `any` value @typescript-eslint/no-unsafe-member-access 94:5 warning Unsafe member access .sourcemap on an `any` value @typescript-eslint/no-unsafe-member-access 97:3 warning Unsafe member access .get on an `any` value @typescript-eslint/no-unsafe-member-access 98:3 warning Unsafe member access .import on an `any` value @typescript-eslint/no-unsafe-member-access 99:3 warning Unsafe member access .instances on an `any` value @typescript-eslint/no-unsafe-member-access 100:3 warning Unsafe member access .instances on an `any` value @typescript-eslint/no-unsafe-member-access 101:3 warning Unsafe member access .instances on an `any` value @typescript-eslint/no-unsafe-member-access 102:3 warning Unsafe member access .profile on an `any` value @typescript-eslint/no-unsafe-member-access 103:3 warning Unsafe member access .push on an `any` value @typescript-eslint/no-unsafe-member-access 104:3 warning Unsafe member access .remove on an `any` value @typescript-eslint/no-unsafe-member-access 106:5 warning Unsafe member access .rules on an `any` value @typescript-eslint/no-unsafe-member-access 107:5 warning Unsafe member access .rules on an `any` value @typescript-eslint/no-unsafe-member-access 108:5 warning Unsafe member access .rules on an `any` value @typescript-eslint/no-unsafe-member-access 109:5 warning Unsafe member access .rules on an `any` value @typescript-eslint/no-unsafe-member-access 110:5 warning Unsafe member access .rules on an `any` value @typescript-eslint/no-unsafe-member-access 111:5 warning Unsafe member access .rules on an `any` value @typescript-eslint/no-unsafe-member-access 113:3 warning Unsafe member access .set on an `any` value @typescript-eslint/no-unsafe-member-access 114:3 warning Unsafe member access .settings on an `any` value @typescript-eslint/no-unsafe-member-access 115:3 warning Unsafe member access .settings on an `any` value @typescript-eslint/no-unsafe-member-access 116:3 warning Unsafe member access .settings on an `any` value @typescript-eslint/no-unsafe-member-access 117:3 warning Unsafe member access .update on an `any` value @typescript-eslint/no-unsafe-member-access 120:3 warning Unsafe member access .exec on an `any` value @typescript-eslint/no-unsafe-member-access 121:3 warning Unsafe member access .export on an `any` value @typescript-eslint/no-unsafe-member-access 122:3 warning Unsafe member access .start on an `any` value @typescript-eslint/no-unsafe-member-access 124:3 warning Unsafe member access .list on an `any` value @typescript-eslint/no-unsafe-member-access 125:3 warning Unsafe member access .describe on an `any` value @typescript-eslint/no-unsafe-member-access 126:3 warning Unsafe member access .enable on an `any` value @typescript-eslint/no-unsafe-member-access 127:3 warning Unsafe member access .disable on an `any` value @typescript-eslint/no-unsafe-member-access 129:3 warning Unsafe member access .configure on an `any` value @typescript-eslint/no-unsafe-member-access 130:3 warning Unsafe member access .info on an `any` value @typescript-eslint/no-unsafe-member-access 131:3 warning Unsafe member access .export on an `any` value @typescript-eslint/no-unsafe-member-access 132:3 warning Unsafe member access .install on an `any` value @typescript-eslint/no-unsafe-member-access 133:3 warning Unsafe member access .list on an `any` value @typescript-eslint/no-unsafe-member-access 134:3 warning Unsafe member access .uninstall on an `any` value @typescript-eslint/no-unsafe-member-access 135:3 warning Unsafe member access .update on an `any` value @typescript-eslint/no-unsafe-member-access 137:5 warning Unsafe member access .migrate on an `any` value @typescript-eslint/no-unsafe-member-access 139:3 warning Unsafe member access .sdk on an `any` value @typescript-eslint/no-unsafe-member-access 140:3 warning Unsafe member access .sdk on an `any` value @typescript-eslint/no-unsafe-member-access 141:3 warning Unsafe member access .dev on an `any` value @typescript-eslint/no-unsafe-member-access 142:3 warning Unsafe member access .dev on an `any` value @typescript-eslint/no-unsafe-member-access 143:3 warning Unsafe member access .dev on an `any` value @typescript-eslint/no-unsafe-member-access 144:3 warning Unsafe member access .dev on an `any` value @typescript-eslint/no-unsafe-member-access 145:3 warning Unsafe member access .dev on an `any` value @typescript-eslint/no-unsafe-member-access 146:3 warning Unsafe member access .dev on an `any` value @typescript-eslint/no-unsafe-member-access 147:3 warning Unsafe member access .dev on an `any` value @typescript-eslint/no-unsafe-member-access 148:3 warning Unsafe member access .dev on an `any` value @typescript-eslint/no-unsafe-member-access 150:3 warning Unsafe member access .delete on an `any` value @typescript-eslint/no-unsafe-member-access 151:3 warning Unsafe member access .bulkDelete on an `any` value @typescript-eslint/no-unsafe-member-access 152:3 warning Unsafe member access .indexes on an `any` value @typescript-eslint/no-unsafe-member-access 153:3 warning Unsafe member access .locations on an `any` value @typescript-eslint/no-unsafe-member-access 154:3 warning Unsafe member access .operations on an `any` value @typescript-eslint/no-unsafe-member-access 155:3 warning Unsafe member access .operations on an `any` value @typescript-eslint/no-unsafe-member-access 156:3 warning Unsafe member access .operations on an `any` value @typescript-eslint/no-unsafe-member-access 157:3 warning Unsafe member access .operations on an `any` value @typescript-eslint/no-unsafe-member-access 158:3 warning Unsafe member access .databases on an `any` value @typescript-eslint/no-unsafe-member-access 159:3 warning Unsafe member access .databases on an `any` value @typescript-eslint/no-unsafe-member-access 160:3 warning Unsafe member access .databases on an `any` value @typescript-eslint/no-unsafe-member-access 161:3 warning Unsafe member access .databases on an `any` value @typescript-eslint/no-unsafe-member-access 162:3 warning Unsafe member access .databases on an `any` value @typescript-eslint/no-unsafe-member-access 163:3 warning Unsafe member access .databases on an `any` value @typescript-eslint/no-unsafe-member-access 164:3 warning Unsafe member access .databases on an `any` value @typescript-eslint/no-unsafe-member-access 165:3 warning Unsafe member access .databases on an `any` value @typescript-eslint/no-unsafe-member-access 166:3 warning Unsafe member access .backups on an `any` value @typescript-eslint/no-unsafe-member-access 167:3 warning Unsafe member access .backups on an `any` value @typescript-eslint/no-unsafe-member-access 168:3 warning Unsafe member access .backups on an `any` value @typescript-eslint/no-unsafe-member-access 169:3 warning Unsafe member access .backups on an `any` value @typescript-eslint/no-unsafe-member-access 170:3 warning Unsafe member access .backups on an `any` value @typescript-eslint/no-unsafe-member-access 171:3 warning Unsafe member access .backups on an `any` value @typescript-eslint/no-unsafe-member-access 172:3 warning Unsafe member access .backups on an `any` value @typescript-eslint/no-unsafe-member-access 173:3 warning Unsafe member access .backups on an `any` value @typescript-eslint/no-unsafe-member-access 174:3 warning Unsafe member access .backups on an `any` value @typescript-eslint/no-unsafe-member-access 176:3 warning Unsafe member access .config on an `any` value @typescript-eslint/no-unsafe-member-access 177:3 warning Unsafe member access .config on an `any` value @typescript-eslint/no-unsafe-member-access 178:3 warning Unsafe member access .config on an `any` value @typescript-eslint/no-unsafe-member-access 179:3 warning Unsafe member access .config on an `any` value @typescript-eslint/no-unsafe-member-access 180:3 warning Unsafe member access .config on an `any` value @typescript-eslint/no-unsafe-member-access 181:3 warning Unsafe member access .config on an `any` value @typescript-eslint/no-unsafe-member-access 182:3 warning Unsafe member access .delete on an `any` value @typescript-eslint/no-unsafe-member-access 184:5 warning Unsafe member access .export on an `any` value @typescript-eslint/no-unsafe-member-access 186:3 warning Unsafe member access .log on an `any` value @typescript-eslint/no-unsafe-member-access 187:3 warning Unsafe member access .shell on an `any` value @typescript-eslint/no-unsafe-member-access 188:3 warning Unsafe member access .list on an `any` value @typescript-eslint/no-unsafe-member-access 189:3 warning Unsafe member access .lifecycle on an `any` value @typescript-eslint/no-unsafe-member-access 190:3 warning Unsafe member access .lifecycle on an `any` value @typescript-eslint/no-unsafe-member-access 191:3 warning Unsafe member access .lifecycle on an `any` value @typescript-eslint/no-unsafe-member-access 193:5 warning Unsafe member access .deletegcfartifacts on an `any` value @typescript-eslint/no-unsafe-member-access 195:3 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 196:3 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 197:3 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 198:3 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 199:3 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 200:3 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 201:3 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 202:3 warning Unsafe member access .artifacts on an `any` value @typescript-eslint/no-unsafe-member-access 203:3 warning Unsafe member access .artifacts on an `any` value @typescript-eslint/no-unsafe-member-access 205:5 warning Unsafe member access .kits on an `any` value @typescript-eslint/no-unsafe-member-access 206:5 warning Unsafe member access .kits on an `any` value @typescript-eslint/no-unsafe-member-access 207:5 warning Unsafe member access .kits on an `any` value @typescript-eslint/no-unsafe-member-access 211:3 warning Unsafe member access .channel on an `any` value @typescript-eslint/no-unsafe-member-access 212:3 warning Unsafe member access .channel on an `any` value @typescript-eslint/no-unsafe-member-access 213:3 warning Unsafe member access .channel on an `any` value @typescript-eslint/no-unsafe-member-access 214:3 warning Unsafe member access .channel on an `any` value @typescript-eslint/no-unsafe-member-access 215:3 warning Unsafe member access .channel on an `any` value @typescript-eslint/no-unsafe-member-access 216:3 warning Unsafe member access .channel on an `any` value @typescript-eslint/no-unsafe-member-access 217:3 warning Unsafe member access .clone on an `any` value @typescript-eslint/no-unsafe-member-access 218:3 warning Unsafe member access .disable on an `any` value @typescript-eslint/no-unsafe-member-access 219:3 warning Unsafe member access .sites on an `any` value @typescript-eslint/no-unsafe-member-access 220:3 warning Unsafe member access .sites on an `any` value @typescript-eslint/no-unsafe-member-access 221:3 warning Unsafe member access .sites on an `any` value @typescript-eslint/no-unsafe-member-access 222:3 warning Unsafe member access .sites on an `any` value @typescript-eslint/no-unsafe-member-access 223:3 warning Unsafe member access .sites on an `any` value @typescript-eslint/no-unsafe-member-access 227:5 warning Unsafe member access .frameworks on an `any` value @typescript-eslint/no-unsafe-member-access 228:5 warning Unsafe member access .frameworks on an `any` value @typescript-eslint/no-unsafe-member-access 229:5 warning Unsafe member access .functions on an `any` value @typescript-eslint/no-unsafe-member-access 230:5 warning Unsafe member access .functions on an `any` value @typescript-eslint/no-unsafe-member-access 234:5 warning Unsafe member access .backends on an `any` value @typescript-eslint/no-unsafe-member-access 235:5 warning Unsafe member access .backends on an `any` value @typescript-eslint/no-unsafe-member-access 236:5 warning Unsafe member access .backends on an `any` value @typescript-eslint/no-unsafe-member-access 237:5 warning Unsafe member access .backends on an `any` value @typescript-eslint/no-unsafe-member-access 238:5 warning Unsafe member access .backends on an `any` value @typescript-eslint/no-unsafe-member-access 239:5 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 240:5 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 241:5 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 242:5 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 243:5 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 244:5 warning Unsafe member access .secrets on an `any` value @typescript-eslint/no-unsafe-member-access 245:5 warning Unsafe member access .rollouts on an `any` value @typescript-eslint/no-unsafe-member-access 246:5 warning Unsafe member access .rollouts on an `any` value @typescript-eslint/no-unsafe-member-access 247:5 warning Unsafe member access .config on an `any` value @typescript-eslint/no-unsafe-member-access 249:7 warning Unsafe member access .builds on an `any` value @typescript-eslint/no-unsafe-member-access 250:7 warning Unsafe member access .builds on an `any` value @typescript-eslint/no-unsafe-member-access 251:7 warning Unsafe member access .builds on an `any` value @typescript-eslint/no-unsafe-member-access 252:7 warning Unsafe member access .repos on an `any` value @typescript-eslint/no-unsafe-member-access 253:7 warning Unsafe member access .repos on an `any` value @typescript-eslint/no-unsafe-member-access 254:7 warning Unsafe member access .rollouts on an `any` value @typescript-eslint/no-unsafe-member-access 261:5 warning Unsafe member access .providers on an `any` value @typescript-eslint/no-unsafe-member-access 262:5 warning Unsafe member access .providers on an `any` value @typescript-eslint/no-unsafe-member-access 263:5 warning Unsafe member access .providers on an `any` value @typescript-eslint/no-unsafe-member-access 264:5 warning Unsafe member access .providers on an `any` value @typescript-eslint/no-unsafe-member-access 265:5 warning Unsafe member access .config on an `any` value @typescript-eslint/no-unsafe-member-access 266:5 warning Unsafe member access .config on an `any` value @typescript-eslint/no-unsafe-member-access 267:5 warning Unsafe member access .config on an `any` value @typescript-eslint/no-unsafe-member-access 268:5 warning Unsafe member access .templates on an `any` value @typescript-eslint/no-unsafe-member-access 269:5 warning Unsafe member access .templates on an `any` value @typescript-eslint/no-unsafe-member-access 270:5 warning Unsafe member access .templates on an `any` value @typescript-eslint/no-unsafe-member-access 271:5 warning Unsafe member access .templates on an `any` value @typescript-eslint/no-unsafe-member-access 272:5 warning Unsafe member access .templates on an `any` value @typescript-eslint/no-unsafe-member-access 273:5 warning Unsafe member access .templates on an `any` value @typescript-eslint/no-unsafe-member-access 277:3 warning Unsafe member access .add on an `any` value @typescript-eslint/no-unsafe-member-access 278:3 warning Unsafe member access .ci on an `any` value @typescript-eslint/no-unsafe-member-access 279:3 warning Unsafe member access .list on an `any` value @typescript-eslint/no-unsafe-member-access 280:3 warning Unsafe member access .use on an `any` value @typescript-eslint/no-unsafe-member-access 287:3 warning Unsafe member access .addfirebase on an `any` value @typescript-eslint/no-unsafe-member-access 288:3 warning Unsafe member access .create on an `any` value @typescript-eslint/no-unsafe-member-access 289:3 warning Unsafe member access .list on an `any` value @typescript-eslint/no-unsafe-member-access 291:3 warning Unsafe member access .get on an `any` value @typescript-eslint/no-unsafe-member-access 292:3 warning Unsafe member access .rollback on an `any` value @typescript-eslint/no-unsafe-member-access 293:3 warning Unsafe member access .versions on an `any` value @typescript-eslint/no-unsafe-member-access 294:3 warning Unsafe member access .versions on an `any` value @typescript-eslint/no-unsafe-member-access 295:3 warning Unsafe member access .rollouts on an `any` value @typescript-eslint/no-unsafe-member-access 296:3 warning Unsafe member access .rollouts on an `any` value @typescript-eslint/no-unsafe-member-access 297:3 warning Unsafe member access .rollouts on an `any` value @typescript-eslint/no-unsafe-member-access 298:3 warning Unsafe member access .rollouts on an `any` value @typescript-eslint/no-unsafe-member-access 299:3 warning Unsafe member access .experiments on an `any` value @typescript-eslint/no-unsafe-member-access 300:3 warning Unsafe member access .experiments on an `any` value @typescript-eslint/no-unsafe-member-access 301:3 warning Unsafe member access .experiments on an `any` value @typescript-eslint/no-unsafe-member-access 302:3 warning Unsafe member access .experiments on an `any` value @typescript-eslint/no-unsafe-member-access 305:3 warning Unsafe member access .emulators on an `any` value @typescript-eslint/no-unsafe-member-access 306:3 warning Unsafe member access .emulators on an `any` value @typescript-eslint/no-unsafe-member-access 307:3 warning Unsafe member access .emulators on an `any` value @typescript-eslint/no-unsafe-member-access 308:3 warning Unsafe member access .emulators on an `any` value @typescript-eslint/no-unsafe-member-access 309:3 warning Unsafe member access .emulators on an `any` value @typescript-eslint/no-unsafe-member-access 310:3 warning Unsafe member access .emulators on an `any` value @typescript-eslint/no-unsafe-member-access 312:3 warning Unsafe member access .emulators on an `any` value @typescript-eslint/no-unsafe-member-access 313:3 warning Unsafe member access .execute on an `any` value @typescript-eslint/no-unsafe-member-access 314:3 warning Unsafe member access .services on an `any` value @typescript-eslint/no-unsafe-member-access 315:3 warning Unsafe member access .services on an `any` value @typescript-eslint/no-unsafe-member-access 316:3 warning Unsafe member access .sql on an `any` value @typescript-eslint/no-unsafe-member-access 317:3 warning Unsafe member access .sql on an `any` value @typescript-eslint/no-unsafe-member-access 318:3 warning Unsafe member access .sql on an `any` value @typescript-eslint/no-unsafe-member-access 319:3 warning Unsafe member access .sql on an `any` value @typescript-eslint/no-unsafe-member-access 320:3 warning Unsafe member access .sql on an `any` value @typescript-eslint/no-unsafe-member-access 321:3 warning Unsafe member access .sql on an `any` value @typescript-eslint/no-unsafe-member-access 322:3 warning Unsafe member access .compile on an `any` value @typescript-eslint/no-unsafe-member-access 323:3 warning Unsafe member access .sdk on an `any` value @typescript-eslint/no-unsafe-member-access 324:3 warning Unsafe member access .sdk on an `any` value @typescript-eslint/no-unsafe-member-access 326:3 warning Unsafe member access .export on an `any` value @typescript-eslint/no-unsafe-member-access 328:3 warning Unsafe member access .apply on an `any` value @typescript-eslint/no-unsafe-member-access 329:3 warning Unsafe member access .clear on an `any` value @typescript-eslint/no-unsafe-member-access 330:3 warning Unsafe member access .remove on an `any` value @typescript-eslint/no-unsafe-member-access /Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/extensions/askUserForParam.ts 82:1 warning @PARAM path declaration ("args.projectId") appears before any real parameter jsdoc/check-param-names 130:64 warning Unsafe argument of type `any` assigned to a parameter of type `((value: void) => void | PromiseLike<void>) | null | undefined` @typescript-eslint/no-unsafe-argument 130:71 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 141:50 warning Unsafe argument of type `any` assigned to a parameter of type `((value: void) => void | PromiseLike<void>) | null | undefined` @typescript-eslint/no-unsafe-argument 141:57 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 149:1 warning @PARAM path declaration ("args.projectId") appears before any real parameter jsdoc/check-param-names /Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/extensions/migrate.spec.ts 352:67 warning Unsafe argument of type `any` assigned to a parameter of type `ExtensionVersion | undefined` @typescript-eslint/no-unsafe-argument 356:12 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 370:67 warning Unsafe argument of type `any` assigned to a parameter of type `ExtensionVersion | undefined` @typescript-eslint/no-unsafe-argument 374:12 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any /Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/extensions/paramHelper.ts 30:8 warning Missing JSDoc comment jsdoc/require-jsdoc 43:8 warning Missing JSDoc comment jsdoc/require-jsdoc 58:1 warning Expected only 0 line after block description jsdoc/tag-lines 80:1 warning Missing @PARAM "args.projectId" jsdoc/check-param-names 80:1 warning Missing @PARAM "args.instanceId" jsdoc/check-param-names 80:1 warning Missing @PARAM "args.paramSpecs" jsdoc/check-param-names 80:1 warning Missing @PARAM "args.nonInteractive" jsdoc/check-param-names 80:1 warning Missing @PARAM "args.reconfiguring" jsdoc/check-param-names 81:1 warning @PARAM "projectId" does not match parameter name "args" jsdoc/check-param-names 109:8 warning Missing JSDoc comment jsdoc/require-jsdoc 134:1 warning Expected only 0 line after block description jsdoc/tag-lines 135:1 warning Missing @PARAM "args.spec" jsdoc/check-param-names 135:1 warning Missing @PARAM "args.newSpec" jsdoc/check-param-names 135:1 warning Missing @PARAM "args.currentParams" jsdoc/check-param-names 135:1 warning Missing @PARAM "args.projectId" jsdoc/check-param-names 135:1 warning Missing @PARAM "args.instanceId" jsdoc/check-param-names 136:1 warning @PARAM "spec" does not match parameter name "args" jsdoc/check-param-names 267:8 warning Missing JSDoc comment jsdoc/require-jsdoc 280:8 warning Missing JSDoc comment jsdoc/require-jsdoc 281:49 warning Unnecessary escape character: \. no-useless-escape 285:8 warning Missing JSDoc comment jsdoc/require-jsdoc 303:8 warning Missing JSDoc comment jsdoc/require-jsdoc /Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/extensions/updateHelper.ts 27:8 warning Missing JSDoc comment jsdoc/require-jsdoc 65:8 warning Missing return type on function @typescript-eslint/explicit-function-return-type 78:123 warning Invalid type "string | undefined" of template literal expression @typescript-eslint/restrict-template-expressions 110:69 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 167:17 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 185:1 warning @PARAM "existingSource" does not match an existing function parameter jsdoc/check-param-names 197:17 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 209:8 warning Missing JSDoc comment jsdoc/require-jsdoc /Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/prompt.ts 34:1 warning Expected only 0 line after block description jsdoc/tag-lines 37:1 warning Invalid JSDoc tag (preference). Replace "returns" JSDoc tag with "return" jsdoc/check-tag-names 80:8 warning Missing JSDoc comment jsdoc/require-jsdoc 112:8 warning Missing return type on function @typescript-eslint/explicit-function-return-type 112:8 warning Missing JSDoc comment jsdoc/require-jsdoc 247:8 warning Missing JSDoc comment jsdoc/require-jsdoc 281:8 warning Missing JSDoc comment jsdoc/require-jsdoc ✖ 303 problems (0 errors, 303 warnings) 0 errors and 17 warnings potentially fixable with the `--fix` option.).
67414ed to
de08aeb
Compare
Nudges users to upgrade their extension before migrating. After the numbers of errors I ran into testing a migration of storage-resize-images@0.1.13 to 0.3.6, I'm of the belief that we might need to require this.
This PR required several fixes to the existing extensions code revealed by this particular upgrade. New features added to extensions over the years actually caused problems with the updated extensions. We now re-prompt for parameters if:
Fixing this also required fixing some other things like changing how sameParam matches, making sure the actual original version of the spec is fixed, and fixing the select prompt library which didn't handle --force correctly.