@washingtonpost/subs-de-inputs 0.2.1-canary.4 → 0.2.2-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,7 @@ export declare const ingest: IngestType;
8
8
  declare type IngestType = ({ submitData: { fieldName, value }, source, }: {
9
9
  submitData: {
10
10
  fieldName: string;
11
- value: string[];
11
+ value: string;
12
12
  };
13
13
  type?: (typeof IngestType)[keyof typeof IngestType];
14
14
  source: string;
@@ -89,9 +89,6 @@ const ingest = async _ref2 => {
89
89
  if (!hasRequiredPrivacyCookies()) {
90
90
  throw new Error('does not satisfy cookie check');
91
91
  }
92
- if (!Array.isArray(value)) {
93
- throw new Error('value is not an array');
94
- }
95
92
  let attributeInfo = attributesCache[fieldName];
96
93
  if (!attributeInfo) {
97
94
  attributeInfo = await getAttributes({
@@ -109,8 +106,7 @@ const ingest = async _ref2 => {
109
106
  type,
110
107
  wapo_login_id,
111
108
  data: {
112
- fieldName,
113
- value
109
+ [fieldName]: [value]
114
110
  },
115
111
  metadata: {
116
112
  source
@@ -172,16 +168,16 @@ const DESelect = _ref => {
172
168
  React.useEffect(() => {
173
169
  const submitSelected = async () => {
174
170
  try {
175
- // TODO: Switch to window.__twpdeu.push
176
- // TODO: Log to GA
177
- const result = await ingest({
171
+ var _window2;
172
+ // TODO: Log to GA?
173
+ const result = await ((_window2 = window) === null || _window2 === void 0 || (_window2 = _window2.__twpdeu) === null || _window2 === void 0 ? void 0 : _window2.push({
178
174
  submitData: {
179
175
  fieldName,
180
- value: [selected]
176
+ value: selected
181
177
  },
182
178
  type: config !== null && config !== void 0 && config.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,
183
179
  source
184
- });
180
+ }));
185
181
  const isError = result ? result.status !== subsSdk.ResponseStatus.SUCCESS : true;
186
182
  onFinished({
187
183
  isFinished: true,
@@ -194,17 +190,15 @@ const DESelect = _ref => {
194
190
  });
195
191
  }
196
192
  };
197
- if (submit && selected) {
193
+ if (scriptStatus === subsHooks.ScriptStatus.READY && submit && selected) {
198
194
  submitSelected();
199
195
  }
200
- }, [submit, selected]);
201
- if (!(children || config)) {
202
- return React__default.createElement("span", null, "loading");
203
- }
204
- const defaultValueProp = defaultValue ? {
196
+ }, [scriptStatus, submit]);
197
+ const defaultValueProp = defaultValue && config ? {
205
198
  defaultValue
206
199
  } : {};
207
- const disabledProp = disabled ? {
200
+ const isLoading = !(children || config);
201
+ const disabledProp = disabled || isLoading ? {
208
202
  disabled: true
209
203
  } : {};
210
204
  // sort and filter out archived values
@@ -218,7 +212,9 @@ const DESelect = _ref => {
218
212
  },
219
213
  ...defaultValueProp,
220
214
  ...disabledProp
221
- }, children ? children : null, !children && config && React__default.createElement(React__default.Fragment, null, React__default.createElement(wpdsUiKit.Select.Trigger, {
215
+ }, children ? children : null, !children && !config && React__default.createElement(React__default.Fragment, null, React__default.createElement(wpdsUiKit.Select.Trigger, {
216
+ "data-test-id": `select-trigger-loading`
217
+ }, React__default.createElement(wpdsUiKit.Select.Label, null, label || 'loading...'), React__default.createElement(wpdsUiKit.Select.Value, null))), !children && config && React__default.createElement(React__default.Fragment, null, React__default.createElement(wpdsUiKit.Select.Trigger, {
222
218
  "data-test-id": `${config.name}-select-trigger`
223
219
  }, React__default.createElement(wpdsUiKit.Select.Label, null, label || config.name), React__default.createElement(wpdsUiKit.Select.Value, null)), React__default.createElement(wpdsUiKit.Select.Content, {
224
220
  css: {
@@ -1 +1 @@
1
- {"version":3,"file":"subs-de-inputs.cjs.development.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/dataEnrichment.ts","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n Attribute,\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\n source,\n}) => {\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n if (!Array.isArray(value)) {\n throw new Error('value is not an array');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n attributeInfo = await getAttributes({ fieldName });\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n fieldName,\n value,\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string[];\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ingest } from '../../services/dataEnrichment';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Switch to window.__twpdeu.push\n // TODO: Log to GA\n const result = await ingest({\n submitData: { fieldName, value: [selected] },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (submit && selected) {\n submitSelected();\n }\n }, [submit, selected]);\n\n if (!(children || config)) {\n return <span>loading</span>;\n }\n\n const defaultValueProp = defaultValue ? { defaultValue } : {};\n\n const disabledProp = disabled ? { disabled: true } : {};\n\n // sort and filter out archived values\n const values = config\n ? config.values\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n <Select.Root\n onValueChange={(e: string) => {\n onChange({ value: e });\n setSelected(e);\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children ? children : null}\n {!children && config && (\n <>\n <Select.Trigger data-test-id={`${config.name}-select-trigger`}>\n <Select.Label>{label || config.name}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${config.name}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value.name} key={value.name}>\n {value.name}\n </Select.Item>\n ))}\n </Select.Content>\n </>\n )}\n </Select.Root>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","AttributesState","SUCCESS","IngestType","EXPLICIT","IMPLICIT","IngestResponseState","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","base","ENDPOINTS","attributesCache","getAttributes","_ref","fieldName","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","attributes","e","console","debug","ingest","_ref2","submitData","value","type","source","wapo_login_id","Error","Array","isArray","attributeInfo","name","collection_behavior","jucid","localStorage","getItem","ga","payload","metadata","response","method","body","JSON","stringify","scriptSrc","staticAssets","DESelect","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","scriptStatus","useScript","useEffect","fetchConfig","_window","__twpdeu","getFieldConfigs","error","warn","ScriptStatus","READY","submitSelected","result","explicit","isError","isFinished","React","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","SelectWrapper","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","theme","zIndices","page","map","Item","key","styled","boxSizing","display","marginBottom","flexDirection","padding"],"mappings":"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"}
1
+ {"version":3,"file":"subs-de-inputs.cjs.development.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/dataEnrichment.ts","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n Attribute,\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\n source,\n}) => {\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n attributeInfo = await getAttributes({ fieldName });\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Log to GA?\n\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n const values = config\n ? config.values\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n <Select.Root\n onValueChange={(e: string) => {\n onChange({ value: e });\n setSelected(e);\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children ? children : null}\n {!children && !config && (\n <>\n <Select.Trigger data-test-id={`select-trigger-loading`}>\n <Select.Label>{label || 'loading...'}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n </>\n )}\n {!children && config && (\n <>\n <Select.Trigger data-test-id={`${config.name}-select-trigger`}>\n <Select.Label>{label || config.name}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${config.name}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value.name} key={value.name}>\n {value.name}\n </Select.Item>\n ))}\n </Select.Content>\n </>\n )}\n </Select.Root>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","AttributesState","SUCCESS","IngestType","EXPLICIT","IMPLICIT","IngestResponseState","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","base","ENDPOINTS","attributesCache","getAttributes","_ref","fieldName","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","attributes","e","console","debug","ingest","_ref2","submitData","value","type","source","wapo_login_id","Error","attributeInfo","name","collection_behavior","jucid","localStorage","getItem","ga","payload","metadata","response","method","body","JSON","stringify","scriptSrc","staticAssets","DESelect","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","scriptStatus","useScript","useEffect","fetchConfig","_window","__twpdeu","getFieldConfigs","error","warn","ScriptStatus","READY","submitSelected","_window2","result","push","explicit","isError","isFinished","defaultValueProp","isLoading","disabledProp","values","sort","a","b","order","filter","archived","React","SelectWrapper","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","theme","zIndices","page","map","Item","key","styled","boxSizing","display","marginBottom","flexDirection","padding"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("@washingtonpost/subs-sdk"),a=require("react"),s=(e=a)&&"object"==typeof e&&"default"in e?e.default:e,o=require("@washingtonpost/wpds-ui-kit"),i=require("@washingtonpost/subs-hooks");const n={COLLECT:"COLLECT",DO_NOT_COLLECT:"DO_NOT_COLLECT"},r={EXPLICIT:"explicit",IMPLICIT:"implicit"},l=()=>{var e;if("undefined"==typeof window)return!1;const a=t.getCookie("wp_usp"),s=null===(e=t.WPGeo())||void 0===e?void 0:e.country_code;return!(!a||"US"!==s)},c=t.ENDPOINTS.base+"/de/v1",u={},d=async e=>{let{fieldName:a}=e;if(u[a])return u[a];const s=[a];try{const e=new URL(c+"/attributes");e.searchParams.set("attributes",s.join(","));const o=await fetch(e.toString(),{credentials:"include",headers:t.JSON_HEADERS}),i=await o.json();if(o.ok&&i.status===t.ResponseStatus.SUCCESS){const e=i.attributes||[];return u[a]=e,e}return[]}catch(e){return console.debug(e),[]}},E=async e=>{let{submitData:{fieldName:a,value:s},type:o=r.IMPLICIT,source:i}=e;const E=c+"/ingest",I=t.getCookie("wapo_login_id");if(!l())throw new Error("does not satisfy cookie check");if(!Array.isArray(s))throw new Error("value is not an array");let S=u[a];if(S||(S=await d({fieldName:a})),S[0]&&S[0].name===a&&S[0].collection_behavior===n.DO_NOT_COLLECT)throw new Error("do not collect");const p={jucid:localStorage.getItem("uuid"),ga:t.getCookie("_ga"),type:o,wapo_login_id:I,data:{fieldName:a,value:s},metadata:{source:i}};try{const e=await fetch(E,{method:"POST",credentials:"include",headers:t.JSON_HEADERS,body:JSON.stringify(p)});return await e.json()}catch(e){return console.debug(e),null}},I=("https://subscribe.washingtonpost.com/static"===t.ENDPOINTS.staticAssets?"https://www.washingtonpost.com/subscribe/static/":t.ENDPOINTS.staticAssets)+"/de-utils/twpdeu.min.js",S=o.styled("div",{boxSizing:"border-box",display:"flex",marginBottom:"$100",flexDirection:"column","& button":{padding:"1px 6px"},"& *":{boxSizing:"border-box"}});exports.AttributesState={SUCCESS:"100"},exports.CollectionBehaviors=n,exports.DESelect=e=>{let{source:n,fieldName:l,label:c,dataDictionaryConfig:u,defaultValue:d,disabled:p,submit:g,onChange:m=(()=>{}),onFinished:T=(()=>{}),valuesFilter:f=(()=>!0),children:C}=e;const[N,b]=a.useState(u),[h,w]=a.useState(""),_=i.useScript(I);if(a.useEffect(()=>{_!==i.ScriptStatus.READY||C||N||(async()=>{try{var e;const t=await(null===(e=window)||void 0===e||null===(e=e.__twpdeu)||void 0===e?void 0:e.getFieldConfigs({fieldName:l}));t?b(t[0]):console.error("unable to get config",l)}catch(e){console.warn("unable to get config",l,e)}})()},[_]),a.useEffect(()=>{g&&h&&(async()=>{try{const e=await E({submitData:{fieldName:l,value:[h]},type:null!=N&&N.explicit?r.EXPLICIT:r.IMPLICIT,source:n});T({isFinished:!0,isError:!e||e.status!==t.ResponseStatus.SUCCESS})}catch(e){T({isFinished:!1,isError:!0})}})()},[g,h]),!C&&!N)return s.createElement("span",null,"loading");const D=d?{defaultValue:d}:{},y=p?{disabled:!0}:{},O=N?N.values.sort((e,t)=>e.order-t.order).filter(e=>!0!==e.archived).filter(f):[];return s.createElement(S,null,s.createElement(o.Select.Root,{onValueChange:e=>{m({value:e}),w(e)},...D,...y},C||null,!C&&N&&s.createElement(s.Fragment,null,s.createElement(o.Select.Trigger,{"data-test-id":N.name+"-select-trigger"},s.createElement(o.Select.Label,null,c||N.name),s.createElement(o.Select.Value,null)),s.createElement(o.Select.Content,{css:{zIndex:o.theme.zIndices.page},"data-test-id":N.name+"-select-content"},O.map(e=>s.createElement(o.Select.Item,{value:e.name,key:e.name},e.name))))))},exports.IngestResponseState={SUCCESS:"100",SYSTEM_ERROR:"101",INVALID_TYPE:"102",INVALID_IDENTIFIER:"103",INVALID_DATA:"104",INVALID_ATTRIBUTE_DEFINITION:"105",INVALID_META_DEFINITION:"106",UNAUTHENTICATED:"107",MISMATCHED_IDENTIFIER:"108",DISABLED_ATTRIBUTE_DEFINITION:"109",DO_NOT_COLLECT:"110"},exports.IngestType=r,exports.getAttributes=d,exports.hasRequiredPrivacyCookies=l,exports.ingest=E;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("@washingtonpost/subs-sdk"),a=require("react"),s=(e=a)&&"object"==typeof e&&"default"in e?e.default:e,i=require("@washingtonpost/wpds-ui-kit"),n=require("@washingtonpost/subs-hooks");const o={COLLECT:"COLLECT",DO_NOT_COLLECT:"DO_NOT_COLLECT"},r={EXPLICIT:"explicit",IMPLICIT:"implicit"},l=()=>{var e;if("undefined"==typeof window)return!1;const a=t.getCookie("wp_usp"),s=null===(e=t.WPGeo())||void 0===e?void 0:e.country_code;return!(!a||"US"!==s)},c=t.ENDPOINTS.base+"/de/v1",u={},d=async e=>{let{fieldName:a}=e;if(u[a])return u[a];const s=[a];try{const e=new URL(c+"/attributes");e.searchParams.set("attributes",s.join(","));const i=await fetch(e.toString(),{credentials:"include",headers:t.JSON_HEADERS}),n=await i.json();if(i.ok&&n.status===t.ResponseStatus.SUCCESS){const e=n.attributes||[];return u[a]=e,e}return[]}catch(e){return console.debug(e),[]}},E=("https://subscribe.washingtonpost.com/static"===t.ENDPOINTS.staticAssets?"https://www.washingtonpost.com/subscribe/static/":t.ENDPOINTS.staticAssets)+"/de-utils/twpdeu.min.js",I=i.styled("div",{boxSizing:"border-box",display:"flex",marginBottom:"$100",flexDirection:"column","& button":{padding:"1px 6px"},"& *":{boxSizing:"border-box"}});exports.AttributesState={SUCCESS:"100"},exports.CollectionBehaviors=o,exports.DESelect=e=>{let{source:o,fieldName:l,label:c,dataDictionaryConfig:u,defaultValue:d,disabled:S,submit:g,onChange:p=(()=>{}),onFinished:m=(()=>{}),valuesFilter:T=(()=>!0),children:C}=e;const[b,f]=a.useState(u),[_,w]=a.useState(""),N=n.useScript(E);a.useEffect(()=>{N!==n.ScriptStatus.READY||C||b||(async()=>{try{var e;const t=await(null===(e=window)||void 0===e||null===(e=e.__twpdeu)||void 0===e?void 0:e.getFieldConfigs({fieldName:l}));t?f(t[0]):console.error("unable to get config",l)}catch(e){console.warn("unable to get config",l,e)}})()},[N]),a.useEffect(()=>{N===n.ScriptStatus.READY&&g&&_&&(async()=>{try{var e;const a=await(null===(e=window)||void 0===e||null===(e=e.__twpdeu)||void 0===e?void 0:e.push({submitData:{fieldName:l,value:_},type:null!=b&&b.explicit?r.EXPLICIT:r.IMPLICIT,source:o}));m({isFinished:!0,isError:!a||a.status!==t.ResponseStatus.SUCCESS})}catch(e){m({isFinished:!1,isError:!0})}})()},[N,g]);const h=d&&b?{defaultValue:d}:{},D=S||!C&&!b?{disabled:!0}:{},L=b?b.values.sort((e,t)=>e.order-t.order).filter(e=>!0!==e.archived).filter(T):[];return s.createElement(I,null,s.createElement(i.Select.Root,{onValueChange:e=>{p({value:e}),w(e)},...h,...D},C||null,!C&&!b&&s.createElement(s.Fragment,null,s.createElement(i.Select.Trigger,{"data-test-id":"select-trigger-loading"},s.createElement(i.Select.Label,null,c||"loading..."),s.createElement(i.Select.Value,null))),!C&&b&&s.createElement(s.Fragment,null,s.createElement(i.Select.Trigger,{"data-test-id":b.name+"-select-trigger"},s.createElement(i.Select.Label,null,c||b.name),s.createElement(i.Select.Value,null)),s.createElement(i.Select.Content,{css:{zIndex:i.theme.zIndices.page},"data-test-id":b.name+"-select-content"},L.map(e=>s.createElement(i.Select.Item,{value:e.name,key:e.name},e.name))))))},exports.IngestResponseState={SUCCESS:"100",SYSTEM_ERROR:"101",INVALID_TYPE:"102",INVALID_IDENTIFIER:"103",INVALID_DATA:"104",INVALID_ATTRIBUTE_DEFINITION:"105",INVALID_META_DEFINITION:"106",UNAUTHENTICATED:"107",MISMATCHED_IDENTIFIER:"108",DISABLED_ATTRIBUTE_DEFINITION:"109",DO_NOT_COLLECT:"110"},exports.IngestType=r,exports.getAttributes=d,exports.hasRequiredPrivacyCookies=l,exports.ingest=async e=>{let{submitData:{fieldName:a,value:s},type:i=r.IMPLICIT,source:n}=e;const E=c+"/ingest",I=t.getCookie("wapo_login_id");if(!l())throw new Error("does not satisfy cookie check");let S=u[a];if(S||(S=await d({fieldName:a})),S[0]&&S[0].name===a&&S[0].collection_behavior===o.DO_NOT_COLLECT)throw new Error("do not collect");const g={jucid:localStorage.getItem("uuid"),ga:t.getCookie("_ga"),type:i,wapo_login_id:I,data:{[a]:[s]},metadata:{source:n}};try{const e=await fetch(E,{method:"POST",credentials:"include",headers:t.JSON_HEADERS,body:JSON.stringify(g)});return await e.json()}catch(e){return console.debug(e),null}};
2
2
  //# sourceMappingURL=subs-de-inputs.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subs-de-inputs.cjs.production.min.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/dataEnrichment.ts","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n Attribute,\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\n source,\n}) => {\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n if (!Array.isArray(value)) {\n throw new Error('value is not an array');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n attributeInfo = await getAttributes({ fieldName });\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n fieldName,\n value,\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string[];\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ingest } from '../../services/dataEnrichment';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Switch to window.__twpdeu.push\n // TODO: Log to GA\n const result = await ingest({\n submitData: { fieldName, value: [selected] },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (submit && selected) {\n submitSelected();\n }\n }, [submit, selected]);\n\n if (!(children || config)) {\n return <span>loading</span>;\n }\n\n const defaultValueProp = defaultValue ? { defaultValue } : {};\n\n const disabledProp = disabled ? { disabled: true } : {};\n\n // sort and filter out archived values\n const values = config\n ? config.values\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n <Select.Root\n onValueChange={(e: string) => {\n onChange({ value: e });\n setSelected(e);\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children ? children : null}\n {!children && config && (\n <>\n <Select.Trigger data-test-id={`${config.name}-select-trigger`}>\n <Select.Label>{label || config.name}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${config.name}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value.name} key={value.name}>\n {value.name}\n </Select.Item>\n ))}\n </Select.Content>\n </>\n )}\n </Select.Root>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","IngestType","EXPLICIT","IMPLICIT","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","base","ENDPOINTS","attributesCache","getAttributes","async","fieldName","_ref","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","SUCCESS","attributes","e","console","debug","ingest","submitData","value","type","source","_ref2","wapo_login_id","Error","Array","isArray","attributeInfo","name","collection_behavior","payload","jucid","localStorage","getItem","ga","metadata","response","method","body","JSON","stringify","scriptSrc","staticAssets","SelectWrapper","styled","boxSizing","display","marginBottom","flexDirection","& button","padding","& *","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","scriptStatus","useScript","useEffect","ScriptStatus","READY","_window","__twpdeu","getFieldConfigs","error","warn","fetchConfig","result","explicit","isFinished","isError","submitSelected","React","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","theme","zIndices","page","map","Item","key","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION"],"mappings":"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"}
1
+ {"version":3,"file":"subs-de-inputs.cjs.production.min.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/dataEnrichment.ts","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n Attribute,\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\n source,\n}) => {\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n attributeInfo = await getAttributes({ fieldName });\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Log to GA?\n\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n const values = config\n ? config.values\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n <Select.Root\n onValueChange={(e: string) => {\n onChange({ value: e });\n setSelected(e);\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children ? children : null}\n {!children && !config && (\n <>\n <Select.Trigger data-test-id={`select-trigger-loading`}>\n <Select.Label>{label || 'loading...'}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n </>\n )}\n {!children && config && (\n <>\n <Select.Trigger data-test-id={`${config.name}-select-trigger`}>\n <Select.Label>{label || config.name}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${config.name}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value.name} key={value.name}>\n {value.name}\n </Select.Item>\n ))}\n </Select.Content>\n </>\n )}\n </Select.Root>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","IngestType","EXPLICIT","IMPLICIT","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","base","ENDPOINTS","attributesCache","getAttributes","async","fieldName","_ref","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","SUCCESS","attributes","e","console","debug","scriptSrc","staticAssets","SelectWrapper","styled","boxSizing","display","marginBottom","flexDirection","& button","padding","& *","source","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","scriptStatus","useScript","useEffect","ScriptStatus","READY","_window","__twpdeu","getFieldConfigs","error","warn","fetchConfig","_window2","result","push","submitData","value","type","explicit","isFinished","isError","submitSelected","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","React","Select","Root","onValueChange","Trigger","Label","Value","name","Content","css","zIndex","theme","zIndices","page","map","Item","key","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","_ref2","wapo_login_id","Error","attributeInfo","collection_behavior","payload","jucid","localStorage","getItem","ga","[object Object]","metadata","response","method","body","JSON","stringify"],"mappings":"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"}
@@ -82,9 +82,6 @@ const ingest = async _ref2 => {
82
82
  if (!hasRequiredPrivacyCookies()) {
83
83
  throw new Error('does not satisfy cookie check');
84
84
  }
85
- if (!Array.isArray(value)) {
86
- throw new Error('value is not an array');
87
- }
88
85
  let attributeInfo = attributesCache[fieldName];
89
86
  if (!attributeInfo) {
90
87
  attributeInfo = await getAttributes({
@@ -102,8 +99,7 @@ const ingest = async _ref2 => {
102
99
  type,
103
100
  wapo_login_id,
104
101
  data: {
105
- fieldName,
106
- value
102
+ [fieldName]: [value]
107
103
  },
108
104
  metadata: {
109
105
  source
@@ -165,16 +161,16 @@ const DESelect = _ref => {
165
161
  useEffect(() => {
166
162
  const submitSelected = async () => {
167
163
  try {
168
- // TODO: Switch to window.__twpdeu.push
169
- // TODO: Log to GA
170
- const result = await ingest({
164
+ var _window2;
165
+ // TODO: Log to GA?
166
+ const result = await ((_window2 = window) === null || _window2 === void 0 || (_window2 = _window2.__twpdeu) === null || _window2 === void 0 ? void 0 : _window2.push({
171
167
  submitData: {
172
168
  fieldName,
173
- value: [selected]
169
+ value: selected
174
170
  },
175
171
  type: config !== null && config !== void 0 && config.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,
176
172
  source
177
- });
173
+ }));
178
174
  const isError = result ? result.status !== ResponseStatus.SUCCESS : true;
179
175
  onFinished({
180
176
  isFinished: true,
@@ -187,17 +183,15 @@ const DESelect = _ref => {
187
183
  });
188
184
  }
189
185
  };
190
- if (submit && selected) {
186
+ if (scriptStatus === ScriptStatus.READY && submit && selected) {
191
187
  submitSelected();
192
188
  }
193
- }, [submit, selected]);
194
- if (!(children || config)) {
195
- return React.createElement("span", null, "loading");
196
- }
197
- const defaultValueProp = defaultValue ? {
189
+ }, [scriptStatus, submit]);
190
+ const defaultValueProp = defaultValue && config ? {
198
191
  defaultValue
199
192
  } : {};
200
- const disabledProp = disabled ? {
193
+ const isLoading = !(children || config);
194
+ const disabledProp = disabled || isLoading ? {
201
195
  disabled: true
202
196
  } : {};
203
197
  // sort and filter out archived values
@@ -211,7 +205,9 @@ const DESelect = _ref => {
211
205
  },
212
206
  ...defaultValueProp,
213
207
  ...disabledProp
214
- }, children ? children : null, !children && config && React.createElement(React.Fragment, null, React.createElement(Select.Trigger, {
208
+ }, children ? children : null, !children && !config && React.createElement(React.Fragment, null, React.createElement(Select.Trigger, {
209
+ "data-test-id": `select-trigger-loading`
210
+ }, React.createElement(Select.Label, null, label || 'loading...'), React.createElement(Select.Value, null))), !children && config && React.createElement(React.Fragment, null, React.createElement(Select.Trigger, {
215
211
  "data-test-id": `${config.name}-select-trigger`
216
212
  }, React.createElement(Select.Label, null, label || config.name), React.createElement(Select.Value, null)), React.createElement(Select.Content, {
217
213
  css: {
@@ -1 +1 @@
1
- {"version":3,"file":"subs-de-inputs.esm.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/dataEnrichment.ts","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n Attribute,\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\n source,\n}) => {\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n if (!Array.isArray(value)) {\n throw new Error('value is not an array');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n attributeInfo = await getAttributes({ fieldName });\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n fieldName,\n value,\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string[];\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ingest } from '../../services/dataEnrichment';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Switch to window.__twpdeu.push\n // TODO: Log to GA\n const result = await ingest({\n submitData: { fieldName, value: [selected] },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (submit && selected) {\n submitSelected();\n }\n }, [submit, selected]);\n\n if (!(children || config)) {\n return <span>loading</span>;\n }\n\n const defaultValueProp = defaultValue ? { defaultValue } : {};\n\n const disabledProp = disabled ? { disabled: true } : {};\n\n // sort and filter out archived values\n const values = config\n ? config.values\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n <Select.Root\n onValueChange={(e: string) => {\n onChange({ value: e });\n setSelected(e);\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children ? children : null}\n {!children && config && (\n <>\n <Select.Trigger data-test-id={`${config.name}-select-trigger`}>\n <Select.Label>{label || config.name}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${config.name}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value.name} key={value.name}>\n {value.name}\n </Select.Item>\n ))}\n </Select.Content>\n </>\n )}\n </Select.Root>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","AttributesState","SUCCESS","IngestType","EXPLICIT","IMPLICIT","IngestResponseState","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","base","ENDPOINTS","attributesCache","getAttributes","_ref","fieldName","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","attributes","e","console","debug","ingest","_ref2","submitData","value","type","source","wapo_login_id","Error","Array","isArray","attributeInfo","name","collection_behavior","jucid","localStorage","getItem","ga","payload","metadata","response","method","body","JSON","stringify","scriptSrc","staticAssets","DESelect","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","scriptStatus","useScript","useEffect","fetchConfig","_window","__twpdeu","getFieldConfigs","error","warn","ScriptStatus","READY","submitSelected","result","explicit","isError","isFinished","React","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","SelectWrapper","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","theme","zIndices","page","map","Item","key","styled","boxSizing","display","marginBottom","flexDirection","padding"],"mappings":"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"}
1
+ {"version":3,"file":"subs-de-inputs.esm.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/dataEnrichment.ts","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n Attribute,\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\n source,\n}) => {\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n attributeInfo = await getAttributes({ fieldName });\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Log to GA?\n\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n const values = config\n ? config.values\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n <Select.Root\n onValueChange={(e: string) => {\n onChange({ value: e });\n setSelected(e);\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children ? children : null}\n {!children && !config && (\n <>\n <Select.Trigger data-test-id={`select-trigger-loading`}>\n <Select.Label>{label || 'loading...'}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n </>\n )}\n {!children && config && (\n <>\n <Select.Trigger data-test-id={`${config.name}-select-trigger`}>\n <Select.Label>{label || config.name}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${config.name}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value.name} key={value.name}>\n {value.name}\n </Select.Item>\n ))}\n </Select.Content>\n </>\n )}\n </Select.Root>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","AttributesState","SUCCESS","IngestType","EXPLICIT","IMPLICIT","IngestResponseState","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","base","ENDPOINTS","attributesCache","getAttributes","_ref","fieldName","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","attributes","e","console","debug","ingest","_ref2","submitData","value","type","source","wapo_login_id","Error","attributeInfo","name","collection_behavior","jucid","localStorage","getItem","ga","payload","metadata","response","method","body","JSON","stringify","scriptSrc","staticAssets","DESelect","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","scriptStatus","useScript","useEffect","fetchConfig","_window","__twpdeu","getFieldConfigs","error","warn","ScriptStatus","READY","submitSelected","_window2","result","push","explicit","isError","isFinished","defaultValueProp","isLoading","disabledProp","values","sort","a","b","order","filter","archived","React","SelectWrapper","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","theme","zIndices","page","map","Item","key","styled","boxSizing","display","marginBottom","flexDirection","padding"],"mappings":";;;;;MAQaA,mBAAmB,GAAG;EACjCC,OAAO,EAAE,SAAS;EAClBC,cAAc,EAAE;;MAeLC,eAAe,GAAG;EAC7BC,OAAO,EAAE;;MAGEC,UAAU,GAAG;EACxBC,QAAQ,EAAE,UAAU;EACpBC,QAAQ,EAAE;;MAGCC,mBAAmB,GAAG;EACjCJ,OAAO,EAAE,KAAK;EACdK,YAAY,EAAE,KAAK;EACnBC,YAAY,EAAE,KAAK;EACnBC,kBAAkB,EAAE,KAAK;EACzBC,YAAY,EAAE,KAAK;EACnBC,4BAA4B,EAAE,KAAK;EACnCC,uBAAuB,EAAE,KAAK;EAC9BC,eAAe,EAAE,KAAK;EACtBC,qBAAqB,EAAE,KAAK;EAC5BC,6BAA6B,EAAE,KAAK;EACpCf,cAAc,EAAE;;;MC3CLgB,yBAAyB,GAAGA;;EACvC,IAAI,OAAOC,MAAM,KAAK,WAAW,EAAE;IACjC,OAAO,KAAK;;EAGd,MAAMC,MAAM,GAAGC,SAAS,CAAC,QAAQ,CAAC;EAElC,MAAMC,WAAW,IAAAC,MAAA,GAAGC,KAAK,EAAE,cAAAD,MAAA,uBAAPA,MAAA,CAASE,YAAY;EAEzC,OAAO,CAAC,EAAEL,MAAM,IAAIE,WAAW,KAAK,IAAI,CAAC;AAC3C,CAAC;;ACED,MAAMI,IAAI,MAAMC,SAAS,CAACD,YAAY;AAEtC,MAAME,eAAe,GAAwB,EAAE;AAC/C,MAAaC,aAAa,GAAsB,MAAAC,IAAA;MAAO;IACrDC;GAGD,GAAAD,IAAA;EACC,IAAIF,eAAe,CAACG,SAAS,CAAC,EAAE;IAC9B,OAAOH,eAAe,CAACG,SAAS,CAAC;;EAGnC,MAAMC,UAAU,GAAG,CAACD,SAAS,CAAC;EAE9B,IAAI;IACF,MAAME,GAAG,GAAG,IAAIC,GAAG,IAAIR,iBAAiB,CAAC;IACzCO,GAAG,CAACE,YAAY,CAACC,GAAG,CAAC,YAAY,EAAEJ,UAAU,CAACK,IAAI,CAAC,GAAG,CAAC,CAAC;IAExD,MAAMC,IAAI,GAAG,MAAMC,KAAK,CAACN,GAAG,CAACO,QAAQ,EAAE,EAAE;MACvCC,WAAW,EAAE,SAAS;MACtBC,OAAO,EAAEC;KACV,CAAC;IACF,MAAMC,IAAI,GAAG,MAAMN,IAAI,CAACM,IAAI,EAAE;IAE9B,IAAIN,IAAI,CAACO,EAAE,IAAID,IAAI,CAACE,MAAM,KAAKC,cAAc,CAAC3C,OAAO,EAAE;MACrD,MAAM4C,UAAU,GAAGJ,IAAI,CAACI,UAAU,IAAI,EAAE;MACxCpB,eAAe,CAACG,SAAS,CAAC,GAAGiB,UAAU;MACvC,OAAOA,UAAU;KAClB,MAAM;MACL,OAAO,EAAE;;GAEZ,CAAC,OAAOC,CAAC,EAAE;IACVC,OAAO,CAACC,KAAK,CAACF,CAAC,CAAC;IAChB,OAAO,EAAE;;AAEb,CAAC;AAQD,MAAaG,MAAM,GAAe,MAAAC,KAAA;MAAO;IACvCC,UAAU,EAAE;MAAEvB,SAAS;MAAEwB;KAAO;IAChCC,IAAI,GAAGnD,UAAU,CAACE,QAAQ;IAC1BkD;GACD,GAAAJ,KAAA;EACC,MAAMpB,GAAG,MAAMP,aAAa;EAE5B,MAAMgC,aAAa,GAAGrC,SAAS,CAAC,eAAe,CAAC;EAEhD,IAAI,CAACH,yBAAyB,EAAE,EAAE;IAChC,MAAM,IAAIyC,KAAK,CAAC,+BAA+B,CAAC;;EAGlD,IAAIC,aAAa,GAAGhC,eAAe,CAACG,SAAS,CAAC;EAC9C,IAAI,CAAC6B,aAAa,EAAE;IAClBA,aAAa,GAAG,MAAM/B,aAAa,CAAC;MAAEE;KAAW,CAAC;;EAGpD,IACE6B,aAAa,CAAC,CAAC,CAAC,IAChBA,aAAa,CAAC,CAAC,CAAC,CAACC,IAAI,KAAK9B,SAAS,IACnC6B,aAAa,CAAC,CAAC,CAAC,CAACE,mBAAmB,KAAK9D,mBAAmB,CAACE,cAAc,EAC3E;IACA,MAAM,IAAIyD,KAAK,CAAC,gBAAgB,CAAC;;EAGnC,MAAMI,KAAK,GAAGC,YAAY,CAACC,OAAO,CAAC,MAAM,CAAC;EAC1C,MAAMC,EAAE,GAAG7C,SAAS,CAAC,KAAK,CAAC;EAE3B,MAAM8C,OAAO,GAAG;IACdJ,KAAK;IACLG,EAAE;IACFV,IAAI;IACJE,aAAa;IACbpB,IAAI,EAAE;MACJ,CAACP,SAAS,GAAG,CAACwB,KAAK;KACpB;IACDa,QAAQ,EAAE;MAAEX;;GACb;EAED,IAAI;IACF,MAAMY,QAAQ,GAAG,MAAM9B,KAAK,CAACN,GAAG,EAAE;MAChCqC,MAAM,EAAE,MAAM;MACd7B,WAAW,EAAE,SAAS;MACtBC,OAAO,EAAEC,YAAY;MACrB4B,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACN,OAAO;KAC7B,CAAC;IAEF,MAAMvB,IAAI,GAAG,MAAMyB,QAAQ,CAACzB,IAAI,EAAE;IAElC,OAAOA,IAAI;GACZ,CAAC,OAAOK,CAAC,EAAE;IACVC,OAAO,CAACC,KAAK,CAACF,CAAC,CAAC;IAChB,OAAO,IAAI;;AAEf,CAAC;;AC9ED,MAAMyB,SAAS,MACb/C,SAAS,CAACgD,YAAY,KAAK,6CAA6C,GACpE,kDAAkD,GAClDhD,SAAS,CAACgD,qCACS;AAEzB,MAAaC,QAAQ,GAA4B9C,IAAA;MAAC;IAChD2B,MAAM;IACN1B,SAAS;IACT8C,KAAK;IACLC,oBAAoB;IACpBC,YAAY;IACZC,QAAQ;IACRC,MAAM;IACNC,QAAQ,GAAGA,QAAQ;IACnBC,UAAU,GAAGA,QAAQ;IACrBC,YAAY,GAAGA,MAAM,IAAI;IACzBC;GACD,GAAAvD,IAAA;EACC,MAAM,CAACwD,MAAM,EAAEC,SAAS,CAAC,GAAGC,QAAQ,CAACV,oBAAoB,CAAC;EAE1D,MAAM,CAACW,QAAQ,EAAEC,WAAW,CAAC,GAAGF,QAAQ,CAAC,EAAE,CAAC;EAE5C,MAAMG,YAAY,GAAGC,SAAS,CAAClB,SAAS,CAAC;EAEzCmB,SAAS,CAAC;IACR,MAAMC,WAAW,GAAG;MAClB,IAAI;QAAA,IAAAC,OAAA;QACF,MAAMT,MAAM,GAAG,QAAAS,OAAA,GAAM5E,MAAM,cAAA4E,OAAA,gBAAAA,OAAA,GAANA,OAAA,CAAQC,QAAQ,cAAAD,OAAA,uBAAhBA,OAAA,CAAkBE,eAAe,CAAC;UAAElE;SAAW,CAAC;QACrE,IAAIuD,MAAM,EAAE;UACVC,SAAS,CAACD,MAAM,CAAC,CAAC,CAAC,CAAC;SACrB,MAAM;UACLpC,OAAO,CAACgD,KAAK,CAAC,sBAAsB,EAAEnE,SAAS,CAAC;;OAEnD,CAAC,OAAOkB,CAAC,EAAE;QACVC,OAAO,CAACiD,IAAI,CAAC,sBAAsB,EAAEpE,SAAS,EAAEkB,CAAC,CAAC;;KAErD;IAED,IAAI0C,YAAY,KAAKS,YAAY,CAACC,KAAK,IAAI,EAAEhB,QAAQ,IAAIC,MAAM,CAAC,EAAE;MAChEQ,WAAW,EAAE;;GAEhB,EAAE,CAACH,YAAY,CAAC,CAAC;EAElBE,SAAS,CAAC;IACR,MAAMS,cAAc,GAAG;MACrB,IAAI;QAAA,IAAAC,QAAA;;QAGF,MAAMC,MAAM,GAAG,QAAAD,QAAA,GAAMpF,MAAM,cAAAoF,QAAA,gBAAAA,QAAA,GAANA,QAAA,CAAQP,QAAQ,cAAAO,QAAA,uBAAhBA,QAAA,CAAkBE,IAAI,CAAC;UAC1CnD,UAAU,EAAE;YAAEvB,SAAS;YAAEwB,KAAK,EAAEkC;WAAU;UAC1CjC,IAAI,EAAE8B,MAAM,aAANA,MAAM,eAANA,MAAM,CAAEoB,QAAQ,GAAGrG,UAAU,CAACC,QAAQ,GAAGD,UAAU,CAACE,QAAQ;UAClEkD;SACD,CAAC;QAEF,MAAMkD,OAAO,GAAGH,MAAM,GAClBA,MAAM,CAAC1D,MAAM,KAAKC,cAAc,CAAC3C,OAAO,GACxC,IAAI;QAER+E,UAAU,CAAC;UACTyB,UAAU,EAAE,IAAI;UAChBD;SACD,CAAC;OACH,CAAC,OAAO1D,CAAC,EAAE;QACVkC,UAAU,CAAC;UACTyB,UAAU,EAAE,KAAK;UACjBD,OAAO,EAAE;SACV,CAAC;;KAEL;IAED,IAAIhB,YAAY,KAAKS,YAAY,CAACC,KAAK,IAAIpB,MAAM,IAAIQ,QAAQ,EAAE;MAC7Da,cAAc,EAAE;;GAEnB,EAAE,CAACX,YAAY,EAAEV,MAAM,CAAC,CAAC;EAE1B,MAAM4B,gBAAgB,GAAG9B,YAAY,IAAIO,MAAM,GAAG;IAAEP;GAAc,GAAG,EAAE;EAEvE,MAAM+B,SAAS,GAAG,EAAEzB,QAAQ,IAAIC,MAAM,CAAC;EAEvC,MAAMyB,YAAY,GAAG/B,QAAQ,IAAI8B,SAAS,GAAG;IAAE9B,QAAQ,EAAE;GAAM,GAAG,EAAE;;EAGpE,MAAMgC,MAAM,GAAG1B,MAAM,GACjBA,MAAM,CAAC0B,MAAM,CACVC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACE,KAAK,GAAGD,CAAC,CAACC,KAAK,CAAC,CACjCC,MAAM,CAAE9D,KAAK,IAAKA,KAAK,CAAC+D,QAAQ,KAAK,IAAI,CAAC,CAC1CD,MAAM,CAACjC,YAAY,CAAC,GACvB,EAAE;EAEN,OACEmC,oBAACC,aAAa,QACZD,oBAACE,MAAM,CAACC,IAAI;IACVC,aAAa,EAAG1E,CAAS;MACvBiC,QAAQ,CAAC;QAAE3B,KAAK,EAAEN;OAAG,CAAC;MACtByC,WAAW,CAACzC,CAAC,CAAC;KACf;OACG4D,gBAAgB;OAChBE;KAEH1B,QAAQ,GAAGA,QAAQ,GAAG,IAAI,EAC1B,CAACA,QAAQ,IAAI,CAACC,MAAM,IACnBiC,0CACEA,oBAACE,MAAM,CAACG,OAAO;;KACbL,oBAACE,MAAM,CAACI,KAAK,QAAEhD,KAAK,IAAI,YAAY,CAAgB,EACpD0C,oBAACE,MAAM,CAACK,KAAK,OAAG,CACD,CAEpB,EACA,CAACzC,QAAQ,IAAIC,MAAM,IAClBiC,0CACEA,oBAACE,MAAM,CAACG,OAAO;uBAAkBtC,MAAM,CAACzB;KACtC0D,oBAACE,MAAM,CAACI,KAAK,QAAEhD,KAAK,IAAIS,MAAM,CAACzB,IAAI,CAAgB,EACnD0D,oBAACE,MAAM,CAACK,KAAK,OAAG,CACD,EACjBP,oBAACE,MAAM,CAACM,OAAO;IACbC,GAAG,EAAE;MAAEC,MAAM,EAAEC,KAAK,CAACC,QAAQ,CAACC;KAAM;uBACnB9C,MAAM,CAACzB;KAEvBmD,MAAM,CAACqB,GAAG,CAAE9E,KAAK,IAChBgE,oBAACE,MAAM,CAACa,IAAI;IAAC/E,KAAK,EAAEA,KAAK,CAACM,IAAI;IAAE0E,GAAG,EAAEhF,KAAK,CAACM;KACxCN,KAAK,CAACM,IAAI,CAEd,CAAC,CACa,CAEpB,CACW,CACA;AAEpB,CAAC;AAED,MAAM2D,aAAa,gBAAGgB,MAAM,CAAC,KAAK,EAAE;EAClCC,SAAS,EAAE,YAAY;EACvBC,OAAO,EAAE,MAAM;EACfC,YAAY,EAAE,MAAM;EACpBC,aAAa,EAAE,QAAQ;EACvB,UAAU,EAAE;IACVC,OAAO,EAAE;GACV;EACD,KAAK,EAAE;IAAEJ,SAAS,EAAE;;CACrB,CAAC;;;;"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.2.1-canary.4",
2
+ "version": "0.2.2-canary.0",
3
3
  "license": "UNLICENSED",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",