1082815dcSEvan Bacon"use strict";
2082815dcSEvan Bacon
3082815dcSEvan BaconObject.defineProperty(exports, "__esModule", {
4082815dcSEvan Bacon  value: true
5082815dcSEvan Bacon});
6082815dcSEvan Baconexports.assignStylesValue = assignStylesValue;
7082815dcSEvan Baconexports.getAppThemeLightNoActionBarGroup = getAppThemeLightNoActionBarGroup;
8082815dcSEvan Baconexports.getProjectStylesXMLPathAsync = getProjectStylesXMLPathAsync;
9082815dcSEvan Baconexports.getStyleParent = getStyleParent;
10082815dcSEvan Baconexports.getStylesGroupAsObject = getStylesGroupAsObject;
11082815dcSEvan Baconexports.getStylesItem = getStylesItem;
12082815dcSEvan Baconexports.readStylesXMLAsync = readStylesXMLAsync;
13082815dcSEvan Baconexports.removeStylesItem = removeStylesItem;
14082815dcSEvan Baconexports.setStylesItem = setStylesItem;
15082815dcSEvan Baconfunction _Paths() {
16082815dcSEvan Bacon  const data = require("./Paths");
17082815dcSEvan Bacon  _Paths = function () {
18082815dcSEvan Bacon    return data;
19082815dcSEvan Bacon  };
20082815dcSEvan Bacon  return data;
21082815dcSEvan Bacon}
22082815dcSEvan Baconfunction _Resources() {
23082815dcSEvan Bacon  const data = require("./Resources");
24082815dcSEvan Bacon  _Resources = function () {
25082815dcSEvan Bacon    return data;
26082815dcSEvan Bacon  };
27082815dcSEvan Bacon  return data;
28082815dcSEvan Bacon}
29082815dcSEvan Bacon// Adds support for `tools:x`
30082815dcSEvan Baconconst fallbackResourceString = `<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools"></resources>`;
31082815dcSEvan Baconasync function readStylesXMLAsync({
32082815dcSEvan Bacon  path,
33082815dcSEvan Bacon  fallback = fallbackResourceString
34082815dcSEvan Bacon}) {
35082815dcSEvan Bacon  return (0, _Resources().readResourcesXMLAsync)({
36082815dcSEvan Bacon    path,
37082815dcSEvan Bacon    fallback
38082815dcSEvan Bacon  });
39082815dcSEvan Bacon}
40082815dcSEvan Baconasync function getProjectStylesXMLPathAsync(projectRoot, {
41082815dcSEvan Bacon  kind
42082815dcSEvan Bacon} = {}) {
43082815dcSEvan Bacon  return (0, _Paths().getResourceXMLPathAsync)(projectRoot, {
44082815dcSEvan Bacon    kind,
45082815dcSEvan Bacon    name: 'styles'
46082815dcSEvan Bacon  });
47082815dcSEvan Bacon}
48082815dcSEvan Baconfunction ensureDefaultStyleResourceXML(xml) {
49082815dcSEvan Bacon  var _xml, _xml$resources;
50082815dcSEvan Bacon  xml = (0, _Resources().ensureDefaultResourceXML)(xml);
51082815dcSEvan Bacon  if (!Array.isArray((_xml = xml) === null || _xml === void 0 ? void 0 : (_xml$resources = _xml.resources) === null || _xml$resources === void 0 ? void 0 : _xml$resources.style)) {
52082815dcSEvan Bacon    xml.resources.style = [];
53082815dcSEvan Bacon  }
54082815dcSEvan Bacon  return xml;
55082815dcSEvan Bacon}
56082815dcSEvan Baconfunction getStyleParent(xml, group) {
57082815dcSEvan Bacon  return (0, _Resources().findResourceGroup)(xml.resources.style, group);
58082815dcSEvan Bacon}
59082815dcSEvan Baconfunction getStylesItem({
60082815dcSEvan Bacon  name,
61082815dcSEvan Bacon  xml,
62082815dcSEvan Bacon  parent
63082815dcSEvan Bacon}) {
64082815dcSEvan Bacon  xml = ensureDefaultStyleResourceXML(xml);
65082815dcSEvan Bacon  const appTheme = getStyleParent(xml, parent);
66082815dcSEvan Bacon  if (!appTheme) {
67082815dcSEvan Bacon    return null;
68082815dcSEvan Bacon  }
69082815dcSEvan Bacon  if (appTheme.item) {
70082815dcSEvan Bacon    const existingItem = appTheme.item.filter(({
71082815dcSEvan Bacon      $: head
72*ee216927STomasz Sapeta    }) => head.name === name)[0];
73082815dcSEvan Bacon
74*ee216927STomasz Sapeta    // Don't want to 2 of the same item, so if one exists, we overwrite it
75082815dcSEvan Bacon    if (existingItem) {
76082815dcSEvan Bacon      return existingItem;
77082815dcSEvan Bacon    }
78082815dcSEvan Bacon  }
79082815dcSEvan Bacon  return null;
80082815dcSEvan Bacon}
81082815dcSEvan Baconfunction setStylesItem({
82082815dcSEvan Bacon  item,
83082815dcSEvan Bacon  xml,
84082815dcSEvan Bacon  parent
85082815dcSEvan Bacon}) {
86082815dcSEvan Bacon  xml = ensureDefaultStyleResourceXML(xml);
87082815dcSEvan Bacon  let appTheme = getStyleParent(xml, parent);
88082815dcSEvan Bacon  if (!appTheme) {
89082815dcSEvan Bacon    appTheme = (0, _Resources().buildResourceGroup)(parent);
90082815dcSEvan Bacon    xml.resources.style.push(appTheme);
91082815dcSEvan Bacon  }
92082815dcSEvan Bacon  if (appTheme.item) {
93082815dcSEvan Bacon    const existingItem = appTheme.item.filter(({
94082815dcSEvan Bacon      $: head
95*ee216927STomasz Sapeta    }) => head.name === item.$.name)[0];
96082815dcSEvan Bacon
97*ee216927STomasz Sapeta    // Don't want to 2 of the same item, so if one exists, we overwrite it
98082815dcSEvan Bacon    if (existingItem) {
99082815dcSEvan Bacon      existingItem._ = item._;
100082815dcSEvan Bacon      existingItem.$ = item.$;
101082815dcSEvan Bacon    } else {
102082815dcSEvan Bacon      appTheme.item.push(item);
103082815dcSEvan Bacon    }
104082815dcSEvan Bacon  } else {
105082815dcSEvan Bacon    appTheme.item = [item];
106082815dcSEvan Bacon  }
107082815dcSEvan Bacon  return xml;
108082815dcSEvan Bacon}
109082815dcSEvan Baconfunction removeStylesItem({
110082815dcSEvan Bacon  name,
111082815dcSEvan Bacon  xml,
112082815dcSEvan Bacon  parent
113082815dcSEvan Bacon}) {
114082815dcSEvan Bacon  xml = ensureDefaultStyleResourceXML(xml);
115082815dcSEvan Bacon  const appTheme = getStyleParent(xml, parent);
116082815dcSEvan Bacon  if (appTheme !== null && appTheme !== void 0 && appTheme.item) {
117082815dcSEvan Bacon    const index = appTheme.item.findIndex(({
118082815dcSEvan Bacon      $: head
119082815dcSEvan Bacon    }) => head.name === name);
120082815dcSEvan Bacon    if (index > -1) {
121082815dcSEvan Bacon      appTheme.item.splice(index, 1);
122082815dcSEvan Bacon    }
123082815dcSEvan Bacon  }
124082815dcSEvan Bacon  return xml;
125*ee216927STomasz Sapeta}
126082815dcSEvan Bacon
127*ee216927STomasz Sapeta// This is a very common theme so make it reusable.
128082815dcSEvan Baconfunction getAppThemeLightNoActionBarGroup() {
129082815dcSEvan Bacon  return {
130082815dcSEvan Bacon    name: 'AppTheme',
131082815dcSEvan Bacon    parent: 'Theme.AppCompat.Light.NoActionBar'
132082815dcSEvan Bacon  };
133082815dcSEvan Bacon}
134082815dcSEvan Baconfunction assignStylesValue(xml, {
135082815dcSEvan Bacon  add,
136082815dcSEvan Bacon  value,
137082815dcSEvan Bacon  targetApi,
138082815dcSEvan Bacon  name,
139082815dcSEvan Bacon  parent
140082815dcSEvan Bacon}) {
141082815dcSEvan Bacon  if (add) {
142082815dcSEvan Bacon    return setStylesItem({
143082815dcSEvan Bacon      xml,
144082815dcSEvan Bacon      parent,
145082815dcSEvan Bacon      item: (0, _Resources().buildResourceItem)({
146082815dcSEvan Bacon        name,
147082815dcSEvan Bacon        targetApi,
148082815dcSEvan Bacon        value
149082815dcSEvan Bacon      })
150082815dcSEvan Bacon    });
151082815dcSEvan Bacon  }
152082815dcSEvan Bacon  return removeStylesItem({
153082815dcSEvan Bacon    xml,
154082815dcSEvan Bacon    parent,
155082815dcSEvan Bacon    name
156082815dcSEvan Bacon  });
157082815dcSEvan Bacon}
158*ee216927STomasz Sapeta
159082815dcSEvan Bacon/**
160082815dcSEvan Bacon * Helper to convert a styles.xml parent's children into a simple k/v pair.
161082815dcSEvan Bacon * Added for testing purposes.
162082815dcSEvan Bacon *
163082815dcSEvan Bacon * @param xml
164082815dcSEvan Bacon * @returns
165082815dcSEvan Bacon */
166082815dcSEvan Baconfunction getStylesGroupAsObject(xml, group) {
167082815dcSEvan Bacon  const xmlGroup = getStyleParent(xml, group);
168082815dcSEvan Bacon  return xmlGroup !== null && xmlGroup !== void 0 && xmlGroup.item ? (0, _Resources().getResourceItemsAsObject)(xmlGroup.item) : null;
169082815dcSEvan Bacon}
170082815dcSEvan Bacon//# sourceMappingURL=Styles.js.map