diff --git a/packages/apps/algo-app/src/components/balloon/calc-balloon-position.ts b/packages/apps/algo-app/src/components/balloon/calc-balloon-position.ts index 233ea5bc11..9e11f567ab 100644 --- a/packages/apps/algo-app/src/components/balloon/calc-balloon-position.ts +++ b/packages/apps/algo-app/src/components/balloon/calc-balloon-position.ts @@ -11,7 +11,7 @@ export const calcBalloonPosition = ({ arrowDirection: NWES; balloonSize: RectSize; marginBetweenCardAndBalloon: number; -}>): ReadonlyRecord<'left' | 'top', `${number}px`> => +}>): Record<'left' | 'top', `${number}px`> => pipe( match(arrowDirection, { W: { diff --git a/packages/apps/algo-app/src/functions/get-card-direction.ts b/packages/apps/algo-app/src/functions/get-card-direction.ts index 16884e05ee..08a46076de 100644 --- a/packages/apps/algo-app/src/functions/get-card-direction.ts +++ b/packages/apps/algo-app/src/functions/get-card-direction.ts @@ -2,7 +2,7 @@ import type { Card, NWES } from '../types'; import { cardEq } from './card-eq'; export const getCardDirection = ( - playerCards: ReadonlyRecord>, + playerCards: Record>, target: Card ): NWES => playerCards.W.some((c) => cardEq(c, target)) diff --git a/packages/apps/algo-app/src/observables/position/card-positions.ts b/packages/apps/algo-app/src/observables/position/card-positions.ts index d5a392908f..7083239728 100644 --- a/packages/apps/algo-app/src/observables/position/card-positions.ts +++ b/packages/apps/algo-app/src/observables/position/card-positions.ts @@ -11,5 +11,5 @@ export const cardPositionsDispatcher = ( }; export const cardPositions$: InitializedObservable< - ReadonlyRecord> | undefined + Record> | undefined > = cardPositionsAction$.chain(scan(cardPositionsReducer, undefined)); diff --git a/packages/apps/algo-app/src/observables/position/player-name-position.ts b/packages/apps/algo-app/src/observables/position/player-name-position.ts index d3e6028eb3..57250efd6e 100644 --- a/packages/apps/algo-app/src/observables/position/player-name-position.ts +++ b/packages/apps/algo-app/src/observables/position/player-name-position.ts @@ -11,7 +11,7 @@ export const playerNamePositionsDispatcher = ( }; export const playerNamePositions$: InitializedObservable< - ReadonlyRecord | undefined + Record | undefined > = playerNamePositionsAction$.chain( scan(playerNamePositionsReducer, undefined) ); diff --git a/packages/apps/algo-app/src/state/reducers/card-positions-reducer.ts b/packages/apps/algo-app/src/state/reducers/card-positions-reducer.ts index 89e6d810e7..02550707e3 100644 --- a/packages/apps/algo-app/src/state/reducers/card-positions-reducer.ts +++ b/packages/apps/algo-app/src/state/reducers/card-positions-reducer.ts @@ -36,7 +36,7 @@ const initialState = (): Record> => ({ }); export const cardPositionsReducer: ReducerType< - ReadonlyRecord> | undefined, + Record> | undefined, readonly [CardColor, CardNumber, Rect] > = (state, [color, number, rect]) => produce(state === undefined ? initialState() : state, (draft) => { diff --git a/packages/apps/algo-app/src/state/reducers/player-name-positions-reducer.ts b/packages/apps/algo-app/src/state/reducers/player-name-positions-reducer.ts index 572e887524..ed9758f8bf 100644 --- a/packages/apps/algo-app/src/state/reducers/player-name-positions-reducer.ts +++ b/packages/apps/algo-app/src/state/reducers/player-name-positions-reducer.ts @@ -10,7 +10,7 @@ const initialState = (): Record => ({ }); export const playerNamePositionsReducer: ReducerType< - ReadonlyRecord | undefined, + Record | undefined, readonly [NWES, Rect] > = (state, [direction, rect]) => produce(state ?? initialState(), (draft) => { diff --git a/packages/apps/algo-app/src/types/display-values.ts b/packages/apps/algo-app/src/types/display-values.ts index 430e9f41fa..ba4a582986 100644 --- a/packages/apps/algo-app/src/types/display-values.ts +++ b/packages/apps/algo-app/src/types/display-values.ts @@ -2,7 +2,7 @@ import type { CardWithDisplayValue } from './card-type'; import type { NWES } from './direction'; export type DisplayValues = Readonly<{ - playerCards: ReadonlyRecord>; + playerCards: Record>; gameMessage: string; turnPlayer: NWES; endTurnButtonDisabled: boolean; diff --git a/packages/apps/blueprintjs-playground-styled/src/style-definitions/form/common.ts b/packages/apps/blueprintjs-playground-styled/src/style-definitions/form/common.ts index bb33fa5e1d..75603795a6 100644 --- a/packages/apps/blueprintjs-playground-styled/src/style-definitions/form/common.ts +++ b/packages/apps/blueprintjs-playground-styled/src/style-definitions/form/common.ts @@ -70,7 +70,7 @@ export const controlGroupStack = [ 'select-caret', ]; -export const controlGroupStackZIndex: ReadonlyRecord< +export const controlGroupStackZIndex: Record< typeof controlGroupStack[number], number > = Obj.fromEntries(controlGroupStack.map((key, index) => [key, index])); diff --git a/packages/apps/cant-stop-probability/src/types/count.ts b/packages/apps/cant-stop-probability/src/types/count.ts index 3fae163d7e..ee83413f6e 100644 --- a/packages/apps/cant-stop-probability/src/types/count.ts +++ b/packages/apps/cant-stop-probability/src/types/count.ts @@ -1 +1 @@ -export type Count = ReadonlyRecord<'noLine' | 'oneLine' | 'twoLine', number>; +export type Count = Record<'noLine' | 'oneLine' | 'twoLine', number>; diff --git a/packages/apps/event-schedule-app-shared/src/v3/types/record/answer-symbols.ts b/packages/apps/event-schedule-app-shared/src/v3/types/record/answer-symbols.ts index 6008c3b88c..e48994f694 100644 --- a/packages/apps/event-schedule-app-shared/src/v3/types/record/answer-symbols.ts +++ b/packages/apps/event-schedule-app-shared/src/v3/types/record/answer-symbols.ts @@ -2,7 +2,7 @@ import type { AnswerSymbolId } from '../enum'; import type { SymbolSetting } from './base'; import { fillSymbolSetting } from './base'; -export type SymbolSettings = ReadonlyRecord; +export type SymbolSettings = Record; export type PartialSymbolSettings = DeepPartial; diff --git a/packages/apps/event-schedule-app-shared/src/v4/types/record/answer-icon-settings.ts b/packages/apps/event-schedule-app-shared/src/v4/types/record/answer-icon-settings.ts index 91ce2d7f67..e4e0edcfcb 100644 --- a/packages/apps/event-schedule-app-shared/src/v4/types/record/answer-icon-settings.ts +++ b/packages/apps/event-schedule-app-shared/src/v4/types/record/answer-icon-settings.ts @@ -2,10 +2,7 @@ import type { AnswerIconId } from '../enum'; import type { AnswerIconSetting } from './base'; import { fillAnswerIconSetting } from './base'; -export type AnswerIconSettings = ReadonlyRecord< - AnswerIconId, - AnswerIconSetting ->; +export type AnswerIconSettings = Record; export type PartialAnswerIconSettings = DeepPartial; diff --git a/packages/apps/event-schedule-app-shared/src/v6/types/record/answer-icon-settings.ts b/packages/apps/event-schedule-app-shared/src/v6/types/record/answer-icon-settings.ts index 9af278410f..515b37e373 100644 --- a/packages/apps/event-schedule-app-shared/src/v6/types/record/answer-icon-settings.ts +++ b/packages/apps/event-schedule-app-shared/src/v6/types/record/answer-icon-settings.ts @@ -3,10 +3,7 @@ import type { AnswerIconId } from '../enum'; import type { AnswerIconSetting } from './base'; import { fillAnswerIconSetting, isAnswerIconSetting } from './base'; -export type AnswerIconSettings = ReadonlyRecord< - AnswerIconId, - AnswerIconSetting ->; +export type AnswerIconSettings = Record; export const answerIconSettingsDefaultValue: AnswerIconSettings = { good: { description: '', point: 10 }, diff --git a/packages/apps/event-schedule-app-shared/src/v7/types/enum/datetime-specification-type.ts b/packages/apps/event-schedule-app-shared/src/v7/types/enum/datetime-specification-type.ts index 20cd9ce06c..f523c1fd20 100644 --- a/packages/apps/event-schedule-app-shared/src/v7/types/enum/datetime-specification-type.ts +++ b/packages/apps/event-schedule-app-shared/src/v7/types/enum/datetime-specification-type.ts @@ -27,6 +27,6 @@ export const isDatetimeSpecificationEnumType = datetimeSpecificationTypeDef.is; assertType< TypeExtends< typeof datetimeSpecificationOptions, - ReadonlyRecord + Record > >(); diff --git a/packages/apps/event-schedule-app-shared/src/v7/types/record/answer-icon-settings.test.ts b/packages/apps/event-schedule-app-shared/src/v7/types/record/answer-icon-settings.test.ts index 469f2d7183..0902aca76c 100644 --- a/packages/apps/event-schedule-app-shared/src/v7/types/record/answer-icon-settings.test.ts +++ b/packages/apps/event-schedule-app-shared/src/v7/types/record/answer-icon-settings.test.ts @@ -10,7 +10,7 @@ import type { AnswerIconSetting } from './base'; describe('AnswerIconSettings', () => { assertType< - TypeEq> + TypeEq> >(); test('defaultValue', () => { diff --git a/packages/apps/event-schedule-app/src/components/bp/constants/form/common.ts b/packages/apps/event-schedule-app/src/components/bp/constants/form/common.ts index bb33fa5e1d..75603795a6 100644 --- a/packages/apps/event-schedule-app/src/components/bp/constants/form/common.ts +++ b/packages/apps/event-schedule-app/src/components/bp/constants/form/common.ts @@ -70,7 +70,7 @@ export const controlGroupStack = [ 'select-caret', ]; -export const controlGroupStackZIndex: ReadonlyRecord< +export const controlGroupStackZIndex: Record< typeof controlGroupStack[number], number > = Obj.fromEntries(controlGroupStack.map((key, index) => [key, index])); diff --git a/packages/apps/event-schedule-app/src/env.ts b/packages/apps/event-schedule-app/src/env.ts index de025eaacd..622786aab8 100644 --- a/packages/apps/event-schedule-app/src/env.ts +++ b/packages/apps/event-schedule-app/src/env.ts @@ -4,8 +4,5 @@ export const isDevelopment = process.env.NODE_ENV === 'development'; export const experimentalFeature = {} as const; assertType< - TypeExtends< - typeof experimentalFeature, - ReadonlyRecord - > + TypeExtends> >(); diff --git a/packages/apps/event-schedule-app/src/functions/event-settings-page-diff.ts b/packages/apps/event-schedule-app/src/functions/event-settings-page-diff.ts index 6db223423f..7e5ea8c357 100644 --- a/packages/apps/event-schedule-app/src/functions/event-settings-page-diff.ts +++ b/packages/apps/event-schedule-app/src/functions/event-settings-page-diff.ts @@ -165,7 +165,7 @@ const datetimeRange2str = ( const datetimeRangeListDiff = ( a: Pick, b: Pick -): ReadonlyRecord<'added' | 'deleted', readonly string[]> | undefined => { +): Record<'added' | 'deleted', readonly string[]> | undefined => { const setA = ISetMapped.new( a.datetimeRangeList, datetimeRangeToMapKey, diff --git a/packages/apps/event-schedule-app/src/functions/local-storage.ts b/packages/apps/event-schedule-app/src/functions/local-storage.ts index d3fd13169c..11df7d7743 100644 --- a/packages/apps/event-schedule-app/src/functions/local-storage.ts +++ b/packages/apps/event-schedule-app/src/functions/local-storage.ts @@ -21,7 +21,7 @@ export namespace EventScheduleAppLocalStorage { createEventPage: EventSchedule; }>; - type StoreKeys = ReadonlyRecord; + type StoreKeys = Record; const keys: StoreKeys = { createEventPage: attachSuffix('createEventPage'), diff --git a/packages/apps/event-schedule-app/src/utils/to-css-classnames.ts b/packages/apps/event-schedule-app/src/utils/to-css-classnames.ts index fa38e26613..f769146a5e 100644 --- a/packages/apps/event-schedule-app/src/utils/to-css-classnames.ts +++ b/packages/apps/event-schedule-app/src/utils/to-css-classnames.ts @@ -1,4 +1,4 @@ -export const toClassName = (flags: ReadonlyRecord): string => +export const toClassName = (flags: Record): string => Obj.entries(flags) .filter(([_k, v]) => v) .map(([k, _v]) => k) diff --git a/packages/apps/poll-discord-app/src/discord/reaction.ts b/packages/apps/poll-discord-app/src/discord/reaction.ts index 0f301ec5cd..20ae2611d6 100644 --- a/packages/apps/poll-discord-app/src/discord/reaction.ts +++ b/packages/apps/poll-discord-app/src/discord/reaction.ts @@ -48,11 +48,7 @@ const onRefreshClick = async ( if (result.some(Result.isErr)) { return Result.err( Result.unwrapThrow( - Json.stringify( - result.map((a) => a.value) as ReadonlyJSONValue, - undefined, - 2 - ) + Json.stringify(result.map((a) => a.value) as JSONValue, undefined, 2) ) ); } diff --git a/packages/apps/poll-discord-app/src/in-memory-database.ts b/packages/apps/poll-discord-app/src/in-memory-database.ts index a3f1018ee4..8133448a61 100644 --- a/packages/apps/poll-discord-app/src/in-memory-database.ts +++ b/packages/apps/poll-discord-app/src/in-memory-database.ts @@ -24,7 +24,7 @@ export const addPoll = ( psqlClient: PsqlClient, poll: Poll, messageId: CommandMessageId -): Promise> => +): Promise> => setDatabase( ref, psqlClient, @@ -54,7 +54,7 @@ export const updatePoll = ( ref: DatabaseRef, psqlClient: PsqlClient, poll: Poll -): Promise> => +): Promise> => setDatabase( ref, psqlClient, @@ -133,7 +133,7 @@ const setDatabase = ( mut_ref: DatabaseMutRef, psqlClient: DeepReadonly, next: Database -): Promise> => { +): Promise> => { mut_ref.db = next; return psql.setJsonData(psqlClient, databaseToJson(next)); }; diff --git a/packages/apps/poll-discord-app/src/log.ts b/packages/apps/poll-discord-app/src/log.ts index c51ede5f25..0c73b9067c 100644 --- a/packages/apps/poll-discord-app/src/log.ts +++ b/packages/apps/poll-discord-app/src/log.ts @@ -1,7 +1,4 @@ -export const log = ( - value: ReadonlyJSONValue, - prettyPrint: boolean = true -): void => { +export const log = (value: JSONValue, prettyPrint: boolean = true): void => { console.log( Result.unwrapThrow( Json.stringify(value, undefined, prettyPrint ? 2 : undefined) diff --git a/packages/apps/poll-discord-app/src/postgre-sql.ts b/packages/apps/poll-discord-app/src/postgre-sql.ts index 84a0548127..9cecef1b7f 100644 --- a/packages/apps/poll-discord-app/src/postgre-sql.ts +++ b/packages/apps/poll-discord-app/src/postgre-sql.ts @@ -39,8 +39,8 @@ export namespace psql { export const setJsonData = ( psqlClient: PsqlClient, - jsonData: ReadonlyJSONType - ): Promise> => { + jsonData: JSONType + ): Promise> => { const query = `update ${psqlTableName} SET ${ psqlRowType.data } = '${Result.unwrapThrow(Json.stringify(jsonData))}', ${ @@ -49,7 +49,7 @@ export namespace psql { return new Promise((resolve) => { psqlClient.query(query, (error) => { if (toBoolean(error)) { - resolve(Result.err(error as unknown as ReadonlyJSONValue)); + resolve(Result.err(error as unknown as JSONValue)); } else { resolve(Result.ok(undefined)); } diff --git a/packages/apps/poll-discord-app/src/types/answer-of-date.ts b/packages/apps/poll-discord-app/src/types/answer-of-date.ts index 48b9d31c00..49d4141f1d 100644 --- a/packages/apps/poll-discord-app/src/types/answer-of-date.ts +++ b/packages/apps/poll-discord-app/src/types/answer-of-date.ts @@ -13,7 +13,7 @@ export type AnswerOfDateJson = DeepReadonly<{ poor: string[]; }>; -assertType>(); +assertType>(); export const answerOfDateDefaultValue: AnswerOfDate = { good: ISet.new([]), diff --git a/packages/apps/poll-discord-app/src/types/database.ts b/packages/apps/poll-discord-app/src/types/database.ts index a4109fa1ad..da11f8c2b5 100644 --- a/packages/apps/poll-discord-app/src/types/database.ts +++ b/packages/apps/poll-discord-app/src/types/database.ts @@ -20,7 +20,7 @@ export type DatabaseJson = DeepReadonly<{ commandMessageIdToPollIdMap: Record; }>; -assertType>(); +assertType>(); export const databaseDefaultValue: Database = { polls: IMap.new([]), diff --git a/packages/apps/poll-discord-app/src/types/poll.ts b/packages/apps/poll-discord-app/src/types/poll.ts index 954e07fdfd..b494e40a24 100644 --- a/packages/apps/poll-discord-app/src/types/poll.ts +++ b/packages/apps/poll-discord-app/src/types/poll.ts @@ -30,7 +30,7 @@ export type PollJson = DeepReadonly<{ titleMessageId: TitleMessageId; }>; -assertType>(); +assertType>(); const pollDefaultValue: Poll = { id: createPollId(''), diff --git a/packages/utils/io-ts/src/combination.test.ts b/packages/utils/io-ts/src/combination.test.ts index e9252647b7..157c71a4ea 100644 --- a/packages/utils/io-ts/src/combination.test.ts +++ b/packages/utils/io-ts/src/combination.test.ts @@ -35,7 +35,7 @@ describe('nested record', () => { describe('is', () => { test('truthy case', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { xs: [1, 2, 3], rec: { a: 1, @@ -47,14 +47,14 @@ describe('nested record', () => { if (nestedRecord.is(x)) { assertType>(); } else { - assertType>(); + assertType>(); } expect(nestedRecord.is(x)).toBe(true); }); test('falsy case', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { xs: [-1, 2.2, 3.3], rec: { a: 123, @@ -66,7 +66,7 @@ describe('nested record', () => { if (nestedRecord.is(x)) { assertType>(); } else { - assertType>(); + assertType>(); } expect(nestedRecord.is(x)).toBe(false); @@ -75,7 +75,7 @@ describe('nested record', () => { describe('validate', () => { test('falsy case', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { xs: [-1, 2.2, 3.3], rec: { a: 123, @@ -94,7 +94,7 @@ describe('nested record', () => { describe('fill', () => { test('from an empty record', () => { - const x: ReadonlyRecordBase = {}; + const x: RecordBase = {}; expect(nestedRecord.fill(x)).toStrictEqual({ xs: [], @@ -107,7 +107,7 @@ describe('nested record', () => { }); test('from a filled record', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { xs: [-1, 2.2, 3.3], rec: { a: 123, @@ -127,7 +127,7 @@ describe('nested record', () => { }); test('from a partial record', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { xs: [11, 22], rec: { a: 3, @@ -145,7 +145,7 @@ describe('nested record', () => { }); test('from a partial record with excess property', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { xs: [11, 22], rec: { a: 3, diff --git a/packages/utils/io-ts/src/record/key-value-record.test.ts b/packages/utils/io-ts/src/record/key-value-record.test.ts index 6fcaff8406..862278a55b 100644 --- a/packages/utils/io-ts/src/record/key-value-record.test.ts +++ b/packages/utils/io-ts/src/record/key-value-record.test.ts @@ -14,7 +14,7 @@ describe('keyValueRecord', () => { describe('is', () => { test('truthy case', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, month: 12, date: 12, @@ -23,14 +23,14 @@ describe('keyValueRecord', () => { if (strNumRecord.is(x)) { assertType>(); } else { - assertType>(); + assertType>(); } expect(strNumRecord.is(x)).toBe(true); }); test('falsy case', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, month: 'ab', date: 'cd', @@ -39,7 +39,7 @@ describe('keyValueRecord', () => { if (strNumRecord.is(x)) { assertType>(); } else { - assertType>(); + assertType>(); } expect(strNumRecord.is(x)).toBe(false); @@ -48,7 +48,7 @@ describe('keyValueRecord', () => { describe('validate', () => { test('falsy case', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, month: 'ab', date: 'cd', @@ -63,13 +63,13 @@ describe('keyValueRecord', () => { describe('fill', () => { test('from an empty record', () => { - const x: ReadonlyRecordBase = {}; + const x: RecordBase = {}; expect(strNumRecord.fill(x)).toStrictEqual({}); }); test('from a filled record', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, month: 999, date: 999, @@ -83,7 +83,7 @@ describe('keyValueRecord', () => { }); test('from a record with wrong value', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, month: '12', }; diff --git a/packages/utils/io-ts/src/record/record.test.ts b/packages/utils/io-ts/src/record/record.test.ts index 22d2fe09e3..1268d4ccac 100644 --- a/packages/utils/io-ts/src/record/record.test.ts +++ b/packages/utils/io-ts/src/record/record.test.ts @@ -20,7 +20,7 @@ describe('record', () => { describe('is', () => { test('truthy case', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, month: 12, date: 12, @@ -29,14 +29,14 @@ describe('record', () => { if (ymd.is(x)) { assertType>(); } else { - assertType>(); + assertType>(); } expect(ymd.is(x)).toBe(true); }); test('falsy case', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, month: 'ab', date: 'cd', @@ -45,7 +45,7 @@ describe('record', () => { if (ymd.is(x)) { assertType>(); } else { - assertType>(); + assertType>(); } expect(ymd.is(x)).toBe(false); @@ -54,7 +54,7 @@ describe('record', () => { describe('validate', () => { test('falsy case', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, month: 'ab', date: 'cd', @@ -69,7 +69,7 @@ describe('record', () => { describe('fill', () => { test('from an empty record', () => { - const x: ReadonlyRecordBase = {}; + const x: RecordBase = {}; expect(ymd.fill(x)).toStrictEqual({ year: 1900, @@ -79,7 +79,7 @@ describe('record', () => { }); test('from a filled record', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, month: 999, date: 999, @@ -93,7 +93,7 @@ describe('record', () => { }); test('from a partial record', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, }; @@ -105,7 +105,7 @@ describe('record', () => { }); test('from a partial record with excess property', () => { - const x: ReadonlyRecordBase = { + const x: RecordBase = { year: 2000, aaaaa: 9999, }; diff --git a/packages/utils/io-ts/src/record/record.ts b/packages/utils/io-ts/src/record/record.ts index f87d0428f6..502f389b1c 100644 --- a/packages/utils/io-ts/src/record/record.ts +++ b/packages/utils/io-ts/src/record/record.ts @@ -6,10 +6,11 @@ import { validationErrorMessage, } from '../utils'; -type RecordResultType>> = - Readonly<{ [key in keyof A]: TypeOf }>; +type RecordResultType>> = Readonly<{ + [key in keyof A]: TypeOf; +}>; -export const record = >>( +export const record = >>( recordType: A, typeName?: string ): Type> => { diff --git a/packages/utils/stdlib/memo.md b/packages/utils/stdlib/memo.md index 8219f75c66..44654be0a1 100644 --- a/packages/utils/stdlib/memo.md +++ b/packages/utils/stdlib/memo.md @@ -8,8 +8,7 @@ - `eslint --fix` で `readonly` を追加 - `any[]` -> `never[]` - `declare var` -> `declare const` - +- use `JSONValue` in `JSON.parse` --> - 手動修正 - `readonly` 削除 - `Partial` diff --git a/packages/utils/tiny-router-preact-hooks/src/use-router-link-click.ts b/packages/utils/tiny-router-preact-hooks/src/use-router-link-click.ts index e61e51e83e..905181fb80 100644 --- a/packages/utils/tiny-router-preact-hooks/src/use-router-link-click.ts +++ b/packages/utils/tiny-router-preact-hooks/src/use-router-link-click.ts @@ -1,7 +1,7 @@ import { useCallback } from 'preact/hooks'; const isModifiedEvent = ( - ev: ReadonlyRecord<'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey', boolean> + ev: Record<'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey', boolean> ): boolean => ev.metaKey || ev.altKey || ev.ctrlKey || ev.shiftKey; type Path = Readonly<{ diff --git a/packages/utils/tiny-router-react-hooks/src/use-router-link-click.ts b/packages/utils/tiny-router-react-hooks/src/use-router-link-click.ts index 871bab4a61..7b407d2974 100644 --- a/packages/utils/tiny-router-react-hooks/src/use-router-link-click.ts +++ b/packages/utils/tiny-router-react-hooks/src/use-router-link-click.ts @@ -1,7 +1,7 @@ import { useCallback } from 'react'; const isModifiedEvent = ( - ev: ReadonlyRecord<'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey', boolean> + ev: Record<'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey', boolean> ): boolean => ev.metaKey || ev.altKey || ev.ctrlKey || ev.shiftKey; type Path = Readonly<{ diff --git a/packages/utils/ts-type-utils/src/record-path.ts b/packages/utils/ts-type-utils/src/record-path.ts index 95a0b23aa8..406a9eb39b 100644 --- a/packages/utils/ts-type-utils/src/record-path.ts +++ b/packages/utils/ts-type-utils/src/record-path.ts @@ -2,7 +2,7 @@ import type { IndexOfTuple } from './index-of-tuple'; import type { IsNotFixedLengthList } from './is-fixed-length-list'; import type { ToNumber } from './to-number'; import type { Tuple } from './tuple'; -import type { ReadonlyRecordBase } from './utils'; +import type { RecordBase } from './utils'; export type PathsWithIndex = Prefixes>; export type Paths = Prefixes>; @@ -26,7 +26,7 @@ export type KeyPathAndValueTypeAtPathTuple = AttachValueTypeAtPath< export type LeafPaths = R extends readonly unknown[] ? LeafPathsImplListCase - : R extends ReadonlyRecordBase + : R extends RecordBase ? LeafPathsImplRecordCase : readonly []; @@ -46,7 +46,7 @@ type LeafPathsImplListCase< /** @internal */ type LeafPathsImplRecordCase< - R extends ReadonlyRecordBase, + R extends RecordBase, PathHead extends keyof R = keyof R > = string extends PathHead ? readonly [] @@ -56,7 +56,7 @@ type LeafPathsImplRecordCase< export type LeafPathsWithIndex = R extends readonly unknown[] ? _LeafPathsWithIndexImplListCase - : R extends ReadonlyRecordBase + : R extends RecordBase ? LeafPathsWithIndexImplRecordCase : readonly []; @@ -76,7 +76,7 @@ type _LeafPathsWithIndexImplListCase< /** @internal */ type LeafPathsWithIndexImplRecordCase< - R extends ReadonlyRecordBase, + R extends RecordBase, PathHead extends keyof R = keyof R > = PathHead extends keyof R ? readonly [PathHead, ...LeafPathsWithIndex] @@ -90,13 +90,13 @@ export type RecordUpdated< ? ValueAfter : R extends readonly unknown[] ? RecordUpdatedImplTupleCase - : R extends ReadonlyRecordBase + : R extends RecordBase ? RecordUpdatedImplRecordCase : R; /** @internal */ type RecordUpdatedImplRecordCase< - R extends ReadonlyRecordBase, + R extends RecordBase, Path extends Paths, ValueAfter > = Path extends readonly [infer Head, ...infer Rest] diff --git a/packages/utils/ts-type-utils/src/utils.ts b/packages/utils/ts-type-utils/src/utils.ts index 1496386ce3..b5b51e4250 100644 --- a/packages/utils/ts-type-utils/src/utils.ts +++ b/packages/utils/ts-type-utils/src/utils.ts @@ -34,29 +34,29 @@ export type Primitive = /* JSONValue */ -export type JSONValue = - | JSONValue[] +export type MutableJSONValue = + | MutableJSONValue[] | boolean | number | string | { - [K in string]?: JSONValue; + [K in string]?: MutableJSONValue; } | null; -export type ReadonlyJSONValue = +export type JSONValue = | boolean | number | string - | readonly ReadonlyJSONValue[] + | readonly JSONValue[] | { - readonly [K in string]?: ReadonlyJSONValue; + readonly [K in string]?: JSONValue; } | null; -export type ReadonlyJSONType = ReadonlyRecord; +export type JSONType = Record; -export type JSONType = ReadonlyRecord; +export type MutableJSONType = MutableRecord; /* Other Utilities */ @@ -81,9 +81,11 @@ export type Writable = { -readonly [P in keyof T]: T[P] }; export type RecordKeyType = keyof never; -export type ReadonlyRecord = Readonly>; +export type MutableRecord = { + [P in K]: V; +}; -export type ReadonlyRecordBase = ReadonlyRecord; +export type RecordBase = Record; export type FunctionType = (value: A) => B; diff --git a/packages/utils/ts-utils/src/collections/iset-mapped.ts b/packages/utils/ts-utils/src/collections/iset-mapped.ts index 5a359c4b7d..a38159e259 100644 --- a/packages/utils/ts-utils/src/collections/iset-mapped.ts +++ b/packages/utils/ts-utils/src/collections/iset-mapped.ts @@ -72,7 +72,7 @@ export const ISetMapped = { diff: ( oldSet: ISetMapped, newSet: ISetMapped - ): ReadonlyRecord<'added' | 'deleted', ISetMapped> => ({ + ): Record<'added' | 'deleted', ISetMapped> => ({ deleted: oldSet.subtract(newSet), added: newSet.subtract(oldSet), }), diff --git a/packages/utils/ts-utils/src/collections/iset.ts b/packages/utils/ts-utils/src/collections/iset.ts index 6460c25041..90d4389231 100644 --- a/packages/utils/ts-utils/src/collections/iset.ts +++ b/packages/utils/ts-utils/src/collections/iset.ts @@ -70,7 +70,7 @@ export const ISet = { diff: ( oldSet: ISet, newSet: ISet - ): ReadonlyRecord<'added' | 'deleted', ISet> => ({ + ): Record<'added' | 'deleted', ISet> => ({ deleted: oldSet.subtract(newSet), added: newSet.subtract(oldSet), }), diff --git a/packages/utils/ts-utils/src/functional/match.ts b/packages/utils/ts-utils/src/functional/match.ts index 599173cd32..559e131995 100644 --- a/packages/utils/ts-utils/src/functional/match.ts +++ b/packages/utils/ts-utils/src/functional/match.ts @@ -16,18 +16,18 @@ assertType, true>>(); export function match( switchCase: Case, - cases: ReadonlyRecord + cases: Record ): IsLiteralType extends true ? V : V | undefined; export function match( switchCase: Case, - cases: ReadonlyRecord, + cases: Record, defaultCase: V ): V; export function match( switchCase: Case, - cases: ReadonlyRecord, + cases: Record, defaultCase?: V ): V | undefined { return hasKey(cases, switchCase) ? cases[switchCase] : defaultCase; diff --git a/packages/utils/ts-utils/src/guard/has-key-value.ts b/packages/utils/ts-utils/src/guard/has-key-value.ts index c3c65c0039..f9444ef654 100644 --- a/packages/utils/ts-utils/src/guard/has-key-value.ts +++ b/packages/utils/ts-utils/src/guard/has-key-value.ts @@ -5,6 +5,6 @@ export const hasKeyValue = ( obj: object, key: K, valueChecker: (v: unknown) => v is V -): obj is ReadonlyRecord => +): obj is Record => // eslint-disable-next-line no-prototype-builtins hasKey(obj, key) && valueChecker(obj[key]); diff --git a/packages/utils/ts-utils/src/guard/has-key.ts b/packages/utils/ts-utils/src/guard/has-key.ts index 44498dfa43..922d24018b 100644 --- a/packages/utils/ts-utils/src/guard/has-key.ts +++ b/packages/utils/ts-utils/src/guard/has-key.ts @@ -2,6 +2,6 @@ export const hasKey = ( // eslint-disable-next-line @typescript-eslint/ban-types obj: object, key: K -): obj is ReadonlyRecord => +): obj is Record => // eslint-disable-next-line prefer-object-has-own, no-restricted-syntax Object.prototype.hasOwnProperty.call(obj, key); diff --git a/packages/utils/ts-utils/src/json/json.ts b/packages/utils/ts-utils/src/json/json.ts index dd800b4e9f..47e438f8fd 100644 --- a/packages/utils/ts-utils/src/json/json.ts +++ b/packages/utils/ts-utils/src/json/json.ts @@ -13,7 +13,7 @@ export namespace Json { */ export const parse = ( text: string, - reviver?: (this: unknown, key: string, value: ReadonlyJSONValue) => unknown + reviver?: (this: unknown, key: string, value: JSONValue) => unknown ): Result => { try { return Result.ok( @@ -71,7 +71,7 @@ export namespace Json { }; export const stringifySortedKey = ( - value: ReadonlyRecordBase, + value: RecordBase, space?: number | string ): Result => { const allKeys = pipe(keysDeep(value)) @@ -83,7 +83,7 @@ export namespace Json { } const keysDeepImpl = ( - obj: ReadonlyRecordBase, + obj: RecordBase, // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types mut_keys: string[] ): void => { @@ -104,7 +104,7 @@ const keysDeepImpl = ( } }; -const keysDeep = (obj: ReadonlyRecordBase): readonly string[] => { +const keysDeep = (obj: RecordBase): readonly string[] => { const mut_keys: string[] = []; keysDeepImpl(obj, mut_keys); return mut_keys; diff --git a/packages/utils/ts-utils/src/record/record-utils.ts b/packages/utils/ts-utils/src/record/record-utils.ts index b0d9f18b3b..0c34d971b2 100644 --- a/packages/utils/ts-utils/src/record/record-utils.ts +++ b/packages/utils/ts-utils/src/record/record-utils.ts @@ -1,23 +1,23 @@ export namespace RecordUtils { - export const get = ( + export const get = ( record: R, key: K ): R[K] => record[key]; - export const set = ( + export const set = ( record: R, key: K, newValue: R[K] ): R => ({ ...record, [key]: newValue }); - export const update = ( + export const update = ( record: R, key: K, updater: (prev: R[K]) => R[K] ): R => ({ ...record, [key]: updater(record[key]) }); const UNSAFE_getIn_impl = ( - obj: ReadonlyRecordBase, + obj: RecordBase, keyPath: readonly (number | string)[], index: number ): unknown => @@ -25,12 +25,12 @@ export namespace RecordUtils { ? obj : UNSAFE_getIn_impl( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - obj[keyPath[index]!] as ReadonlyRecordBase, + obj[keyPath[index]!] as RecordBase, keyPath, index + 1 ); - export const getIn = >( + export const getIn = >( record: R, keyPath: Path ): RecordValueAtPath => @@ -41,7 +41,7 @@ export namespace RecordUtils { ) as RecordValueAtPath; const UNSAFE_updateIn_impl = ( - obj: ReadonlyRecordBase, + obj: RecordBase, keyPath: readonly (number | string)[], index: number, updater: (prev: unknown) => unknown @@ -55,7 +55,7 @@ export namespace RecordUtils { i === keyPath[index] ? UNSAFE_updateIn_impl( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - obj[keyPath[index]!] as ReadonlyRecordBase, + obj[keyPath[index]!] as RecordBase, keyPath, index + 1, updater @@ -67,14 +67,14 @@ export namespace RecordUtils { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion [keyPath[index]!]: UNSAFE_updateIn_impl( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - obj[keyPath[index]!] as ReadonlyRecordBase, + obj[keyPath[index]!] as RecordBase, keyPath, index + 1, updater ), }; - export const setIn = ( + export const setIn = ( record: R, ...[keyPath, newValue]: KeyPathAndValueTypeAtPathTuple ): R => @@ -85,7 +85,7 @@ export namespace RecordUtils { () => newValue ) as R; - export const updateIn = >( + export const updateIn = >( record: R, keyPath: IsUnion extends true ? never : Path, updater: IsUnion extends true @@ -99,10 +99,7 @@ export namespace RecordUtils { updater as (prev: unknown) => unknown ) as R; - export const removeProperties = < - R extends ReadonlyRecordBase, - K extends keyof R - >( + export const removeProperties = ( record: R, // eslint-disable-next-line @typescript-eslint/no-shadow keys: readonly K[] @@ -122,10 +119,7 @@ export namespace RecordUtils { * If `record1` and `record2` share some properties, * `record2` value have priority. */ - export const merge = < - R1 extends ReadonlyRecordBase, - R2 extends ReadonlyRecordBase - >( + export const merge = ( record1: R1, record2: R2 ): Readonly<{ @@ -149,14 +143,14 @@ export namespace RecordUtils { * const keys2 = RecordUtil.keys({ x: 1, y: 2, z: '3', 3: 4 }); // ('3' | 'x' | 'y' | 'z')[] * ``` */ - export const keys = ( + export const keys = ( object: R ): ToObjectKeysValue[] => // eslint-disable-next-line no-restricted-syntax Object.keys(object) as ToObjectKeysValue[]; export const values = ( - object: ReadonlyRecord + object: Record ): readonly V[] => Object.values(object); /** @@ -180,9 +174,9 @@ export namespace RecordUtils { */ export const fromEntries = ( entries_: Iterable - ): ReadonlyRecord => + ): Record => // eslint-disable-next-line no-restricted-syntax - Object.fromEntries(entries_) as ReadonlyRecord; + Object.fromEntries(entries_) as Record; /** * `Object.entries` の返り値型を改善したもの。 @@ -202,7 +196,7 @@ export namespace RecordUtils { * const entries2 = RecordUtil.entries(obj); // (['3', 4] | ['x', 1] | ['y' | 'z', 2])[] * ``` */ - export const entries = ( + export const entries = ( object: R // eslint-disable-next-line no-restricted-syntax ): Entries => Object.entries(object) as Entries; @@ -210,7 +204,7 @@ export namespace RecordUtils { /** * @internal */ - export type Entries = R extends R + export type Entries = R extends R ? readonly { readonly [K in keyof R]: readonly [ ToObjectKeysValue>, @@ -220,53 +214,45 @@ export namespace RecordUtils { }[RelaxedExclude][] : never; - export function hasKey( + export function hasKey( rec: R, key: K - ): rec is R & ReadonlyRecord; + ): rec is R & Record; - export function hasKey( + export function hasKey( rec: R, key: K - ): rec is R & ReadonlyRecord; + ): rec is R & Record; - export function hasKey( + export function hasKey( rec: R, key: K - ): rec is R & ReadonlyRecord { + ): rec is R & Record { // eslint-disable-next-line prefer-object-has-own, no-restricted-syntax return Object.prototype.hasOwnProperty.call(rec, key); } export function hasKeyValue< - R extends ReadonlyRecordBase, + R extends RecordBase, K extends keyof R, V extends R[K] - >( - rec: R, - key: K, - valueChecker: (v: R[K]) => v is V - ): rec is R & ReadonlyRecord; + >(rec: R, key: K, valueChecker: (v: R[K]) => v is V): rec is R & Record; export function hasKeyValue< - R extends ReadonlyRecordBase, + R extends RecordBase, K extends PropertyKey, V extends R[K] - >( - rec: R, - key: K, - valueChecker: (v: R[K]) => v is V - ): rec is R & ReadonlyRecord; + >(rec: R, key: K, valueChecker: (v: R[K]) => v is V): rec is R & Record; export function hasKeyValue< - R extends ReadonlyRecordBase, + R extends RecordBase, K extends PropertyKey, V extends R[K] >( rec: R, key: K, valueChecker: (v: R[K]) => v is V - ): rec is R & ReadonlyRecord { + ): rec is R & Record { return hasKey(rec, key) && valueChecker(rec[key]); } }