{"record":{"id":"7afbb3837278f16f","repo":"Hmbown/CodeWhale","slug":"use-a-name-between-1-and-200-characters","errorCode":null,"errorMessage":"Use a name between 1 and 200 characters.","messagePattern":"Use a name between 1 and 200 characters\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"pet/src/ui/storage.ts","lineNumber":107,"sourceCode":"  }\n  private nextTime(previous?: string): string {\n    const last = previous ? Date.parse(previous) : 0;\n    return new Date(Math.max(Date.now(), Number.isFinite(last) ? last + 1 : 0)).toISOString();\n  }\n  async list(): Promise<SavedSummary[]> {\n    return this.transaction('readonly', (_traces, metas, done) => {\n      const req = metas.getAll();\n      req.onsuccess = () => done((req.result as SavedSummary[]).sort((a, b) => b.savedAt.localeCompare(a.savedAt)));\n    });\n  }\n  async getEntry(key: string): Promise<SavedTrace> {\n    return this.transaction('readonly', (traces, _metas, done, fail) => {\n      const req = traces.get(key); req.onsuccess = () => req.result ? done(req.result) : fail(missing());\n    });\n  }\n  async get(key: string): Promise<Trace> { return (await this.getEntry(key)).trace; }\n  async rename(expected: SavedReference, name: string): Promise<SavedReference> {\n    const trimmed = name.trim(); if (!trimmed || trimmed.length > 200) throw new Error('Use a name between 1 and 200 characters.');\n    return this.transaction('readwrite', (traces, metas, done, fail) => {\n      const req = traces.get(expected.key);\n      req.onsuccess = () => {\n        try {\n          if (!req.result) throw missing();\n          const item: SavedTrace = req.result;\n          if (item.savedAt !== expected.savedAt) throw changed();\n          item.trace.name = trimmed; item.savedAt = this.nextTime(item.savedAt);\n          traces.put(item); metas.put(summary(item)); done({ key: item.key, savedAt: item.savedAt });\n        } catch (e) { fail(e as Error); }\n      };\n    });\n  }\n  async delete(expected: SavedReference): Promise<void> {\n    await this.transaction<void>('readwrite', (traces, metas, done, fail) => {\n      const req = traces.get(expected.key);\n      req.onsuccess = () => {\n        if (req.result && req.result.savedAt !== expected.savedAt) { fail(changed()); return; }","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/433685b2024e7bc4c99e1e2e326bcad39b4d9d65/pet/src/ui/storage.ts#L89-L125","documentation":"The TraceStore rename() method validates the new name before performing the IndexedDB readwrite transaction: after trimming whitespace, the name must be 1-200 characters. It throws this plain Error to reject empty or oversized names rather than persisting an unusable label.","triggerScenarios":"Calling rename(savedReference, '') or a whitespace-only name ('   '), or any name whose trimmed length exceeds 200, e.g. a clipboard paste of a long document title.","commonSituations":"Users clearing the rename input entirely or pasting long text; callers forgetting that trimming happens first so a 201-char name with spaces still fails.","solutions":["Trim the name and check 1 <= trimmed.length <= 200 before calling rename.","Enforce a maxLength attribute or equivalent in the rename UI input.","Show a validation message when the user submits an empty or >200-char name."],"exampleFix":"// before\nawait store.rename(ref, userInput);\n// after\nconst name = userInput.trim();\nif (name.length === 0 || name.length > 200) throw new RangeError('name must be 1-200 chars');\nawait store.rename(ref, name);","handlingStrategy":"validation","validationCode":"function isValidTraceName(name) { const t = String(name ?? '').trim(); return t.length >= 1 && t.length <= 200; }\nif (!isValidTraceName(input)) showError('Use a name between 1 and 200 characters.');","typeGuard":"const isValidTraceName = (n: unknown): n is string => typeof n === 'string' && n.trim().length >= 1 && n.trim().length <= 200;","tryCatchPattern":null,"preventionTips":["Validate the trimmed length at the UI layer before calling rename.","Set input maxlength=200 in the rename field.","Treat whitespace-only input as empty and disable the submit button."],"tags":["validation","indexeddb","input-length"],"backgroundTag":"value-out-of-range","analyzedSha":"433685b2024e7bc4c99e1e2e326bcad39b4d9d65","analyzedAt":"2026-09-15T12:24:24.634Z","contentChangedAt":"2026-09-15T12:24:24.634Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}