diff --git a/packages/compiler/src/experimental/index.ts b/packages/compiler/src/experimental/index.ts index 9a35385b2aa..fd27d83085d 100644 --- a/packages/compiler/src/experimental/index.ts +++ b/packages/compiler/src/experimental/index.ts @@ -1,5 +1,7 @@ export { MutableType as unsafe_MutableType, + mutateSubgraph as unsafe_mutateSubgraph, + mutateSubgraphWithNamespace as unsafe_mutateSubgraphWithNamespace, Mutator as unsafe_Mutator, MutatorFilterFn as unsafe_MutatorFilterFn, MutatorFlow as unsafe_MutatorFlow, @@ -7,8 +9,12 @@ export { MutatorRecord as unsafe_MutatorRecord, MutatorReplaceFn as unsafe_MutatorReplaceFn, MutatorWithNamespace as unsafe_MutatorWithNamespace, - mutateSubgraph as unsafe_mutateSubgraph, - mutateSubgraphWithNamespace as unsafe_mutateSubgraphWithNamespace, } from "./mutators.js"; export { Realm as unsafe_Realm } from "./realm.js"; export { $ as unsafe_$ } from "./typekit/index.js"; + +import { useStateMap, useStateSet } from "../utils/state-accessor.js"; +/** @deprecated use `useStateMap` from `@typespec/compiler/utils` instead */ +export const unsafe_useStateMap = useStateMap; +/** @deprecated use `useStateSet` from `@typespec/compiler/utils` instead */ +export const unsafe_useStateSet = useStateSet; diff --git a/packages/compiler/src/lib/decorators.ts b/packages/compiler/src/lib/decorators.ts index 2ef7a0ce546..b886ca14dc8 100644 --- a/packages/compiler/src/lib/decorators.ts +++ b/packages/compiler/src/lib/decorators.ts @@ -98,8 +98,8 @@ import { UnionVariant, Value, } from "../core/types.js"; -import { setKey } from "./key.js"; import { useStateMap, useStateSet } from "../utils/index.js"; +import { setKey } from "./key.js"; export { $encodedName, resolveEncodedName } from "./encoded-names.js"; export { serializeValueAsJson } from "./examples.js"; @@ -395,7 +395,9 @@ export const $format: FormatDecorator = ( export { getFormat }; // -- @pattern decorator --------------------- -const [getPatternData, setPatternData] = useStateMap(createStateSymbol("patternValues")); +const [getPatternData, setPatternData] = useStateMap( + createStateSymbol("patternValues"), +); export interface PatternData { readonly pattern: string; @@ -690,7 +692,9 @@ export interface EncodeData { type: Scalar; } -const [getEncode, setEncodeData] = useStateMap(createStateSymbol("encode")); +const [getEncode, setEncodeData] = useStateMap( + createStateSymbol("encode"), +); export const $encode: EncodeDecorator = ( context: DecoratorContext, target: Scalar | ModelProperty, @@ -943,7 +947,9 @@ export function getAllTags( // -- @friendlyName decorator --------------------- -const [getFriendlyName, setFriendlyName] = useStateMap(createStateSymbol("friendlyNames")); +const [getFriendlyName, setFriendlyName] = useStateMap( + createStateSymbol("friendlyNames"), +); export const $friendlyName: FriendlyNameDecorator = ( context: DecoratorContext, target: Type, @@ -1100,7 +1106,9 @@ export function getDeprecated(program: Program, type: Type): string | undefined return getDeprecationDetails(program, type)?.message; } -const [getOverloads, setOverloads] = useStateMap(createStateSymbol("overloadedByKey")); +const [getOverloads, setOverloads] = useStateMap( + createStateSymbol("overloadedByKey"), +); const [getOverloadedOperation, setOverloadBase] = useStateMap( createStateSymbol("overloadsOperation"), ); @@ -1334,7 +1342,9 @@ export function getExamples( return getExamplesState(program, target) ?? []; } -const [getOpExamplesState, setOpExamples] = useStateMap(createStateSymbol("opExamples")); +const [getOpExamplesState, setOpExamples] = useStateMap( + createStateSymbol("opExamples"), +); export const $opExample: OpExampleDecorator = ( context: DecoratorContext, target: Operation, diff --git a/packages/compiler/src/lib/visibility.ts b/packages/compiler/src/lib/visibility.ts index 7c0b03f4b3d..2f31c37af43 100644 --- a/packages/compiler/src/lib/visibility.ts +++ b/packages/compiler/src/lib/visibility.ts @@ -49,9 +49,9 @@ import { normalizeVisibilityToLegacyLifecycleString, } from "../core/visibility/lifecycle.js"; import { isMutableType, mutateSubgraph, Mutator, MutatorFlow } from "../experimental/mutators.js"; +import { useStateMap } from "../utils/index.js"; import { isKey } from "./key.js"; import { filterModelPropertiesInPlace } from "./utils.js"; -import { useStateMap } from "../utils/index.js"; // #region Legacy Visibility Utilities diff --git a/packages/compiler/src/utils/index.ts b/packages/compiler/src/utils/index.ts index 7d85b73e1e5..2af3b409d38 100644 --- a/packages/compiler/src/utils/index.ts +++ b/packages/compiler/src/utils/index.ts @@ -3,5 +3,5 @@ // Be explicit about what get exported so we don't export utils that are not meant to be public. // --------------------------------------- export { DuplicateTracker } from "./duplicate-tracker.js"; -export { useStateMap, useStateSet } from "./state-accessor.js"; export { Queue, TwoLevelMap, createRekeyableMap, deepClone, deepEquals } from "./misc.js"; +export { useStateMap, useStateSet } from "./state-accessor.js"; diff --git a/packages/compiler/src/utils/state-accessor.ts b/packages/compiler/src/utils/state-accessor.ts index 2cc7e07ee37..7f7ddbe9963 100644 --- a/packages/compiler/src/utils/state-accessor.ts +++ b/packages/compiler/src/utils/state-accessor.ts @@ -18,9 +18,7 @@ export function useStateMap( type StateSetGetter = (program: Program, type: K) => boolean; type StateSetSetter = (program: Program, type: K) => void; -export function useStateSet( - key: symbol, -): [StateSetGetter, StateSetSetter] { +export function useStateSet(key: symbol): [StateSetGetter, StateSetSetter] { const getter = (program: Program, target: K) => program.stateSet(key).has(target); const setter = (program: Program, target: K) => program.stateSet(key).add(target); diff --git a/packages/events/src/decorators.ts b/packages/events/src/decorators.ts index 01122876494..834b707ddfa 100644 --- a/packages/events/src/decorators.ts +++ b/packages/events/src/decorators.ts @@ -1,11 +1,11 @@ import { type ModelProperty, type Union, type UnionVariant } from "@typespec/compiler"; +import { useStateMap, useStateSet } from "@typespec/compiler/utils"; import type { ContentTypeDecorator, DataDecorator, EventsDecorator, } from "../generated-defs/TypeSpec.Events.js"; import { EventsStateKeys } from "./lib.js"; -import { useStateMap, useStateSet } from "@typespec/compiler/utils"; const [isEvents, setEvents] = useStateSet(EventsStateKeys.events); diff --git a/packages/events/src/index.ts b/packages/events/src/index.ts index 934b1447371..adb07759d8b 100644 --- a/packages/events/src/index.ts +++ b/packages/events/src/index.ts @@ -1,5 +1,9 @@ +import { unsafe_useStateMap } from "@typespec/compiler/experimental"; + export { $lib } from "./lib.js"; export { $decorators, $onValidate } from "./tsp-index.js"; export { getContentType, isEventData, isEvents } from "./decorators.js"; + +unsafe_useStateMap(Symbol.for("foo")); diff --git a/packages/json-schema/src/decorators.ts b/packages/json-schema/src/decorators.ts index 673483f5abd..72c97d654e1 100644 --- a/packages/json-schema/src/decorators.ts +++ b/packages/json-schema/src/decorators.ts @@ -12,6 +12,7 @@ import { typespecTypeToJson, type Union, } from "@typespec/compiler"; +import { useStateMap, useStateSet } from "@typespec/compiler/utils"; import type { ValidatesRawJsonDecorator } from "../generated-defs/TypeSpec.JsonSchema.Private.js"; import type { ContainsDecorator, @@ -32,7 +33,6 @@ import type { } from "../generated-defs/TypeSpec.JsonSchema.js"; import { JsonSchemaStateKeys } from "./lib.js"; import { createDataDecorator } from "./utils.js"; -import { useStateMap, useStateSet } from "@typespec/compiler/utils"; /** * TypeSpec Types that can create a json schmea declaration @@ -247,10 +247,9 @@ export interface ExtensionRecord { value: Type | unknown; } -const [getExtensionsInternal, _, getExtensionsStateMap] = useStateMap< - Type, - ExtensionRecord[] ->(JsonSchemaStateKeys["JsonSchema.extension"]); +const [getExtensionsInternal, _, getExtensionsStateMap] = useStateMap( + JsonSchemaStateKeys["JsonSchema.extension"], +); /** {@inheritdoc ExtensionDecorator} */ export const $extension: ExtensionDecorator = ( context: DecoratorContext, diff --git a/packages/openapi/src/decorators.ts b/packages/openapi/src/decorators.ts index 4872e8a2e70..f979c9500ae 100644 --- a/packages/openapi/src/decorators.ts +++ b/packages/openapi/src/decorators.ts @@ -243,10 +243,9 @@ function omitUndefined>(data: T): T { } /** Get TagsMetadata set with `@tagMetadata` decorator */ -const [getTagsMetadata, setTagsMetadata] = useStateMap< - Type, - { [name: string]: TagMetadata } ->(OpenAPIKeys.tagsMetadata); +const [getTagsMetadata, setTagsMetadata] = useStateMap( + OpenAPIKeys.tagsMetadata, +); /** * Decorator to add metadata to a tag associated with a namespace. diff --git a/packages/sse/src/decorators.ts b/packages/sse/src/decorators.ts index 1303a94a82d..e42acfeb79f 100644 --- a/packages/sse/src/decorators.ts +++ b/packages/sse/src/decorators.ts @@ -3,9 +3,7 @@ import { useStateSet } from "@typespec/compiler/utils"; import type { TerminalEventDecorator } from "../generated-defs/TypeSpec.SSE.js"; import { SSEStateKeys } from "./lib.js"; -const [isTerminalEvent, setTerminalEvent] = useStateSet( - SSEStateKeys.terminalEvent, -); +const [isTerminalEvent, setTerminalEvent] = useStateSet(SSEStateKeys.terminalEvent); export const $terminalEventDecorator: TerminalEventDecorator = (context, target) => { setTerminalEvent(context.program, target);