@autonoelle/wsg-active 0.1.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.
Files changed (110) hide show
  1. package/README.md +169 -0
  2. package/dist/activeRestClient.d.ts +30 -0
  3. package/dist/activeRestClient.d.ts.map +1 -0
  4. package/dist/activeRestClient.js +130 -0
  5. package/dist/activeRestClient.js.map +1 -0
  6. package/dist/args.d.ts +33 -0
  7. package/dist/args.d.ts.map +1 -0
  8. package/dist/args.js +83 -0
  9. package/dist/args.js.map +1 -0
  10. package/dist/commands/account.d.ts +23 -0
  11. package/dist/commands/account.d.ts.map +1 -0
  12. package/dist/commands/account.js +322 -0
  13. package/dist/commands/account.js.map +1 -0
  14. package/dist/commands/auth.d.ts +8 -0
  15. package/dist/commands/auth.d.ts.map +1 -0
  16. package/dist/commands/auth.js +30 -0
  17. package/dist/commands/auth.js.map +1 -0
  18. package/dist/commands/battleMap.d.ts +4 -0
  19. package/dist/commands/battleMap.d.ts.map +1 -0
  20. package/dist/commands/battleMap.js +146 -0
  21. package/dist/commands/battleMap.js.map +1 -0
  22. package/dist/commands/config.d.ts +11 -0
  23. package/dist/commands/config.d.ts.map +1 -0
  24. package/dist/commands/config.js +125 -0
  25. package/dist/commands/config.js.map +1 -0
  26. package/dist/commands/discovery.d.ts +2 -0
  27. package/dist/commands/discovery.d.ts.map +1 -0
  28. package/dist/commands/discovery.js +109 -0
  29. package/dist/commands/discovery.js.map +1 -0
  30. package/dist/commands/functions.d.ts +26 -0
  31. package/dist/commands/functions.d.ts.map +1 -0
  32. package/dist/commands/functions.js +237 -0
  33. package/dist/commands/functions.js.map +1 -0
  34. package/dist/commands/mission.d.ts +7 -0
  35. package/dist/commands/mission.d.ts.map +1 -0
  36. package/dist/commands/mission.js +217 -0
  37. package/dist/commands/mission.js.map +1 -0
  38. package/dist/commands/session.d.ts +7 -0
  39. package/dist/commands/session.d.ts.map +1 -0
  40. package/dist/commands/session.js +17 -0
  41. package/dist/commands/session.js.map +1 -0
  42. package/dist/commands/shipPipe.d.ts +11 -0
  43. package/dist/commands/shipPipe.d.ts.map +1 -0
  44. package/dist/commands/shipPipe.js +127 -0
  45. package/dist/commands/shipPipe.js.map +1 -0
  46. package/dist/commands/snapshot.d.ts +33 -0
  47. package/dist/commands/snapshot.d.ts.map +1 -0
  48. package/dist/commands/snapshot.js +308 -0
  49. package/dist/commands/snapshot.js.map +1 -0
  50. package/dist/commands/store.d.ts +32 -0
  51. package/dist/commands/store.d.ts.map +1 -0
  52. package/dist/commands/store.js +212 -0
  53. package/dist/commands/store.js.map +1 -0
  54. package/dist/configTypes.d.ts +131 -0
  55. package/dist/configTypes.d.ts.map +1 -0
  56. package/dist/configTypes.js +152 -0
  57. package/dist/configTypes.js.map +1 -0
  58. package/dist/errors.d.ts +21 -0
  59. package/dist/errors.d.ts.map +1 -0
  60. package/dist/errors.js +42 -0
  61. package/dist/errors.js.map +1 -0
  62. package/dist/gameDataClient.d.ts +15 -0
  63. package/dist/gameDataClient.d.ts.map +1 -0
  64. package/dist/gameDataClient.js +63 -0
  65. package/dist/gameDataClient.js.map +1 -0
  66. package/dist/graphqlClient.d.ts +32 -0
  67. package/dist/graphqlClient.d.ts.map +1 -0
  68. package/dist/graphqlClient.js +106 -0
  69. package/dist/graphqlClient.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +712 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/output.d.ts +24 -0
  75. package/dist/output.d.ts.map +1 -0
  76. package/dist/output.js +39 -0
  77. package/dist/output.js.map +1 -0
  78. package/dist/security.d.ts +3 -0
  79. package/dist/security.d.ts.map +1 -0
  80. package/dist/security.js +41 -0
  81. package/dist/security.js.map +1 -0
  82. package/dist/tests/clients.test.d.ts +2 -0
  83. package/dist/tests/clients.test.d.ts.map +1 -0
  84. package/dist/tests/clients.test.js +31 -0
  85. package/dist/tests/clients.test.js.map +1 -0
  86. package/dist/tests/security.test.d.ts +2 -0
  87. package/dist/tests/security.test.d.ts.map +1 -0
  88. package/dist/tests/security.test.js +26 -0
  89. package/dist/tests/security.test.js.map +1 -0
  90. package/dist/tests/shipPipe.test.d.ts +2 -0
  91. package/dist/tests/shipPipe.test.d.ts.map +1 -0
  92. package/dist/tests/shipPipe.test.js +31 -0
  93. package/dist/tests/shipPipe.test.js.map +1 -0
  94. package/dist/tests/validation.test.d.ts +2 -0
  95. package/dist/tests/validation.test.d.ts.map +1 -0
  96. package/dist/tests/validation.test.js +58 -0
  97. package/dist/tests/validation.test.js.map +1 -0
  98. package/dist/tests/writeWorkflow.test.d.ts +2 -0
  99. package/dist/tests/writeWorkflow.test.d.ts.map +1 -0
  100. package/dist/tests/writeWorkflow.test.js +22 -0
  101. package/dist/tests/writeWorkflow.test.js.map +1 -0
  102. package/dist/validation.d.ts +18 -0
  103. package/dist/validation.d.ts.map +1 -0
  104. package/dist/validation.js +328 -0
  105. package/dist/validation.js.map +1 -0
  106. package/dist/writeWorkflow.d.ts +16 -0
  107. package/dist/writeWorkflow.d.ts.map +1 -0
  108. package/dist/writeWorkflow.js +135 -0
  109. package/dist/writeWorkflow.js.map +1 -0
  110. package/package.json +31 -0
@@ -0,0 +1,308 @@
1
+ import { activeCall } from '../activeRestClient.js';
2
+ // ── Public entry points ──────────────────────────────────────────
3
+ export function listParts() {
4
+ return activeInfoParts;
5
+ }
6
+ /** Return the full ActiveUserInfoData as-is. */
7
+ export async function getFullActiveInfo(opts) {
8
+ return activeCall(opts, 'ActiveUserInfoData');
9
+ }
10
+ /** Return a summary (part names + counts) without slicing. */
11
+ export async function getSummary(opts) {
12
+ const data = await activeCall(opts, 'ActiveUserInfoData');
13
+ return summarizeActiveInfo(unwrapActiveInfoData(data));
14
+ }
15
+ /** Return one part by name, with optional id/first/all/fields slicing. */
16
+ export async function getPart(opts, partName, query = {}) {
17
+ const data = await activeCall(opts, 'ActiveUserInfoData');
18
+ const activeInfo = unwrapActiveInfoData(data);
19
+ const part = resolvePart(partName);
20
+ let value = getProperty(activeInfo, part.key);
21
+ if (value === undefined) {
22
+ throw new Error(`ActiveUserInfoData part not found: ${part.key}`);
23
+ }
24
+ const selected = query.id ? selectById(value, query.id) : value;
25
+ const limited = query.id || query.all ? selected : limitCollection(selected, query.first ?? 20);
26
+ return applyFields(limited, query.fields);
27
+ }
28
+ /** Return the ships part, optionally filtered. */
29
+ export async function getShips(opts, query = {}) {
30
+ const data = await activeCall(opts, 'ActiveUserInfoData');
31
+ const activeInfo = unwrapActiveInfoData(data);
32
+ const part = resolvePart('ships');
33
+ let value = getProperty(activeInfo, part.key);
34
+ if (value === undefined) {
35
+ throw new Error(`ActiveUserInfoData part not found: ${part.key}`);
36
+ }
37
+ // Apply ship-specific filters
38
+ value = filterShips(value, query);
39
+ const selected = query.id ? selectById(value, query.id) : value;
40
+ const limited = query.id || query.all ? selected : limitCollection(selected, query.first ?? 20);
41
+ return applyFields(limited, query.fields);
42
+ }
43
+ // ── Internal helpers ─────────────────────────────────────────────
44
+ const activeInfoParts = [
45
+ { name: 'dataStruct', key: 'DataStruct', aliases: ['data', 'resources', 'resource'], description: 'Player base data and resources' },
46
+ { name: 'shipArchive', key: 'ShipArchive', aliases: ['archive'], description: 'Ship archive/completion data' },
47
+ { name: 'campaigns', key: 'Campaigns', aliases: ['campaign'], description: 'Campaign state' },
48
+ { name: 'mapInfos', key: 'MapInfos', aliases: ['maps', 'map'], description: 'Player map progress data' },
49
+ { name: 'itemInfos', key: 'ItemInfos', aliases: ['items', 'item'], description: 'Player item inventory data' },
50
+ { name: 'taskInfos', key: 'TaskInfos', aliases: ['tasks', 'task'], description: 'Player task/quest data' },
51
+ { name: 'battleInfo', key: 'BattleInfo', aliases: ['battle'], description: 'Current battle data' },
52
+ { name: 'useCookBook', key: 'UseCookBook', aliases: ['cookbook', 'cookbooks'], description: 'Cookbook data' },
53
+ { name: 'sixthStruct', key: 'SixthStruct', aliases: ['sixth'], description: 'Sixth activity base data' },
54
+ { name: 'sixthCombatInfo', key: 'SixthCombatInfo', aliases: ['sixthCombat'], description: 'Sixth activity combat data' },
55
+ { name: 'sixthBigMapState', key: 'SixthBigMapState', aliases: ['sixthMaps', 'sixthMap'], description: 'Sixth activity big-map state' },
56
+ { name: 'sixthShopInfo', key: 'SixthShopInfo', aliases: ['sixthShop'], description: 'Sixth activity shop data' },
57
+ { name: 'equipInfos', key: 'EquipInfos', aliases: ['equips', 'equipments', 'equipment'], description: 'Owned equipment data' },
58
+ { name: 'shipInfos', key: 'ShipInfos', aliases: ['ships', 'ship'], description: 'Owned ship data' },
59
+ { name: 'expeditions', key: 'Expeditions', aliases: ['expedition'], description: 'Expedition state' },
60
+ { name: 'teamInfos', key: 'TeamInfos', aliases: ['teams', 'team', 'fleets', 'fleet'], description: 'Fleet/team data' },
61
+ { name: 'poolStruct', key: 'PoolStruct', aliases: ['pool', 'dock'], description: 'Repair/build pool data' },
62
+ { name: 'workshop', key: 'Workshop', aliases: ['workshops'], description: 'Workshop data' },
63
+ { name: 'rankSupportInfoUpdate', key: 'RankSupportInfoUpdate', aliases: ['rankSupport'], description: 'Rank support data' },
64
+ { name: 'maneuverInfo', key: 'ManeuverInfo', aliases: ['maneuver'], description: 'Maneuver data' },
65
+ { name: 'customCover', key: 'CustomCover', aliases: ['covers', 'cover'], description: 'Custom cover data' },
66
+ ];
67
+ function unwrapActiveInfoData(data) {
68
+ if (containsActiveInfoPart(data)) {
69
+ return data;
70
+ }
71
+ const wrappedData = getProperty(data, 'data');
72
+ if (containsActiveInfoPart(wrappedData)) {
73
+ return wrappedData;
74
+ }
75
+ return data;
76
+ }
77
+ function containsActiveInfoPart(data) {
78
+ return activeInfoParts.some((part) => getProperty(data, part.key) !== undefined);
79
+ }
80
+ function resolvePart(name) {
81
+ const normalized = normalizeName(name);
82
+ const part = activeInfoParts.find((item) => normalizeName(item.name) === normalized ||
83
+ normalizeName(item.key) === normalized ||
84
+ item.aliases.some((alias) => normalizeName(alias) === normalized));
85
+ if (!part) {
86
+ const names = activeInfoParts.map((item) => item.name).join(', ');
87
+ throw new Error(`Unknown ActiveUserInfoData part: ${name}. Known parts: ${names}`);
88
+ }
89
+ return part;
90
+ }
91
+ function filterShips(value, query) {
92
+ const hasFilter = query.cid !== undefined
93
+ || query.levelMin !== undefined
94
+ || query.levelMax !== undefined
95
+ || query.locked !== undefined
96
+ || query.unlocked !== undefined
97
+ || query.married !== undefined
98
+ || query.unmarried !== undefined;
99
+ if (!hasFilter) {
100
+ return value;
101
+ }
102
+ if (Array.isArray(value)) {
103
+ return value.filter((entry) => shipMatches(entry, query));
104
+ }
105
+ if (isRecord(value)) {
106
+ const filtered = {};
107
+ for (const [key, entry] of Object.entries(value)) {
108
+ if (shipMatches(entry, query)) {
109
+ filtered[key] = entry;
110
+ }
111
+ }
112
+ return filtered;
113
+ }
114
+ return value;
115
+ }
116
+ function shipMatches(entry, query) {
117
+ if (!isRecord(entry)) {
118
+ return true;
119
+ }
120
+ if (query.cid !== undefined) {
121
+ const entryCid = coerceInt(getProperty(entry, 'Cid')) ?? coerceInt(getProperty(entry, 'cid'));
122
+ if (entryCid === undefined || entryCid !== query.cid) {
123
+ return false;
124
+ }
125
+ }
126
+ if (query.levelMin !== undefined) {
127
+ const level = coerceInt(getProperty(entry, 'Level')) ?? coerceInt(getProperty(entry, 'level'));
128
+ if (level === undefined || level < query.levelMin) {
129
+ return false;
130
+ }
131
+ }
132
+ if (query.levelMax !== undefined) {
133
+ const level = coerceInt(getProperty(entry, 'Level')) ?? coerceInt(getProperty(entry, 'level'));
134
+ if (level === undefined || level > query.levelMax) {
135
+ return false;
136
+ }
137
+ }
138
+ if (query.locked !== undefined) {
139
+ const locked = coerceBool(getProperty(entry, 'Lock')) ?? coerceBool(getProperty(entry, 'lock'));
140
+ if (locked === undefined || locked !== true) {
141
+ return false;
142
+ }
143
+ }
144
+ if (query.unlocked !== undefined) {
145
+ const locked = coerceBool(getProperty(entry, 'Lock')) ?? coerceBool(getProperty(entry, 'lock'));
146
+ if (locked === undefined || locked !== false) {
147
+ return false;
148
+ }
149
+ }
150
+ if (query.married !== undefined) {
151
+ const married = coerceBool(getProperty(entry, 'Marry')) ?? coerceBool(getProperty(entry, 'marry'));
152
+ if (married === undefined || married !== true) {
153
+ return false;
154
+ }
155
+ }
156
+ if (query.unmarried !== undefined) {
157
+ const married = coerceBool(getProperty(entry, 'Marry')) ?? coerceBool(getProperty(entry, 'marry'));
158
+ if (married === undefined || married !== false) {
159
+ return false;
160
+ }
161
+ }
162
+ return true;
163
+ }
164
+ function coerceInt(value) {
165
+ if (typeof value === 'number') {
166
+ return Number.isFinite(value) ? Math.floor(value) : undefined;
167
+ }
168
+ if (typeof value === 'string') {
169
+ const n = Number.parseInt(value, 10);
170
+ return Number.isFinite(n) ? n : undefined;
171
+ }
172
+ return undefined;
173
+ }
174
+ function coerceBool(value) {
175
+ if (typeof value === 'boolean') {
176
+ return value;
177
+ }
178
+ if (typeof value === 'number') {
179
+ return value !== 0;
180
+ }
181
+ if (typeof value === 'string') {
182
+ if (value === 'true' || value === '1')
183
+ return true;
184
+ if (value === 'false' || value === '0')
185
+ return false;
186
+ }
187
+ return undefined;
188
+ }
189
+ function selectById(value, id) {
190
+ if (Array.isArray(value)) {
191
+ const item = value.find((entry) => entryMatchesId(entry, id));
192
+ if (item === undefined) {
193
+ throw new Error(`No item found with id: ${id}`);
194
+ }
195
+ return item;
196
+ }
197
+ if (isRecord(value)) {
198
+ if (Object.prototype.hasOwnProperty.call(value, id)) {
199
+ return value[id];
200
+ }
201
+ const item = Object.values(value).find((entry) => entryMatchesId(entry, id));
202
+ if (item === undefined) {
203
+ throw new Error(`No item found with id: ${id}`);
204
+ }
205
+ return item;
206
+ }
207
+ throw new Error('Selected ActiveUserInfoData part is not searchable by id.');
208
+ }
209
+ function entryMatchesId(entry, id) {
210
+ if (!isRecord(entry)) {
211
+ return false;
212
+ }
213
+ const candidates = ['id', 'Id', 'shipId', 'ShipId', 'equipId', 'EquipId', 'mapId', 'MapId'];
214
+ return candidates.some((key) => entry[key] !== undefined && String(entry[key]) === id);
215
+ }
216
+ function limitCollection(value, first) {
217
+ const count = Math.max(0, Math.floor(first));
218
+ if (Array.isArray(value)) {
219
+ return value.slice(0, count);
220
+ }
221
+ if (isRecord(value)) {
222
+ return Object.fromEntries(Object.entries(value).slice(0, count));
223
+ }
224
+ return value;
225
+ }
226
+ function applyFields(value, fields) {
227
+ if (!fields || fields.length === 0) {
228
+ return value;
229
+ }
230
+ if (Array.isArray(value)) {
231
+ return value.map((item) => pickFields(item, fields));
232
+ }
233
+ if (isRecord(value)) {
234
+ const entries = Object.entries(value);
235
+ if (entries.every(([, entry]) => isRecord(entry))) {
236
+ return Object.fromEntries(entries.map(([key, entry]) => [key, pickFields(entry, fields)]));
237
+ }
238
+ return pickFields(value, fields);
239
+ }
240
+ return value;
241
+ }
242
+ function pickFields(value, fields) {
243
+ if (!isRecord(value)) {
244
+ return value;
245
+ }
246
+ const picked = {};
247
+ for (const field of fields) {
248
+ const item = getProperty(value, field);
249
+ if (item !== undefined) {
250
+ picked[field] = item;
251
+ }
252
+ }
253
+ return picked;
254
+ }
255
+ function summarizeActiveInfo(data) {
256
+ if (!isRecord(data)) {
257
+ return { type: describeType(data) };
258
+ }
259
+ return {
260
+ parts: activeInfoParts.map((part) => {
261
+ const value = getProperty(data, part.key);
262
+ return {
263
+ name: part.name,
264
+ key: part.key,
265
+ aliases: part.aliases,
266
+ description: part.description,
267
+ ...summarizeValue(value),
268
+ };
269
+ }),
270
+ };
271
+ }
272
+ function summarizeValue(value) {
273
+ if (value === undefined) {
274
+ return { present: false, type: 'undefined', count: 0 };
275
+ }
276
+ if (Array.isArray(value)) {
277
+ return { present: true, type: 'array', count: value.length };
278
+ }
279
+ if (isRecord(value)) {
280
+ return { present: true, type: 'object', count: Object.keys(value).length };
281
+ }
282
+ return { present: true, type: describeType(value), count: 1 };
283
+ }
284
+ function describeType(value) {
285
+ if (value === null)
286
+ return 'null';
287
+ if (Array.isArray(value))
288
+ return 'array';
289
+ return typeof value;
290
+ }
291
+ function normalizeName(value) {
292
+ return value.replace(/[-_\s]/g, '').toLowerCase();
293
+ }
294
+ function getProperty(value, key) {
295
+ if (!isRecord(value)) {
296
+ return undefined;
297
+ }
298
+ if (Object.prototype.hasOwnProperty.call(value, key)) {
299
+ return value[key];
300
+ }
301
+ const normalized = normalizeName(key);
302
+ const match = Object.keys(value).find((item) => normalizeName(item) === normalized);
303
+ return match ? value[match] : undefined;
304
+ }
305
+ function isRecord(value) {
306
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
307
+ }
308
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type StoreTypeName } from '../configTypes.js';
2
+ import type { GraphQlOptions } from '../graphqlClient.js';
3
+ export interface StoreWriteOptions {
4
+ dryRun?: boolean;
5
+ replace?: boolean;
6
+ expectedCurrentHash?: string;
7
+ }
8
+ export interface StoreRemoveOptions {
9
+ dryRun?: boolean;
10
+ expectedCurrentHash?: string;
11
+ }
12
+ interface StoreApi {
13
+ list(gqlOpts: GraphQlOptions): Promise<unknown>;
14
+ get(gqlOpts: GraphQlOptions, id: string): Promise<unknown>;
15
+ set(gqlOpts: GraphQlOptions, filePath: string, options?: StoreWriteOptions): Promise<unknown>;
16
+ remove(gqlOpts: GraphQlOptions, id: string, options?: StoreRemoveOptions): Promise<unknown>;
17
+ }
18
+ export declare const storeApi: {
19
+ ShipPipe: StoreApi;
20
+ ShipReadyPipe: StoreApi;
21
+ TeamPipe: StoreApi;
22
+ BattleMapConfig: StoreApi;
23
+ };
24
+ export interface StoreReference {
25
+ ownerType: string;
26
+ ownerId?: string;
27
+ ownerName?: string;
28
+ path: string;
29
+ }
30
+ export declare function findReferences(gqlOpts: GraphQlOptions, typeName: StoreTypeName, id: string): Promise<StoreReference[]>;
31
+ export {};
32
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/commands/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAY1D,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,UAAU,QAAQ;IAChB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9F,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7F;AA4JD,eAAO,MAAM,QAAQ;;;;;CAKpB,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,aAAa,EACvB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,cAAc,EAAE,CAAC,CAmC3B"}
@@ -0,0 +1,212 @@
1
+ import { storeTypes } from '../configTypes.js';
2
+ import { gql } from '../graphqlClient.js';
3
+ import { CliError } from '../errors.js';
4
+ import { assertExpectedHash, createWritePlan, hashValue, readJsonObject, valuesEqual, } from '../writeWorkflow.js';
5
+ import { validateStore } from '../validation.js';
6
+ import { getConfig } from './config.js';
7
+ function createStoreApi(typeName) {
8
+ const def = storeTypes[typeName];
9
+ const api = {
10
+ list(gqlOpts) {
11
+ const query = `{ ${def.listField} ${def.selection} }`;
12
+ return gql(gqlOpts, query).then((data) => data[def.listField]);
13
+ },
14
+ get(gqlOpts, id) {
15
+ const query = `
16
+ query GetStoreItem($id: UUID!) {
17
+ ${def.getField}(id: $id) ${def.selection}
18
+ }
19
+ `;
20
+ return gql(gqlOpts, query, { id }).then((data) => data[def.getField]);
21
+ },
22
+ async set(gqlOpts, filePath, options = {}) {
23
+ const patch = readJsonObject(filePath);
24
+ const id = typeof patch.id === 'string' ? patch.id : '';
25
+ const current = id ? await this.get(gqlOpts, id) : null;
26
+ const plan = createWritePlan(current, patch, options.replace);
27
+ const validation = validateStore(typeName, plan.proposed);
28
+ assertExpectedHash(plan.currentHash, options.expectedCurrentHash);
29
+ const planResult = {
30
+ operation: options.dryRun ? 'validate' : current === null ? 'create' : 'update',
31
+ type: typeName,
32
+ id: typeof plan.proposed.id === 'string'
33
+ ? plan.proposed.id
34
+ : null,
35
+ mode: options.replace ? 'replace' : 'merge',
36
+ changed: plan.changed,
37
+ currentHash: plan.currentHash,
38
+ proposedHash: plan.proposedHash,
39
+ changedPaths: plan.changedPaths,
40
+ validation,
41
+ };
42
+ if (!validation.valid) {
43
+ throw new CliError('STORE_VALIDATION_FAILED', `Validation failed for ${typeName}.`, {
44
+ category: 'validation',
45
+ details: { ...planResult, proposed: plan.proposed },
46
+ suggestion: 'Fix every validation error and run with --dry-run again.',
47
+ });
48
+ }
49
+ if (options.dryRun)
50
+ return { ...planResult, proposed: plan.proposed };
51
+ if (!plan.changed)
52
+ return { ...planResult, operation: 'noop', verified: true, value: current };
53
+ const proposedId = plan.proposed.id;
54
+ try {
55
+ await mutateSet(gqlOpts, plan.proposed);
56
+ }
57
+ catch (cause) {
58
+ const rollback = await restoreStoreItem(gqlOpts, proposedId, plan.current);
59
+ if (!rollback.changed)
60
+ throw cause;
61
+ throw new CliError('STORE_WRITE_FAILED_ROLLED_BACK', `Writing ${typeName} failed and the previous value was restored.`, {
62
+ category: 'server',
63
+ details: { ...planResult, rollback },
64
+ cause,
65
+ });
66
+ }
67
+ const verified = await this.get(gqlOpts, proposedId);
68
+ if (!valuesEqual(verified, plan.proposed)) {
69
+ const rollback = await restoreStoreItem(gqlOpts, proposedId, plan.current);
70
+ throw new CliError('STORE_VERIFICATION_FAILED', `The server did not persist ${typeName} exactly as proposed.`, {
71
+ category: 'server',
72
+ details: { ...planResult, verification: { matched: false, actual: verified }, rollback },
73
+ suggestion: rollback.restored
74
+ ? 'The original item was restored. Check backend schema compatibility before retrying.'
75
+ : 'Automatic restoration failed; read the item before any further write.',
76
+ });
77
+ }
78
+ return { ...planResult, verified: true, rollbackRequired: false, value: verified };
79
+ },
80
+ async remove(gqlOpts, id, options = {}) {
81
+ const current = await this.get(gqlOpts, id);
82
+ if (current === null || current === undefined) {
83
+ return { operation: 'noop', type: typeName, id, changed: false, verified: true, reason: 'not_found' };
84
+ }
85
+ const currentHash = hashValue(current);
86
+ assertExpectedHash(currentHash, options.expectedCurrentHash);
87
+ const planResult = { operation: options.dryRun ? 'validate-remove' : 'remove', type: typeName, id, changed: true, currentHash };
88
+ if (options.dryRun)
89
+ return { ...planResult, current };
90
+ try {
91
+ await mutateRemove(gqlOpts, id);
92
+ }
93
+ catch (cause) {
94
+ const rollback = await restoreStoreItem(gqlOpts, id, current);
95
+ if (!rollback.changed)
96
+ throw cause;
97
+ throw new CliError('STORE_REMOVE_FAILED_ROLLED_BACK', `Removing ${typeName} failed and the item was restored.`, {
98
+ category: 'server',
99
+ details: { ...planResult, rollback },
100
+ cause,
101
+ });
102
+ }
103
+ const verified = await this.get(gqlOpts, id);
104
+ if (verified !== null && verified !== undefined) {
105
+ throw new CliError('STORE_REMOVE_VERIFICATION_FAILED', `The server still returns ${typeName} after removal.`, {
106
+ category: 'server',
107
+ details: { ...planResult, actual: verified },
108
+ });
109
+ }
110
+ return { ...planResult, verified: true, rollbackRequired: false };
111
+ },
112
+ };
113
+ async function mutateSet(gqlOpts, input) {
114
+ const mutation = `
115
+ mutation SetStoreItem($item: ${def.inputType}!) {
116
+ ${def.setField}(item: $item) ${def.selection}
117
+ }
118
+ `;
119
+ const data = await gql(gqlOpts, mutation, {
120
+ item: input,
121
+ });
122
+ return data[def.setField];
123
+ }
124
+ async function mutateRemove(gqlOpts, id) {
125
+ const mutation = `
126
+ mutation RemoveStoreItem($id: UUID!) {
127
+ ${def.removeField}(id: $id)
128
+ }
129
+ `;
130
+ const data = await gql(gqlOpts, mutation, { id });
131
+ return data[def.removeField] ?? true;
132
+ }
133
+ async function restoreStoreItem(gqlOpts, id, original) {
134
+ try {
135
+ const actual = await api.get(gqlOpts, id);
136
+ if (valuesEqual(actual, original))
137
+ return { changed: false, restored: true };
138
+ if (original === null || original === undefined) {
139
+ if (actual !== null && actual !== undefined)
140
+ await mutateRemove(gqlOpts, id);
141
+ }
142
+ else {
143
+ await mutateSet(gqlOpts, original);
144
+ }
145
+ const restored = await api.get(gqlOpts, id);
146
+ return { changed: true, restored: valuesEqual(restored, original) };
147
+ }
148
+ catch (cause) {
149
+ return { changed: true, restored: false, reason: cause.message };
150
+ }
151
+ }
152
+ return api;
153
+ }
154
+ export const storeApi = {
155
+ ShipPipe: createStoreApi('ShipPipe'),
156
+ ShipReadyPipe: createStoreApi('ShipReadyPipe'),
157
+ TeamPipe: createStoreApi('TeamPipe'),
158
+ BattleMapConfig: createStoreApi('BattleMapConfig'),
159
+ };
160
+ export async function findReferences(gqlOpts, typeName, id) {
161
+ const references = [];
162
+ if (typeName === 'ShipPipe' || typeName === 'ShipReadyPipe') {
163
+ const teams = collectionRecords(await storeApi.TeamPipe.list(gqlOpts));
164
+ const property = typeName === 'ShipPipe' ? 'shipCheckers' : 'shipReadys';
165
+ for (const team of teams) {
166
+ const slots = asRecord(team[property]);
167
+ if (!slots)
168
+ continue;
169
+ for (let index = 1; index <= 6; index += 1) {
170
+ if (stringArray(slots[`v${index}`]).includes(id)) {
171
+ references.push({
172
+ ownerType: 'TeamPipe',
173
+ ownerId: typeof team.id === 'string' ? team.id : undefined,
174
+ ownerName: typeof team.name === 'string' ? team.name : undefined,
175
+ path: `${property}.v${index}`,
176
+ });
177
+ }
178
+ }
179
+ }
180
+ if (typeName === 'ShipPipe') {
181
+ const decompose = asRecord(await getConfig(gqlOpts, 'GlobalDecomposeConfig'));
182
+ if (stringArray(decompose?.shipPipe).includes(id))
183
+ references.push({ ownerType: 'GlobalDecomposeConfig', path: 'shipPipe' });
184
+ }
185
+ }
186
+ else {
187
+ const mission = asRecord(await getConfig(gqlOpts, 'MissionBattleConfig'));
188
+ const field = typeName === 'TeamPipe' ? 'teamChecker' : 'battleConfigId';
189
+ collectionRecords(mission?.activeBattle).forEach((entry, index) => {
190
+ if (entry[field] === id)
191
+ references.push({
192
+ ownerType: 'MissionBattleConfig',
193
+ ownerName: typeof entry.name === 'string' ? entry.name : undefined,
194
+ path: `activeBattle[${index}].${field}`,
195
+ });
196
+ });
197
+ }
198
+ return references;
199
+ }
200
+ function collectionRecords(value) {
201
+ if (Array.isArray(value))
202
+ return value.map(asRecord).filter((entry) => Boolean(entry));
203
+ const record = asRecord(value);
204
+ return record ? Object.values(record).map(asRecord).filter((entry) => Boolean(entry)) : [];
205
+ }
206
+ function asRecord(value) {
207
+ return typeof value === 'object' && value !== null && !Array.isArray(value) ? value : undefined;
208
+ }
209
+ function stringArray(value) {
210
+ return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
211
+ }
212
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/commands/store.ts"],"names":[],"mappings":"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"}