@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,328 @@
1
+ const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
2
+ const emptyUuid = '00000000-0000-0000-0000-000000000000';
3
+ const shipTypes = new Set([
4
+ 'ALL', 'CV', 'CVL', 'AV', 'BB', 'BBV', 'BC', 'CA', 'CAV', 'CTL2', 'CL', 'BM', 'DD',
5
+ 'SSG', 'SS', 'SC', 'AP', 'FORTRESS', 'AIRPORT', 'PORT', 'MH', 'LS', 'PS', 'ASDG', 'AADG',
6
+ 'CTL', 'CBG', 'BBG', 'CAVP', 'ANTIPATROL', 'BBGV', 'MS', 'NA', 'FLAGSHIP', 'OTHER',
7
+ ]);
8
+ const routeTypes = new Set([
9
+ 'NONE', 'LEVEL_GE', 'LEVEL_LE', 'SHIP_SUM_GE', 'SHIP_SUM_LE', 'SHIP_TYPE_GE', 'SHIP_TYPE_LE',
10
+ 'FLAG_SHIP_LEVEL_GE', 'FLAG_SHIP_LEVEL_LE', 'FLAG_SHIP_TYPE', 'SPY_GE', 'FLAG_SHIP_SPEED_GE',
11
+ 'FLAG_SHIP_SPEED_LE', 'SPEED_MIN_GE', 'SPEED_MIN_LE', 'SPEED_MAX_GE', 'SPEED_MAX_LE',
12
+ 'SPEED_AVG_GE', 'SPEED_AVG_LE', 'LUCKY_GE', 'LUCKY_LE',
13
+ ]);
14
+ const battleFormations = new Set([
15
+ 'UNKNOWN', 'SINGLE_COLUME', 'COMPOUND_COLUME', 'ROUND', 'TERRACED', 'SINGLE_ROW',
16
+ ]);
17
+ export function validateConfig(typeName, value) {
18
+ const issues = [];
19
+ const config = requireRecord(value, '$', issues);
20
+ if (config && typeName === 'MissionBattleConfig')
21
+ validateMissionBattle(config, issues);
22
+ return finish(issues);
23
+ }
24
+ export function validateStore(typeName, value) {
25
+ const issues = [];
26
+ const item = requireRecord(value, '$', issues);
27
+ if (!item)
28
+ return finish(issues);
29
+ validateStoreIdentity(item, issues);
30
+ switch (typeName) {
31
+ case 'ShipPipe':
32
+ validateShipPipe(item, issues);
33
+ break;
34
+ case 'ShipReadyPipe':
35
+ validateShipReadyPipe(item, issues);
36
+ break;
37
+ case 'TeamPipe':
38
+ validateTeamPipe(item, issues);
39
+ break;
40
+ case 'BattleMapConfig':
41
+ validateBattleMap(item, issues);
42
+ break;
43
+ }
44
+ return finish(issues);
45
+ }
46
+ function validateMissionBattle(config, issues) {
47
+ if (typeof config.allowDailyRestart !== 'boolean')
48
+ error(issues, 'REQUIRED_BOOLEAN', '$.allowDailyRestart', 'allowDailyRestart must be boolean.', config.allowDailyRestart, 'boolean');
49
+ if (!Array.isArray(config.activeBattle)) {
50
+ error(issues, 'REQUIRED_ARRAY', '$.activeBattle', 'activeBattle must be an array.', config.activeBattle, 'BattleMission[]');
51
+ return;
52
+ }
53
+ let enabledCount = 0;
54
+ config.activeBattle.forEach((entry, index) => {
55
+ const path = `$.activeBattle[${index}]`;
56
+ const mission = requireRecord(entry, path, issues);
57
+ if (!mission)
58
+ return;
59
+ if (mission.enable === true)
60
+ enabledCount += 1;
61
+ for (const field of ['enable', 'autoRestartDaily', 'autoDecompose', 'teamCheckerContinue', 'onlySpoils', 'autoStopWithSpoils']) {
62
+ if (typeof mission[field] !== 'boolean')
63
+ error(issues, 'REQUIRED_BOOLEAN', `${path}.${field}`, `${field} must be boolean.`, mission[field], 'boolean');
64
+ }
65
+ for (const field of ['autoStopWithFishing', 'completeCount', 'completeCountTarget', 'teamId']) {
66
+ if (!isNonNegativeInteger(mission[field]))
67
+ error(issues, 'INVALID_INTEGER', `${path}.${field}`, `${field} must be a non-negative integer.`, mission[field], 'integer >= 0');
68
+ }
69
+ if (mission.teamId === 0)
70
+ error(issues, 'TEAM_REQUIRED', `${path}.teamId`, 'teamId must identify an account fleet.', mission.teamId, 'integer > 0');
71
+ if (typeof mission.name !== 'string' || !mission.name.trim())
72
+ error(issues, 'NAME_REQUIRED', `${path}.name`, 'Mission name is required.', mission.name, 'non-empty string');
73
+ validateUuid(mission.battleConfigId, `${path}.battleConfigId`, issues, false);
74
+ validateUuid(mission.teamChecker, `${path}.teamChecker`, issues, true);
75
+ if (mission.enable === true && mission.battleConfigId === emptyUuid)
76
+ error(issues, 'MAP_CONFIG_REQUIRED', `${path}.battleConfigId`, 'Enabled missions require a BattleMapConfig ID.', mission.battleConfigId, 'non-empty UUID');
77
+ if (mission.enable === true && Number(mission.completeCountTarget) <= Number(mission.completeCount)) {
78
+ warning(issues, 'MISSION_ALREADY_COMPLETE', path, 'The enabled mission has already reached its completion target.', { completeCount: mission.completeCount, completeCountTarget: mission.completeCountTarget }, 'completeCount < completeCountTarget');
79
+ }
80
+ });
81
+ if (enabledCount > 1) {
82
+ error(issues, 'MULTIPLE_ENABLED_BATTLES', '$.activeBattle', 'The backend executes only the first enabled BattleMission.', enabledCount, 'at most one enabled entry', 'Disable all but the intended entry.');
83
+ }
84
+ }
85
+ function validateStoreIdentity(item, issues) {
86
+ validateUuid(item.id, '$.id', issues, false);
87
+ if (typeof item.name !== 'string' || !item.name.trim())
88
+ error(issues, 'NAME_REQUIRED', '$.name', 'Store item name is required.', item.name, 'non-empty string');
89
+ }
90
+ function validateShipPipe(item, issues) {
91
+ validateEnumArray(item.shipTypeApply, '$.shipTypeApply', shipTypes, issues);
92
+ validateEnumArray(item.shipTypeBan, '$.shipTypeBan', shipTypes, issues);
93
+ for (const field of ['levelRange', 'skillLevelRange', 'hpRate', 'sixthCost'])
94
+ validateRange(item[field], `$.${field}`, issues);
95
+ for (const field of ['isLock', 'isEvo']) {
96
+ if (item[field] !== null && item[field] !== undefined && typeof item[field] !== 'boolean')
97
+ error(issues, 'INVALID_OPTIONAL_BOOLEAN', `$.${field}`, `${field} must be boolean or null.`, item[field], 'boolean|null');
98
+ }
99
+ for (const field of ['shipIdApply', 'shipIdBan'])
100
+ validatePositiveIntegerArray(item[field], `$.${field}`, issues);
101
+ const applyTypes = new Set(asStringArray(item.shipTypeApply));
102
+ const bannedTypes = asStringArray(item.shipTypeBan).filter((entry) => applyTypes.has(entry));
103
+ if (bannedTypes.length > 0)
104
+ warning(issues, 'TYPE_APPLY_BAN_OVERLAP', '$.shipTypeBan', 'Banned ship types override applied ship types.', bannedTypes, 'no overlap');
105
+ const applyIds = new Set(asNumberArray(item.shipIdApply));
106
+ const bannedIds = asNumberArray(item.shipIdBan).filter((entry) => applyIds.has(entry));
107
+ if (bannedIds.length > 0)
108
+ warning(issues, 'CID_APPLY_BAN_OVERLAP', '$.shipIdBan', 'Banned CIDs override applied CIDs.', bannedIds, 'no overlap');
109
+ }
110
+ function validateShipReadyPipe(item, issues) {
111
+ if (typeof item.shipType !== 'string' || !shipTypes.has(item.shipType))
112
+ error(issues, 'INVALID_SHIP_TYPE', '$.shipType', 'shipType is not a backend ShipType enum value.', item.shipType, [...shipTypes]);
113
+ for (const field of ['equipApply1', 'equipApply2', 'equipApply3', 'equipApply4'])
114
+ validatePositiveIntegerArray(item[field], `$.${field}`, issues);
115
+ if (typeof item.useUsedEquip !== 'boolean')
116
+ error(issues, 'REQUIRED_BOOLEAN', '$.useUsedEquip', 'useUsedEquip must be boolean.', item.useUsedEquip, 'boolean');
117
+ if (item.useUsedEquip === true)
118
+ warning(issues, 'USED_EQUIP_SIDE_EFFECT', '$.useUsedEquip', 'The backend may remove equipment from other non-team ships when this is enabled.', true, false, 'Use only with explicit player approval.');
119
+ }
120
+ function validateTeamPipe(item, issues) {
121
+ validateTeamGuidSlots(item.shipCheckers, '$.shipCheckers', issues, true);
122
+ validateTeamGuidSlots(item.shipReadys, '$.shipReadys', issues, false);
123
+ }
124
+ function validateTeamGuidSlots(value, path, issues, requireFirst) {
125
+ const slots = requireRecord(value, path, issues);
126
+ if (!slots)
127
+ return;
128
+ if (!Array.isArray(slots.values) || slots.values.length !== 6) {
129
+ error(issues, 'TEAM_VALUES_REQUIRED', `${path}.values`, 'The deployed GraphQL input requires a six-element values compatibility array.', slots.values, '[v1,v2,v3,v4,v5,v6]');
130
+ }
131
+ let sawEmpty = false;
132
+ for (let index = 1; index <= 6; index += 1) {
133
+ const slotPath = `${path}.v${index}`;
134
+ const slot = slots[`v${index}`];
135
+ const empty = slot === null || slot === undefined || (Array.isArray(slot) && slot.length === 0);
136
+ if (empty) {
137
+ sawEmpty = true;
138
+ if (requireFirst && index === 1)
139
+ error(issues, 'FIRST_SLOT_REQUIRED', slotPath, 'A TeamPipe requires at least one first-position ship checker.', slot, 'non-empty UUID[]');
140
+ continue;
141
+ }
142
+ if (!Array.isArray(slot)) {
143
+ error(issues, 'INVALID_SLOT', slotPath, 'Team slot must be a UUID array or null.', slot, 'UUID[]|null');
144
+ continue;
145
+ }
146
+ if (Array.isArray(slots.values)) {
147
+ const compatibility = slots.values[index - 1];
148
+ if (JSON.stringify(compatibility ?? null) !== JSON.stringify(slot ?? null)) {
149
+ error(issues, 'TEAM_VALUES_MISMATCH', `${path}.values[${index - 1}]`, `values[${index - 1}] must mirror v${index}.`, compatibility, slot);
150
+ }
151
+ }
152
+ if (sawEmpty && requireFirst)
153
+ error(issues, 'NON_CONTIGUOUS_TEAM', slotPath, 'Non-empty team positions cannot follow an empty position.', slot, 'contiguous positions from v1');
154
+ const seen = new Set();
155
+ slot.forEach((id, itemIndex) => {
156
+ validateUuid(id, `${slotPath}[${itemIndex}]`, issues, false);
157
+ if (typeof id === 'string' && seen.has(id))
158
+ warning(issues, 'DUPLICATE_REFERENCE', `${slotPath}[${itemIndex}]`, 'Duplicate pipe reference in one slot.', id, 'unique UUIDs');
159
+ if (typeof id === 'string')
160
+ seen.add(id);
161
+ });
162
+ }
163
+ }
164
+ function validateBattleMap(item, issues) {
165
+ if (!isPositiveInteger(item.mapInitNodeId))
166
+ error(issues, 'MAP_NODE_REQUIRED', '$.mapInitNodeId', 'mapInitNodeId must be a positive map initial-node ID.', item.mapInitNodeId, 'integer > 0');
167
+ validateTeamRanges(item.teamHPCondition, '$.teamHPCondition', issues, false);
168
+ if (!Array.isArray(item.nodeConfigs)) {
169
+ error(issues, 'NODE_CONFIGS_REQUIRED', '$.nodeConfigs', 'nodeConfigs must use the GraphQL dictionary list shape.', item.nodeConfigs, '[{key:Int,value:BattleMapNodeConfigInput}]');
170
+ return;
171
+ }
172
+ const keys = new Set();
173
+ item.nodeConfigs.forEach((entry, index) => {
174
+ const path = `$.nodeConfigs[${index}]`;
175
+ const pair = requireRecord(entry, path, issues);
176
+ if (!pair)
177
+ return;
178
+ if (!isPositiveInteger(pair.key))
179
+ error(issues, 'INVALID_NODE_ID', `${path}.key`, 'Node dictionary key must be a positive node ID.', pair.key, 'integer > 0');
180
+ if (typeof pair.key === 'number' && keys.has(pair.key))
181
+ error(issues, 'DUPLICATE_NODE_ID', `${path}.key`, 'Node configuration IDs must be unique.', pair.key, 'unique node ID');
182
+ if (typeof pair.key === 'number')
183
+ keys.add(pair.key);
184
+ validateBattleNode(pair.value, `${path}.value`, issues);
185
+ });
186
+ }
187
+ function validateBattleNode(value, path, issues) {
188
+ const node = requireRecord(value, path, issues);
189
+ if (!node)
190
+ return;
191
+ if (typeof node.isEndPoint !== 'boolean')
192
+ error(issues, 'REQUIRED_BOOLEAN', `${path}.isEndPoint`, 'isEndPoint must be boolean.', node.isEndPoint, 'boolean');
193
+ validateTeamRanges(node.teamHPCondition, `${path}.teamHPCondition`, issues, true);
194
+ if (node.battleConfig !== null && node.battleConfig !== undefined) {
195
+ const battle = requireRecord(node.battleConfig, `${path}.battleConfig`, issues);
196
+ if (battle) {
197
+ for (const field of ['timeMin', 'timeOffset', 'buffId'])
198
+ if (!isNonNegativeInteger(battle[field]))
199
+ error(issues, 'INVALID_INTEGER', `${path}.battleConfig.${field}`, `${field} must be a non-negative integer.`, battle[field], 'integer >= 0');
200
+ if (typeof battle.battleFormation !== 'string' || !battleFormations.has(battle.battleFormation))
201
+ error(issues, 'INVALID_FORMATION', `${path}.battleConfig.battleFormation`, 'Unknown BattleFormation enum value.', battle.battleFormation, [...battleFormations]);
202
+ if (typeof battle.nightAtk !== 'boolean')
203
+ error(issues, 'REQUIRED_BOOLEAN', `${path}.battleConfig.nightAtk`, 'nightAtk must be boolean.', battle.nightAtk, 'boolean');
204
+ validateDictionaryChecks(battle.battleFormationCheck, `${path}.battleConfig.battleFormationCheck`, issues);
205
+ }
206
+ }
207
+ validateRouteCheck(node.nodeBackConfig, `${path}.nodeBackConfig`, issues, true);
208
+ validateRouteCheck(node.nodeRoundConfig, `${path}.nodeRoundConfig`, issues, true);
209
+ }
210
+ function validateDictionaryChecks(value, path, issues) {
211
+ if (!Array.isArray(value)) {
212
+ error(issues, 'INVALID_DICTIONARY', path, 'battleFormationCheck must use the GraphQL dictionary list shape.', value, '[{key:BattleFormation,value:...}]');
213
+ return;
214
+ }
215
+ value.forEach((entry, index) => {
216
+ const pair = requireRecord(entry, `${path}[${index}]`, issues);
217
+ if (!pair)
218
+ return;
219
+ if (typeof pair.key !== 'string' || !battleFormations.has(pair.key))
220
+ error(issues, 'INVALID_FORMATION', `${path}[${index}].key`, 'Unknown BattleFormation enum key.', pair.key, [...battleFormations]);
221
+ validateRouteCheck(pair.value, `${path}[${index}].value`, issues, false);
222
+ });
223
+ }
224
+ function validateRouteCheck(value, path, issues, optional) {
225
+ if ((value === null || value === undefined) && optional)
226
+ return;
227
+ const check = requireRecord(value, path, issues);
228
+ if (!check)
229
+ return;
230
+ if (!isNonNegativeInteger(check.passCount))
231
+ error(issues, 'INVALID_PASS_COUNT', `${path}.passCount`, 'passCount must be a non-negative integer.', check.passCount, 'integer >= 0');
232
+ if (!Array.isArray(check.conditions)) {
233
+ error(issues, 'CONDITIONS_REQUIRED', `${path}.conditions`, 'conditions must be an array.', check.conditions, 'route condition[]');
234
+ return;
235
+ }
236
+ check.conditions.forEach((entry, index) => {
237
+ const conditionPath = `${path}.conditions[${index}]`;
238
+ const condition = requireRecord(entry, conditionPath, issues);
239
+ if (!condition)
240
+ return;
241
+ if (typeof condition.number !== 'number' || !Number.isFinite(condition.number))
242
+ error(issues, 'INVALID_ROUTE_NUMBER', `${conditionPath}.number`, 'Route condition number must be finite.', condition.number, 'number');
243
+ if (typeof condition.routeType !== 'string' || !routeTypes.has(condition.routeType))
244
+ error(issues, 'INVALID_ROUTE_TYPE', `${conditionPath}.routeType`, 'Unknown RouteType enum value.', condition.routeType, [...routeTypes]);
245
+ if (typeof condition.shipType !== 'string' || !shipTypes.has(condition.shipType))
246
+ error(issues, 'INVALID_SHIP_TYPE', `${conditionPath}.shipType`, 'Unknown ShipType enum value.', condition.shipType, [...shipTypes]);
247
+ });
248
+ }
249
+ function validateTeamRanges(value, path, issues, optional) {
250
+ if ((value === null || value === undefined) && optional)
251
+ return;
252
+ const ranges = requireRecord(value, path, issues);
253
+ if (!ranges)
254
+ return;
255
+ for (let index = 1; index <= 6; index += 1)
256
+ validateRange(ranges[`v${index}`], `${path}.v${index}`, issues);
257
+ }
258
+ function validateRange(value, path, issues) {
259
+ if (value === null || value === undefined)
260
+ return;
261
+ const range = requireRecord(value, path, issues);
262
+ if (!range)
263
+ return;
264
+ if (!Number.isInteger(range.min) || !Number.isInteger(range.max)) {
265
+ error(issues, 'INVALID_RANGE', path, 'Range min and max must be integers.', value, '{min:Int,max:Int}');
266
+ }
267
+ else if (Number(range.min) > Number(range.max)) {
268
+ error(issues, 'INVALID_RANGE_ORDER', path, 'Range min cannot exceed max.', value, 'min <= max');
269
+ }
270
+ }
271
+ function validateEnumArray(value, path, allowed, issues) {
272
+ if (value === null || value === undefined)
273
+ return;
274
+ if (!Array.isArray(value)) {
275
+ error(issues, 'INVALID_ENUM_ARRAY', path, 'Expected an enum array or null.', value, 'string[]|null');
276
+ return;
277
+ }
278
+ value.forEach((entry, index) => {
279
+ if (typeof entry !== 'string' || !allowed.has(entry))
280
+ error(issues, 'INVALID_ENUM', `${path}[${index}]`, 'Unknown backend enum value.', entry, [...allowed]);
281
+ });
282
+ }
283
+ function validatePositiveIntegerArray(value, path, issues) {
284
+ if (value === null || value === undefined)
285
+ return;
286
+ if (!Array.isArray(value)) {
287
+ error(issues, 'INVALID_ID_ARRAY', path, 'Expected a positive integer array or null.', value, 'integer[]|null');
288
+ return;
289
+ }
290
+ value.forEach((entry, index) => {
291
+ if (!isPositiveInteger(entry))
292
+ error(issues, 'INVALID_ID', `${path}[${index}]`, 'ID must be a positive integer.', entry, 'integer > 0');
293
+ });
294
+ }
295
+ function validateUuid(value, path, issues, allowEmpty) {
296
+ if (typeof value !== 'string' || (value === emptyUuid ? !allowEmpty : !uuidPattern.test(value))) {
297
+ error(issues, 'INVALID_UUID', path, 'Expected a valid non-empty UUID.', value, allowEmpty ? 'UUID (empty UUID allowed)' : 'non-empty UUID');
298
+ }
299
+ }
300
+ function requireRecord(value, path, issues) {
301
+ if (typeof value === 'object' && value !== null && !Array.isArray(value))
302
+ return value;
303
+ error(issues, 'OBJECT_REQUIRED', path, 'Expected an object.', value, 'object');
304
+ return undefined;
305
+ }
306
+ function finish(issues) {
307
+ const errors = issues.filter((issue) => issue.severity === 'error');
308
+ return { valid: errors.length === 0, errors, warnings: issues.filter((issue) => issue.severity === 'warning') };
309
+ }
310
+ function error(issues, code, path, message, current, expected, suggestion) {
311
+ issues.push({ code, severity: 'error', path, message, current, expected, suggestion });
312
+ }
313
+ function warning(issues, code, path, message, current, expected, suggestion) {
314
+ issues.push({ code, severity: 'warning', path, message, current, expected, suggestion });
315
+ }
316
+ function isNonNegativeInteger(value) {
317
+ return Number.isInteger(value) && Number(value) >= 0;
318
+ }
319
+ function isPositiveInteger(value) {
320
+ return Number.isInteger(value) && Number(value) > 0;
321
+ }
322
+ function asStringArray(value) {
323
+ return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
324
+ }
325
+ function asNumberArray(value) {
326
+ return Array.isArray(value) ? value.filter((entry) => typeof entry === 'number') : [];
327
+ }
328
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface WritePlan<T = unknown> {
2
+ current: T | null;
3
+ proposed: T;
4
+ changed: boolean;
5
+ currentHash: string | null;
6
+ proposedHash: string;
7
+ changedPaths: string[];
8
+ }
9
+ export declare function readJsonObject(filePath: string): Record<string, unknown>;
10
+ export declare function createWritePlan<T>(current: T | null, patch: unknown, replace?: boolean): WritePlan<T>;
11
+ export declare function assertExpectedHash(currentHash: string | null, expectedHash?: string): void;
12
+ export declare function valuesEqual(left: unknown, right: unknown): boolean;
13
+ export declare function hashValue(value: unknown): string;
14
+ export declare function stripReadOnly(value: unknown): unknown;
15
+ export declare function deepMerge(current: unknown, patch: unknown): unknown;
16
+ //# sourceMappingURL=writeWorkflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeWorkflow.d.ts","sourceRoot":"","sources":["../src/writeWorkflow.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO;IACpC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBxE;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,UAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAgBnG;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAS1F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAElE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CASnE"}
@@ -0,0 +1,135 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFileSync } from 'node:fs';
3
+ import { CliError } from './errors.js';
4
+ export function readJsonObject(filePath) {
5
+ let parsed;
6
+ try {
7
+ parsed = JSON.parse(readFileSync(filePath, 'utf8'));
8
+ }
9
+ catch (cause) {
10
+ throw new CliError('INPUT_FILE_INVALID', `Unable to read JSON input file: ${filePath}`, {
11
+ category: 'io',
12
+ field: 'file',
13
+ details: { path: filePath, reason: cause.message },
14
+ suggestion: 'Provide a readable UTF-8 JSON file.',
15
+ cause,
16
+ });
17
+ }
18
+ if (!isRecord(parsed)) {
19
+ throw new CliError('INPUT_OBJECT_REQUIRED', 'The JSON input must be an object.', {
20
+ category: 'validation',
21
+ field: 'file',
22
+ details: { path: filePath, actualType: Array.isArray(parsed) ? 'array' : typeof parsed },
23
+ });
24
+ }
25
+ return parsed;
26
+ }
27
+ export function createWritePlan(current, patch, replace = false) {
28
+ const cleanCurrent = current === null ? null : stripReadOnly(current);
29
+ const cleanPatch = stripReadOnly(patch);
30
+ const proposed = (replace || cleanCurrent === null
31
+ ? cleanPatch
32
+ : deepMerge(cleanCurrent, cleanPatch));
33
+ const currentHash = cleanCurrent === null ? null : hashValue(cleanCurrent);
34
+ const proposedHash = hashValue(proposed);
35
+ return {
36
+ current: cleanCurrent,
37
+ proposed,
38
+ changed: currentHash !== proposedHash,
39
+ currentHash,
40
+ proposedHash,
41
+ changedPaths: diffPaths(cleanCurrent, proposed),
42
+ };
43
+ }
44
+ export function assertExpectedHash(currentHash, expectedHash) {
45
+ if (!expectedHash)
46
+ return;
47
+ if (currentHash !== expectedHash) {
48
+ throw new CliError('CONCURRENT_MODIFICATION', 'The current server value no longer matches the expected hash.', {
49
+ category: 'conflict',
50
+ details: { currentHash, expectedHash },
51
+ suggestion: 'Read the latest value, reapply the intended patch, validate, and retry.',
52
+ });
53
+ }
54
+ }
55
+ export function valuesEqual(left, right) {
56
+ return hashValue(stripReadOnly(left)) === hashValue(stripReadOnly(right));
57
+ }
58
+ export function hashValue(value) {
59
+ return createHash('sha256').update(stableStringify(value)).digest('hex');
60
+ }
61
+ export function stripReadOnly(value) {
62
+ if (Array.isArray(value))
63
+ return value.map(stripReadOnly);
64
+ if (!isRecord(value))
65
+ return value;
66
+ return Object.fromEntries(Object.entries(value)
67
+ .filter(([key]) => key !== 'description' && key !== '__typename')
68
+ .map(([key, entry]) => [key, stripReadOnly(entry)]));
69
+ }
70
+ export function deepMerge(current, patch) {
71
+ if (!isRecord(current) || !isRecord(patch))
72
+ return cloneValue(patch);
73
+ const result = { ...cloneValue(current) };
74
+ for (const [key, value] of Object.entries(patch)) {
75
+ result[key] = isRecord(value) && isRecord(current[key])
76
+ ? deepMerge(current[key], value)
77
+ : cloneValue(value);
78
+ }
79
+ return result;
80
+ }
81
+ function cloneValue(value) {
82
+ if (Array.isArray(value))
83
+ return value.map(cloneValue);
84
+ if (isRecord(value))
85
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, cloneValue(entry)]));
86
+ return value;
87
+ }
88
+ function stableStringify(value) {
89
+ return JSON.stringify(canonicalize(value));
90
+ }
91
+ function canonicalize(value) {
92
+ if (Array.isArray(value)) {
93
+ const items = value.map(canonicalize);
94
+ if (items.every((item) => isRecord(item) && ('key' in item))) {
95
+ return items.sort((left, right) => String(left.key)
96
+ .localeCompare(String(right.key), 'en', { numeric: true }));
97
+ }
98
+ return items;
99
+ }
100
+ if (!isRecord(value))
101
+ return value;
102
+ return Object.fromEntries(Object.keys(value).sort().map((key) => [key, canonicalize(value[key])]));
103
+ }
104
+ function diffPaths(current, proposed, path = '$') {
105
+ if (valuesEqualLeaf(current, proposed))
106
+ return [];
107
+ if (Array.isArray(current) && Array.isArray(proposed)) {
108
+ const paths = [];
109
+ const max = Math.max(current.length, proposed.length);
110
+ for (let index = 0; index < max; index += 1) {
111
+ paths.push(...diffPaths(current[index], proposed[index], `${path}[${index}]`));
112
+ }
113
+ return paths;
114
+ }
115
+ if (isRecord(current) && isRecord(proposed)) {
116
+ const paths = [];
117
+ const keys = new Set([...Object.keys(current), ...Object.keys(proposed)]);
118
+ for (const key of [...keys].sort()) {
119
+ paths.push(...diffPaths(current[key], proposed[key], `${path}.${key}`));
120
+ }
121
+ return paths;
122
+ }
123
+ return [path];
124
+ }
125
+ function valuesEqualLeaf(left, right) {
126
+ if (left === right)
127
+ return true;
128
+ if (Number.isNaN(left) && Number.isNaN(right))
129
+ return true;
130
+ return false;
131
+ }
132
+ function isRecord(value) {
133
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
134
+ }
135
+ //# sourceMappingURL=writeWorkflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeWorkflow.js","sourceRoot":"","sources":["../src/writeWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAWvC,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAY,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,mCAAmC,QAAQ,EAAE,EAAE;YACtF,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAG,KAAe,CAAC,OAAO,EAAE;YAC7D,UAAU,EAAE,qCAAqC;YACjD,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE,mCAAmC,EAAE;YAC/E,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,EAAE;SACzF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAI,OAAiB,EAAE,KAAc,EAAE,OAAO,GAAG,KAAK;IACnF,MAAM,YAAY,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAM,CAAC;IAC3E,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,YAAY,KAAK,IAAI;QAChD,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAM,CAAC;IAC9C,MAAM,WAAW,GAAG,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,QAAQ;QACR,OAAO,EAAE,WAAW,KAAK,YAAY;QACrC,WAAW;QACX,YAAY;QACZ,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAA0B,EAAE,YAAqB;IAClF,IAAI,CAAC,YAAY;QAAE,OAAO;IAC1B,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,+DAA+D,EAAE;YAC7G,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE;YACtC,UAAU,EAAE,yEAAyE;SACtF,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,KAAc;IACvD,OAAO,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,YAAY,CAAC;SAChE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,KAAc;IACxD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IACrE,MAAM,MAAM,GAA4B,EAAE,GAAG,UAAU,CAAC,OAAO,CAA4B,EAAE,CAAC;IAC9F,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrD,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;YAChC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAE,IAAgC,CAAC,GAAG,CAAC;iBAC7E,aAAa,CAAC,MAAM,CAAE,KAAiC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACxE,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,OAAgB,EAAE,QAAiB,EAAE,IAAI,GAAG,GAAG;IAChE,IAAI,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAClD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,IAAa,EAAE,KAAc;IACpD,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@autonoelle/wsg-active",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "files": [
7
+ "dist",
8
+ "README.md"
9
+ ],
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "bin": {
14
+ "autonoelle-wsg-active": "dist/index.js"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "check": "tsc --noEmit",
19
+ "test": "npm run build && node --test \"dist/tests/*.test.js\"",
20
+ "start": "node dist/index.js",
21
+ "prepack": "npm run build",
22
+ "prepublishOnly": "npm run check && npm test"
23
+ },
24
+ "dependencies": {
25
+ "commander": "^12.1.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^22.0.0",
29
+ "typescript": "^5.5.0"
30
+ }
31
+ }