@@ -4,7 +4,7 @@ import {ascendingDefined} from "../defined.js";
44import { isNoneish , map } from "../options.js" ;
55import { maybeInterval } from "../transforms/interval.js" ;
66import { maybeSymbol } from "../symbols.js" ;
7- import { registry , color , symbol } from "./index.js" ;
7+ import { registry , color , position , symbol } from "./index.js" ;
88import { maybeBooleanRange , ordinalScheme , quantitativeScheme } from "./schemes.js" ;
99
1010// This denotes an implicitly ordinal color scale: the scale type was not set,
@@ -13,7 +13,7 @@ import {maybeBooleanRange, ordinalScheme, quantitativeScheme} from "./schemes.js
1313// of this by setting the type explicitly.
1414export const ordinalImplicit = Symbol ( "ordinal" ) ;
1515
16- export function ScaleO ( scale , channels , {
16+ function ScaleO ( key , scale , channels , {
1717 type,
1818 interval,
1919 domain,
@@ -22,7 +22,7 @@ export function ScaleO(scale, channels, {
2222 hint
2323} ) {
2424 interval = maybeInterval ( interval ) ;
25- if ( domain === undefined ) domain = inferDomain ( channels , interval ) ;
25+ if ( domain === undefined ) domain = inferDomain ( channels , interval , key ) ;
2626 if ( type === "categorical" || type === ordinalImplicit ) type = "ordinal" ; // shorthand for color schemes
2727 if ( reverse ) domain = reverseof ( domain ) ;
2828 scale . domain ( domain ) ;
@@ -44,7 +44,7 @@ export function ScaleOrdinal(key, channels, {
4444 ...options
4545} ) {
4646 interval = maybeInterval ( interval ) ;
47- if ( domain === undefined ) domain = inferDomain ( channels , interval ) ;
47+ if ( domain === undefined ) domain = inferDomain ( channels , interval , key ) ;
4848 let hint ;
4949 if ( registry . get ( key ) === symbol ) {
5050 hint = inferSymbolHint ( channels ) ;
@@ -68,7 +68,7 @@ export function ScaleOrdinal(key, channels, {
6868 }
6969 }
7070 if ( unknown === scaleImplicit ) throw new Error ( "implicit unknown is not supported" ) ;
71- return ScaleO ( scaleOrdinal ( ) . unknown ( unknown ) , channels , { ...options , type, domain, range, hint} ) ;
71+ return ScaleO ( key , scaleOrdinal ( ) . unknown ( unknown ) , channels , { ...options , type, domain, range, hint} ) ;
7272}
7373
7474export function ScalePoint ( key , channels , {
@@ -81,7 +81,8 @@ export function ScalePoint(key, channels, {
8181 . align ( align )
8282 . padding ( padding ) ,
8383 channels ,
84- options
84+ options ,
85+ key
8586 ) ;
8687}
8788
@@ -98,19 +99,20 @@ export function ScaleBand(key, channels, {
9899 . paddingInner ( paddingInner )
99100 . paddingOuter ( paddingOuter ) ,
100101 channels ,
101- options
102+ options ,
103+ key
102104 ) ;
103105}
104106
105- function maybeRound ( scale , channels , options ) {
107+ function maybeRound ( scale , channels , options , key ) {
106108 let { round} = options ;
107109 if ( round !== undefined ) scale . round ( round = ! ! round ) ;
108- scale = ScaleO ( scale , channels , options ) ;
110+ scale = ScaleO ( key , scale , channels , options ) ;
109111 scale . round = round ; // preserve for autoScaleRound
110112 return scale ;
111113}
112114
113- function inferDomain ( channels , interval ) {
115+ function inferDomain ( channels , interval , key ) {
114116 const values = new InternSet ( ) ;
115117 for ( const { value, domain} of channels ) {
116118 if ( domain !== undefined ) return domain ( ) ; // see channelDomain
@@ -121,6 +123,7 @@ function inferDomain(channels, interval) {
121123 const [ min , max ] = extent ( values ) . map ( interval . floor , interval ) ;
122124 return interval . range ( min , interval . offset ( max ) ) ;
123125 }
126+ if ( values . size > 10e3 && registry . get ( key ) === position ) throw new Error ( "implicit ordinal position domain has more than 10,000 values" ) ;
124127 return sort ( values , ascendingDefined ) ;
125128}
126129
0 commit comments