isaacscript 2.0.13-dev.0 → 2.0.14-dev.10
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.
- package/LICENSE +674 -0
- package/README.md +4 -6
- package/file-templates/dynamic/README.md +3 -0
- package/file-templates/dynamic/gitignore +144 -0
- package/file-templates/dynamic/main.ts +19 -0
- package/file-templates/dynamic/metadata.vdf +6 -0
- package/file-templates/dynamic/metadata.xml +8 -0
- package/file-templates/dynamic/package.json +20 -0
- package/file-templates/static/.cspell.json.template +21 -0
- package/file-templates/static/.env_template +2 -0
- package/file-templates/static/.eslintrc.js.template +24 -0
- package/file-templates/static/.gitattributes +9 -0
- package/file-templates/static/.github/workflows/ci.yml +54 -0
- package/file-templates/static/.prettierignore +14 -0
- package/file-templates/static/.prettierrc.js +42 -0
- package/file-templates/static/.vscode/extensions.json +10 -0
- package/file-templates/static/.vscode/settings.json +79 -0
- package/file-templates/static/LICENSE +674 -0
- package/file-templates/static/build.sh +15 -0
- package/file-templates/static/check-orphaned-words.sh +58 -0
- package/file-templates/static/lint.sh +39 -0
- package/file-templates/static/nuke.sh +18 -0
- package/file-templates/static/plugins/addCrashDebugStatements.ts +40 -0
- package/file-templates/static/plugins/addIsaacScriptCommentHeader.ts +37 -0
- package/file-templates/static/plugins/noExtendedEnums.ts +69 -0
- package/file-templates/static/publish.sh +10 -0
- package/file-templates/static/run.sh +10 -0
- package/file-templates/static/src/bundleEntry.ts +10 -0
- package/file-templates/static/tsconfig.eslint.json +11 -0
- package/file-templates/static/tsconfig.json +33 -0
- package/file-templates/static/update.sh +21 -0
- package/file-templates/static-alt/.prettierignore-base +5 -0
- package/file-templates/static-alt/.prettierrc-base.js +30 -0
- package/file-templates/static-alt/.vscode/extensions-typescript.json +9 -0
- package/file-templates/static-alt/.vscode/settings-typescript.json +66 -0
- package/file-templates/static-alt/check-file-updates.sh +67 -0
- package/isaacscript-watcher/.luacheckrc +96 -0
- package/isaacscript-watcher/README.md +8 -0
- package/isaacscript-watcher/main.lua +270 -0
- package/isaacscript-watcher/metadata.xml +7 -0
- package/isaacscript-watcher/resources/gfx/logo.anm2 +27 -0
- package/isaacscript-watcher/resources/gfx/logo.png +0 -0
- package/package.json +39 -2
- package/src/checkForWindowsTerminalBugs.js +75 -79
- package/src/checkForWindowsTerminalBugs.js.map +1 -1
- package/src/commands/copy/copy.js +32 -32
- package/src/commands/init/checkIfProjectPathExists.js +27 -29
- package/src/commands/init/checkIfProjectPathExists.js.map +1 -1
- package/src/commands/init/checkModSubdirectory.js +15 -15
- package/src/commands/init/checkModTargetDirectory.js +30 -32
- package/src/commands/init/checkModTargetDirectory.js.map +1 -1
- package/src/commands/init/createMod.js +142 -137
- package/src/commands/init/createMod.js.map +1 -1
- package/src/commands/init/getModsDir.js +55 -57
- package/src/commands/init/getModsDir.js.map +1 -1
- package/src/commands/init/getProjectPath.js +88 -92
- package/src/commands/init/getProjectPath.js.map +1 -1
- package/src/commands/init/git.js +150 -152
- package/src/commands/init/git.js.map +1 -1
- package/src/commands/init/init.js +65 -69
- package/src/commands/init/init.js.map +1 -1
- package/src/commands/init/installVSCodeExtensions.js +32 -32
- package/src/commands/init/promptSaveSlot.js +21 -24
- package/src/commands/init/promptSaveSlot.js.map +1 -1
- package/src/commands/init/promptVSCode.js +24 -26
- package/src/commands/init/promptVSCode.js.map +1 -1
- package/src/commands/monitor/constants.js +4 -4
- package/src/commands/monitor/copyWatcherMod.js +38 -38
- package/src/commands/monitor/modDirectorySyncer/modDirectorySyncer.js +49 -49
- package/src/commands/monitor/monitor.js +146 -146
- package/src/commands/monitor/notifyGame.js +57 -57
- package/src/commands/monitor/saveDatWriter/saveDatWriter.js +116 -116
- package/src/commands/monitor/saveDatWriter/types.js +2 -2
- package/src/commands/monitor/spawnSaveDatWriter.js +34 -34
- package/src/commands/monitor/touchWatcherSaveDatFiles.js +20 -20
- package/src/commands/publish/publish.js +220 -220
- package/src/configFile.js +63 -65
- package/src/configFile.js.map +1 -1
- package/src/constants.js +59 -59
- package/src/constants.js.map +1 -1
- package/src/exec.js +95 -95
- package/src/file.js +193 -193
- package/src/main.js +117 -121
- package/src/main.js.map +1 -1
- package/src/parseArgs.js +106 -106
- package/src/prompt.js +86 -92
- package/src/prompt.js.map +1 -1
- package/src/types/Command.js +4 -4
- package/src/types/Config.js +12 -12
- package/src/types/GitHubCLIHostsYAML.js +2 -2
- package/src/utils.js +81 -81
- package/src/validateInIsaacScriptProject.js +26 -26
- package/src/validateNodeVersion.js +24 -24
- package/src/validateOS.js +16 -16
- package/src/checkForWindowsTerminalBugs.d.ts +0 -5
- package/src/commands/copy/copy.d.ts +0 -3
- package/src/commands/init/checkIfProjectPathExists.d.ts +0 -1
- package/src/commands/init/checkModSubdirectory.d.ts +0 -1
- package/src/commands/init/checkModTargetDirectory.d.ts +0 -1
- package/src/commands/init/createMod.d.ts +0 -1
- package/src/commands/init/getModsDir.d.ts +0 -1
- package/src/commands/init/getProjectPath.d.ts +0 -1
- package/src/commands/init/git.d.ts +0 -4
- package/src/commands/init/init.d.ts +0 -1
- package/src/commands/init/installVSCodeExtensions.d.ts +0 -1
- package/src/commands/init/promptSaveSlot.d.ts +0 -1
- package/src/commands/init/promptVSCode.d.ts +0 -1
- package/src/commands/monitor/constants.d.ts +0 -1
- package/src/commands/monitor/copyWatcherMod.d.ts +0 -2
- package/src/commands/monitor/modDirectorySyncer/modDirectorySyncer.d.ts +0 -1
- package/src/commands/monitor/monitor.d.ts +0 -2
- package/src/commands/monitor/notifyGame.d.ts +0 -3
- package/src/commands/monitor/saveDatWriter/saveDatWriter.d.ts +0 -1
- package/src/commands/monitor/saveDatWriter/types.d.ts +0 -5
- package/src/commands/monitor/spawnSaveDatWriter.d.ts +0 -4
- package/src/commands/monitor/touchWatcherSaveDatFiles.d.ts +0 -2
- package/src/commands/publish/publish.d.ts +0 -2
- package/src/configFile.d.ts +0 -4
- package/src/constants.d.ts +0 -34
- package/src/exec.d.ts +0 -4
- package/src/file.d.ts +0 -12
- package/src/main.d.ts +0 -2
- package/src/parseArgs.d.ts +0 -1
- package/src/prompt.d.ts +0 -5
- package/src/types/Command.d.ts +0 -2
- package/src/types/Config.d.ts +0 -18
- package/src/types/GitHubCLIHostsYAML.d.ts +0 -7
- package/src/utils.d.ts +0 -13
- package/src/validateInIsaacScriptProject.d.ts +0 -1
- package/src/validateNodeVersion.d.ts +0 -5
- package/src/validateOS.d.ts +0 -1
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
-- Includes
|
|
2
|
+
local json = require("json")
|
|
3
|
+
|
|
4
|
+
-- Constants
|
|
5
|
+
local MOD_NAME = "isaacscript-watcher"
|
|
6
|
+
local RESTART_GAME_ON_RECOMPILATION = true
|
|
7
|
+
local FRAMES_BEFORE_DISCONNECTED = 2 * 60 -- 2 seconds
|
|
8
|
+
local FRAMES_BEFORE_TEXT_FADE = 2 * 60 -- 2 seconds
|
|
9
|
+
local SPRITE_BOTTOM_RIGHT_OFFSET = Vector(-35, -60)
|
|
10
|
+
-- (enough so that it does not overlap with a pocket active + 2 pocket items)
|
|
11
|
+
|
|
12
|
+
-- Mod variables
|
|
13
|
+
local saveData = {} -- An array of message objects.
|
|
14
|
+
local restartFrame = 0
|
|
15
|
+
local messageArray = {}
|
|
16
|
+
local frameOfLastMsg = 0
|
|
17
|
+
local frameOfLastSuccessfulLoad = 0
|
|
18
|
+
local game = Game()
|
|
19
|
+
local font = Font()
|
|
20
|
+
font:Load("font/pftempestasevencondensed.fnt") -- A vanilla font good for this kind of text.
|
|
21
|
+
local connected = false
|
|
22
|
+
local sprite = nil
|
|
23
|
+
|
|
24
|
+
local IsaacScriptWatcher = RegisterMod("IsaacScript Watcher", 1)
|
|
25
|
+
|
|
26
|
+
-- On mod initialization, nuke the "save#.dat" folder to get rid of old messages that might be left
|
|
27
|
+
-- there from IsaacScript.
|
|
28
|
+
IsaacScriptWatcher:SaveData("")
|
|
29
|
+
|
|
30
|
+
local function pushMessageArray(msg)
|
|
31
|
+
frameOfLastMsg = Isaac.GetFrameCount()
|
|
32
|
+
|
|
33
|
+
messageArray[#messageArray + 1] = msg
|
|
34
|
+
if #messageArray > 10 then
|
|
35
|
+
-- We only want to show 10 messages at a time.
|
|
36
|
+
table.remove(messageArray, 1)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
local function getScreenBottomRightPos()
|
|
41
|
+
local screenWidth = Isaac.GetScreenWidth();
|
|
42
|
+
local screenHeight = Isaac.GetScreenHeight();
|
|
43
|
+
|
|
44
|
+
return Vector(screenWidth, screenHeight)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
-- ModCallbacks.MC_POST_RENDER (2)
|
|
48
|
+
function IsaacScriptWatcher:PostRender()
|
|
49
|
+
-- Don't do anything while fading in to a new run to prevent crashes.
|
|
50
|
+
if game:GetFrameCount() < 1 then
|
|
51
|
+
return
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
IsaacScriptWatcher:RenderSprite()
|
|
55
|
+
IsaacScriptWatcher:RenderText()
|
|
56
|
+
IsaacScriptWatcher:LoadSaveDat()
|
|
57
|
+
IsaacScriptWatcher:CheckInput()
|
|
58
|
+
IsaacScriptWatcher:CheckRestart()
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
function IsaacScriptWatcher:RenderSprite()
|
|
62
|
+
-- Determine if IsaacScript is connected or not.
|
|
63
|
+
local frameCount = Isaac.GetFrameCount()
|
|
64
|
+
connected = frameCount - frameOfLastSuccessfulLoad <= FRAMES_BEFORE_DISCONNECTED
|
|
65
|
+
|
|
66
|
+
-- Set the sprite
|
|
67
|
+
if connected then
|
|
68
|
+
if sprite == nil then
|
|
69
|
+
sprite = Sprite()
|
|
70
|
+
sprite:Load("gfx/logo.anm2", true)
|
|
71
|
+
sprite:SetFrame("Default", 0)
|
|
72
|
+
end
|
|
73
|
+
else
|
|
74
|
+
if sprite ~= nil then
|
|
75
|
+
sprite = nil
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
-- Render it
|
|
80
|
+
if sprite ~= nil then
|
|
81
|
+
local bottomRightPos = getScreenBottomRightPos()
|
|
82
|
+
local position = bottomRightPos + SPRITE_BOTTOM_RIGHT_OFFSET
|
|
83
|
+
sprite:RenderLayer(0, position)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
function IsaacScriptWatcher:RenderText()
|
|
88
|
+
-- Don't draw IsaacScript text when custom consoles are open.
|
|
89
|
+
if AwaitingTextInput then
|
|
90
|
+
return
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
if frameOfLastMsg == 0 then
|
|
94
|
+
return
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
if game:IsPaused() then
|
|
98
|
+
return
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
if ModConfigMenu ~= nil then
|
|
102
|
+
if ModConfigMenu.IsVisible then
|
|
103
|
+
return
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
-- Local variables
|
|
108
|
+
local x = 60
|
|
109
|
+
local y = 90
|
|
110
|
+
local scale = 1
|
|
111
|
+
local lineHeight = font:GetLineHeight() * scale
|
|
112
|
+
|
|
113
|
+
-- The text will slowly fade out.
|
|
114
|
+
local elapsedFrames = Isaac.GetFrameCount() - frameOfLastMsg
|
|
115
|
+
local alpha
|
|
116
|
+
if elapsedFrames <= FRAMES_BEFORE_TEXT_FADE then
|
|
117
|
+
alpha = 1
|
|
118
|
+
else
|
|
119
|
+
local fadeFrames = elapsedFrames - FRAMES_BEFORE_TEXT_FADE
|
|
120
|
+
alpha = 1 - (0.02 * fadeFrames)
|
|
121
|
+
end
|
|
122
|
+
if alpha <= 0 then
|
|
123
|
+
frameOfLastMsg = 0
|
|
124
|
+
return
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
local white = KColor(1, 1, 1, alpha)
|
|
128
|
+
local red = KColor(1, 0, 0, alpha)
|
|
129
|
+
local green = KColor(0, 1, 0, alpha)
|
|
130
|
+
|
|
131
|
+
-- Go through each message.
|
|
132
|
+
for i, msg in ipairs(messageArray) do
|
|
133
|
+
local color = white
|
|
134
|
+
|
|
135
|
+
local hasSuccess = string.match(msg, "Compilation successful.")
|
|
136
|
+
if hasSuccess ~= nil then
|
|
137
|
+
color = green
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
local hasErrors = string.match(msg, "Found [0-9]+ errors.")
|
|
141
|
+
if hasErrors ~= nil then
|
|
142
|
+
color = red
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
font:DrawStringScaledUTF8(
|
|
146
|
+
msg,
|
|
147
|
+
x,
|
|
148
|
+
y + ((i - 1) * lineHeight),
|
|
149
|
+
scale,
|
|
150
|
+
scale,
|
|
151
|
+
color,
|
|
152
|
+
0,
|
|
153
|
+
true
|
|
154
|
+
)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
function IsaacScriptWatcher:LoadSaveDat()
|
|
159
|
+
-- Local variables
|
|
160
|
+
local isaacFrameCount = Isaac.GetFrameCount()
|
|
161
|
+
|
|
162
|
+
-- Read the "save.dat" file every third second, since file reads are expensive.
|
|
163
|
+
if isaacFrameCount % 20 ~= 0 then
|
|
164
|
+
return
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
-- Check to see if there a "save.dat" file for this save slot.
|
|
168
|
+
if not Isaac.HasModData(IsaacScriptWatcher) then
|
|
169
|
+
IsaacScriptWatcher:ClearSaveDat()
|
|
170
|
+
return
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
-- The server will write JSON data for us to the "save#.dat" file in the mod subdirectory.
|
|
174
|
+
if not pcall(IsaacScriptWatcher.Load) then
|
|
175
|
+
-- Sometimes loading can fail if the file is currently being being written to, so give up for
|
|
176
|
+
-- now and try again on the next interval.
|
|
177
|
+
Isaac.DebugString(
|
|
178
|
+
MOD_NAME
|
|
179
|
+
.. " - Failed to load the TypeScript Watcher \"save.dat\" on frame: "
|
|
180
|
+
.. tostring(isaacFrameCount)
|
|
181
|
+
)
|
|
182
|
+
return
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
if #saveData > 0 then
|
|
186
|
+
local saveDatContents = saveData
|
|
187
|
+
IsaacScriptWatcher:ClearSaveDat()
|
|
188
|
+
IsaacScriptWatcher:LoadSuccessful(saveDatContents)
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
function IsaacScriptWatcher:LoadSuccessful(saveDatContents)
|
|
193
|
+
frameOfLastSuccessfulLoad = Isaac.GetFrameCount()
|
|
194
|
+
|
|
195
|
+
for _, entry in ipairs(saveDatContents) do
|
|
196
|
+
-- Entry is e.g. { type: "command", data: "luamod revelations" }
|
|
197
|
+
if entry.type == "command" then
|
|
198
|
+
if entry.data == "restart" then
|
|
199
|
+
-- If we restart on the first frame that a run is loading, then the game can crash.
|
|
200
|
+
restartFrame = Isaac.GetFrameCount() + 1
|
|
201
|
+
else
|
|
202
|
+
Isaac.DebugString(MOD_NAME .. " - Executing command: " .. entry.data)
|
|
203
|
+
Isaac.ExecuteCommand(entry.data)
|
|
204
|
+
end
|
|
205
|
+
elseif entry.type == "msg" then
|
|
206
|
+
Isaac.DebugString(MOD_NAME .. " - " .. entry.data)
|
|
207
|
+
pushMessageArray(entry.data)
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
function IsaacScriptWatcher:ClearSaveDat()
|
|
213
|
+
saveData = {}
|
|
214
|
+
IsaacScriptWatcher:Save()
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
function IsaacScriptWatcher:Save()
|
|
218
|
+
local saveDataJSON = json.encode(saveData)
|
|
219
|
+
IsaacScriptWatcher:SaveData(saveDataJSON)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
function IsaacScriptWatcher:Load()
|
|
223
|
+
-- Read the "save#.dat" file into a string.
|
|
224
|
+
local saveDataJSON = Isaac.LoadModData(IsaacScriptWatcher)
|
|
225
|
+
|
|
226
|
+
-- Handle the case of a 0 byte file.
|
|
227
|
+
if saveDataJSON == "" then
|
|
228
|
+
saveDataJSON = "{}"
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
-- Convert a JSON string to a Lua table.
|
|
232
|
+
saveData = json.decode(saveDataJSON)
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
function IsaacScriptWatcher:CheckInput()
|
|
236
|
+
if game:IsPaused() then
|
|
237
|
+
return
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
-- Ensure that this feature does not overlap with custom consoles by checking for the
|
|
241
|
+
-- "AwaitingTextInput" global variable.
|
|
242
|
+
if AwaitingTextInput then
|
|
243
|
+
return
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
-- Manually show the log when the user presses the "I" key on the keyboard.
|
|
247
|
+
if Input.IsButtonPressed(Keyboard.KEY_I, 0) then
|
|
248
|
+
frameOfLastMsg = Isaac.GetFrameCount()
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
function IsaacScriptWatcher:CheckRestart()
|
|
253
|
+
if not RESTART_GAME_ON_RECOMPILATION then
|
|
254
|
+
return
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
if restartFrame == 0 or restartFrame < Isaac.GetFrameCount() then
|
|
258
|
+
return
|
|
259
|
+
end
|
|
260
|
+
restartFrame = 0
|
|
261
|
+
|
|
262
|
+
Isaac.DebugString(MOD_NAME .. " - Restarting the run.")
|
|
263
|
+
Isaac.ExecuteCommand("restart")
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
IsaacScriptWatcher:AddCallback(ModCallbacks.MC_POST_RENDER, IsaacScriptWatcher.PostRender)
|
|
267
|
+
|
|
268
|
+
local initMessage = "IsaacScript Watcher initialized."
|
|
269
|
+
Isaac.DebugString(initMessage)
|
|
270
|
+
pushMessageArray(initMessage)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<AnimatedActor>
|
|
2
|
+
<Info CreatedBy="Unknown" CreatedOn="2/1/2017 6:09:20 AM" Version="2" Fps="30"/>
|
|
3
|
+
<Content>
|
|
4
|
+
<Spritesheets>
|
|
5
|
+
<Spritesheet Path="logo.png" Id="0"/>
|
|
6
|
+
</Spritesheets>
|
|
7
|
+
<Layers>
|
|
8
|
+
<Layer Name="Layer 0" Id="0" SpritesheetId="0"/>
|
|
9
|
+
</Layers>
|
|
10
|
+
<Nulls/>
|
|
11
|
+
<Events/>
|
|
12
|
+
</Content>
|
|
13
|
+
<Animations DefaultAnimation="Default">
|
|
14
|
+
<Animation Name="Default" FrameNum="1" Loop="true">
|
|
15
|
+
<RootAnimation>
|
|
16
|
+
<Frame XPosition="0" YPosition="0" XScale="100" YScale="100" Delay="1" Visible="true" RedTint="255" GreenTint="255" BlueTint="255" AlphaTint="255" RedOffset="0" GreenOffset="0" BlueOffset="0" Rotation="0" Interpolated="false"/>
|
|
17
|
+
</RootAnimation>
|
|
18
|
+
<LayerAnimations>
|
|
19
|
+
<LayerAnimation LayerId="0" Visible="true">
|
|
20
|
+
<Frame XPosition="0" YPosition="0" XPivot="0" YPivot="0" XCrop="0" YCrop="0" Width="44" Height="28" XScale="66" YScale="66" Delay="1" Visible="true" RedTint="255" GreenTint="255" BlueTint="255" AlphaTint="255" RedOffset="0" GreenOffset="0" BlueOffset="0" Rotation="0" Interpolated="false"/>
|
|
21
|
+
</LayerAnimation>
|
|
22
|
+
</LayerAnimations>
|
|
23
|
+
<NullAnimations/>
|
|
24
|
+
<Triggers/>
|
|
25
|
+
</Animation>
|
|
26
|
+
</Animations>
|
|
27
|
+
</AnimatedActor>
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "isaacscript",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.14-dev.10",
|
|
4
|
+
"description": "A command line tool for managing Isaac mods written in TypeScript",
|
|
5
|
+
"homepage": "https://isaacscript.github.io/",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/IsaacScript/isaacscript/issues"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/IsaacScript/isaacscript.git"
|
|
12
|
+
},
|
|
4
13
|
"license": "GPL-3.0",
|
|
5
|
-
"
|
|
14
|
+
"author": "Zamiell",
|
|
15
|
+
"type": "commonjs",
|
|
16
|
+
"bin": {
|
|
17
|
+
"isaacscript": "./src/main.js"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"isaacscript-tsconfig": "^1.1.16",
|
|
21
|
+
"npm-check-updates": "^13.0.1",
|
|
22
|
+
"ts-node": "^10.7.0",
|
|
23
|
+
"typescript": "^4.6.2",
|
|
24
|
+
"typescript-to-lua": "^1.4.4",
|
|
25
|
+
"chalk": "4.1.2",
|
|
26
|
+
"command-exists": "^1.2.9",
|
|
27
|
+
"yaml": "^2.1.0",
|
|
28
|
+
"jsonc-parser": "^3.0.0",
|
|
29
|
+
"sync-directory": "^5.0.8",
|
|
30
|
+
"fs-extra": "^10.1.0",
|
|
31
|
+
"dotenv": "^16.0.1",
|
|
32
|
+
"figlet": "^1.5.2",
|
|
33
|
+
"source-map-support": "^0.5.21",
|
|
34
|
+
"update-notifier": "^5.1.0",
|
|
35
|
+
"yargs": "^17.5.1",
|
|
36
|
+
"prompt": "^1.3.0",
|
|
37
|
+
"moment": "^2.29.3",
|
|
38
|
+
"tslib": "^2.3.0"
|
|
39
|
+
},
|
|
40
|
+
"main": "./src/main.js",
|
|
41
|
+
"typings": "./src/main.d.ts",
|
|
42
|
+
"peerDependencies": {}
|
|
6
43
|
}
|
|
@@ -1,80 +1,76 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.checkForWindowsTerminalBugs = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
6
|
-
const fs_1 = tslib_1.__importDefault(require("fs"));
|
|
7
|
-
const path_1 = tslib_1.__importDefault(require("path"));
|
|
8
|
-
const constants_1 = require("./constants");
|
|
9
|
-
const file = tslib_1.__importStar(require("./file"));
|
|
10
|
-
const prompt_1 = require("./prompt");
|
|
11
|
-
const utils_1 = require("./utils");
|
|
12
|
-
const BASH_PROFILE_PATH = path_1.default.join(constants_1.HOME_DIR, ".bash_profile");
|
|
13
|
-
/**
|
|
14
|
-
* By default, Git Bash for Windows uses MINGW64. This will not work correctly with the prompt
|
|
15
|
-
* library. Try to detect this and warn the end-user.
|
|
16
|
-
*/
|
|
17
|
-
function checkForWindowsTerminalBugs(verbose) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
//
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
newText += `# Terminal fixes added by ${constants_1.PROJECT_NAME}\n`;
|
|
77
|
-
newText += "export FORCE_COLOR=true\n";
|
|
78
|
-
return newText;
|
|
79
|
-
}
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkForWindowsTerminalBugs = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
6
|
+
const fs_1 = tslib_1.__importDefault(require("fs"));
|
|
7
|
+
const path_1 = tslib_1.__importDefault(require("path"));
|
|
8
|
+
const constants_1 = require("./constants");
|
|
9
|
+
const file = tslib_1.__importStar(require("./file"));
|
|
10
|
+
const prompt_1 = require("./prompt");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
const BASH_PROFILE_PATH = path_1.default.join(constants_1.HOME_DIR, ".bash_profile");
|
|
13
|
+
/**
|
|
14
|
+
* By default, Git Bash for Windows uses MINGW64. This will not work correctly with the prompt
|
|
15
|
+
* library. Try to detect this and warn the end-user.
|
|
16
|
+
*/
|
|
17
|
+
async function checkForWindowsTerminalBugs(verbose) {
|
|
18
|
+
if (process.platform !== "win32") {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (process.env["SHELL"] !== "C:\\Program Files\\Git\\usr\\bin\\bash.exe") {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
await checkForWindowsBugColor(verbose);
|
|
25
|
+
}
|
|
26
|
+
exports.checkForWindowsTerminalBugs = checkForWindowsTerminalBugs;
|
|
27
|
+
async function checkForWindowsBugColor(verbose) {
|
|
28
|
+
if (process.env["FORCE_COLOR"] === "true") {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
console.error(chalk_1.default.red(`Error: It looks like you are using Git Bash for Windows (MINGW64) without the "${chalk_1.default.green("FORCE_COLOR")}" environment variable.`));
|
|
32
|
+
console.error("This is necessary in order for colors to work properly in the terminal.");
|
|
33
|
+
const shouldFixColors = await (0, prompt_1.getInputYesNo)("Do you want me to fix this for you?");
|
|
34
|
+
if (!shouldFixColors) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
applyFixesToBashProfile(verbose);
|
|
38
|
+
}
|
|
39
|
+
function applyFixesToBashProfile(verbose) {
|
|
40
|
+
// Check to see if the Bash profile has data.
|
|
41
|
+
let bashProfileContents;
|
|
42
|
+
if (file.exists(BASH_PROFILE_PATH, verbose)) {
|
|
43
|
+
bashProfileContents = file.read(BASH_PROFILE_PATH, verbose);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
bashProfileContents = "";
|
|
47
|
+
}
|
|
48
|
+
const appendText = getBashProfileAppendText(bashProfileContents);
|
|
49
|
+
try {
|
|
50
|
+
fs_1.default.appendFileSync(BASH_PROFILE_PATH, appendText);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
(0, utils_1.error)(`Failed to append text to "${BASH_PROFILE_PATH}":`, err);
|
|
54
|
+
}
|
|
55
|
+
console.log(chalk_1.default.green("Complete!"), `The terminal fixes have been added to: ${chalk_1.default.green(BASH_PROFILE_PATH)}`);
|
|
56
|
+
console.log(chalk_1.default.red("Please close and re-open your terminal, then run this program again."));
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
function getBashProfileAppendText(bashProfileContents) {
|
|
60
|
+
let newText = "";
|
|
61
|
+
if (bashProfileContents !== "" &&
|
|
62
|
+
bashProfileContents[bashProfileContents.length - 1] !== "\n") {
|
|
63
|
+
// If the Bash profile exists and has data, it should end in a newline. Add an extra newline if
|
|
64
|
+
// this is not the case.
|
|
65
|
+
newText += "\n";
|
|
66
|
+
}
|
|
67
|
+
if (bashProfileContents !== "") {
|
|
68
|
+
// If the Bash profile exists and has data, add an extra newline between the existing stuff and
|
|
69
|
+
// the new lines added by us.
|
|
70
|
+
newText += "\n";
|
|
71
|
+
}
|
|
72
|
+
newText += `# Terminal fixes added by ${constants_1.PROJECT_NAME}\n`;
|
|
73
|
+
newText += "export FORCE_COLOR=true\n";
|
|
74
|
+
return newText;
|
|
75
|
+
}
|
|
80
76
|
//# sourceMappingURL=checkForWindowsTerminalBugs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkForWindowsTerminalBugs.js","sourceRoot":"","sources":["../../../../packages/isaacscript-cli/src/checkForWindowsTerminalBugs.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAC1B,oDAAoB;AACpB,wDAAwB;AACxB,2CAAqD;AACrD,qDAA+B;AAC/B,qCAAyC;AACzC,mCAAgC;AAEhC,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,oBAAQ,EAAE,eAAe,CAAC,CAAC;AAE/D;;;GAGG;
|
|
1
|
+
{"version":3,"file":"checkForWindowsTerminalBugs.js","sourceRoot":"","sources":["../../../../packages/isaacscript-cli/src/checkForWindowsTerminalBugs.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAC1B,oDAAoB;AACpB,wDAAwB;AACxB,2CAAqD;AACrD,qDAA+B;AAC/B,qCAAyC;AACzC,mCAAgC;AAEhC,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,oBAAQ,EAAE,eAAe,CAAC,CAAC;AAE/D;;;GAGG;AACI,KAAK,UAAU,2BAA2B,CAC/C,OAAgB;IAEhB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE;QAChC,OAAO;KACR;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,4CAA4C,EAAE;QACzE,OAAO;KACR;IAED,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAZD,kEAYC;AAED,KAAK,UAAU,uBAAuB,CAAC,OAAgB;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,MAAM,EAAE;QACzC,OAAO;KACR;IAED,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CACP,kFAAkF,eAAK,CAAC,KAAK,CAC3F,aAAa,CACd,yBAAyB,CAC3B,CACF,CAAC;IACF,OAAO,CAAC,KAAK,CACX,yEAAyE,CAC1E,CAAC;IAEF,MAAM,eAAe,GAAG,MAAM,IAAA,sBAAa,EACzC,qCAAqC,CACtC,CAAC;IACF,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO;KACR;IAED,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAgB;IAC/C,6CAA6C;IAC7C,IAAI,mBAA2B,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE;QAC3C,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;KAC7D;SAAM;QACL,mBAAmB,GAAG,EAAE,CAAC;KAC1B;IAED,MAAM,UAAU,GAAG,wBAAwB,CAAC,mBAAmB,CAAC,CAAC;IAEjE,IAAI;QACF,YAAE,CAAC,cAAc,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;KAClD;IAAC,OAAO,GAAG,EAAE;QACZ,IAAA,aAAK,EAAC,6BAA6B,iBAAiB,IAAI,EAAE,GAAG,CAAC,CAAC;KAChE;IAED,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EACxB,0CAA0C,eAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAC3E,CAAC;IACF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CACP,sEAAsE,CACvE,CACF,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,wBAAwB,CAAC,mBAA2B;IAC3D,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,IACE,mBAAmB,KAAK,EAAE;QAC1B,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,EAC5D;QACA,+FAA+F;QAC/F,wBAAwB;QACxB,OAAO,IAAI,IAAI,CAAC;KACjB;IAED,IAAI,mBAAmB,KAAK,EAAE,EAAE;QAC9B,+FAA+F;QAC/F,6BAA6B;QAC7B,OAAO,IAAI,IAAI,CAAC;KACjB;IAED,OAAO,IAAI,6BAA6B,wBAAY,IAAI,CAAC;IACzD,OAAO,IAAI,2BAA2B,CAAC;IAEvC,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.compileAndCopy = exports.copy = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const path_1 = tslib_1.__importDefault(require("path"));
|
|
6
|
-
const constants_1 = require("../../constants");
|
|
7
|
-
const exec_1 = require("../../exec");
|
|
8
|
-
const file = tslib_1.__importStar(require("../../file"));
|
|
9
|
-
const utils_1 = require("../../utils");
|
|
10
|
-
function copy(argv, config) {
|
|
11
|
-
const verbose = argv["verbose"] === true;
|
|
12
|
-
const modTargetDirectoryName = (0, utils_1.getModTargetDirectoryName)(config);
|
|
13
|
-
const modTargetPath = path_1.default.join(config.modsDirectory, modTargetDirectoryName);
|
|
14
|
-
compileAndCopy(constants_1.MOD_SOURCE_PATH, modTargetPath, verbose);
|
|
15
|
-
}
|
|
16
|
-
exports.copy = copy;
|
|
17
|
-
function compileAndCopy(modSourcePath, modTargetPath, verbose) {
|
|
18
|
-
compile(verbose);
|
|
19
|
-
copyMod(modSourcePath, modTargetPath, verbose);
|
|
20
|
-
}
|
|
21
|
-
exports.compileAndCopy = compileAndCopy;
|
|
22
|
-
function compile(verbose) {
|
|
23
|
-
(0, exec_1.execShell)("npx", ["tstl"], verbose);
|
|
24
|
-
console.log("Mod compiled successfully.");
|
|
25
|
-
}
|
|
26
|
-
function copyMod(modSourcePath, modTargetPath, verbose) {
|
|
27
|
-
if (file.exists(modTargetPath, verbose)) {
|
|
28
|
-
file.deleteFileOrDirectory(modTargetPath, verbose);
|
|
29
|
-
}
|
|
30
|
-
file.copy(modSourcePath, modTargetPath, verbose);
|
|
31
|
-
console.log("Mod copied successfully.");
|
|
32
|
-
}
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compileAndCopy = exports.copy = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const path_1 = tslib_1.__importDefault(require("path"));
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
const exec_1 = require("../../exec");
|
|
8
|
+
const file = tslib_1.__importStar(require("../../file"));
|
|
9
|
+
const utils_1 = require("../../utils");
|
|
10
|
+
function copy(argv, config) {
|
|
11
|
+
const verbose = argv["verbose"] === true;
|
|
12
|
+
const modTargetDirectoryName = (0, utils_1.getModTargetDirectoryName)(config);
|
|
13
|
+
const modTargetPath = path_1.default.join(config.modsDirectory, modTargetDirectoryName);
|
|
14
|
+
compileAndCopy(constants_1.MOD_SOURCE_PATH, modTargetPath, verbose);
|
|
15
|
+
}
|
|
16
|
+
exports.copy = copy;
|
|
17
|
+
function compileAndCopy(modSourcePath, modTargetPath, verbose) {
|
|
18
|
+
compile(verbose);
|
|
19
|
+
copyMod(modSourcePath, modTargetPath, verbose);
|
|
20
|
+
}
|
|
21
|
+
exports.compileAndCopy = compileAndCopy;
|
|
22
|
+
function compile(verbose) {
|
|
23
|
+
(0, exec_1.execShell)("npx", ["tstl"], verbose);
|
|
24
|
+
console.log("Mod compiled successfully.");
|
|
25
|
+
}
|
|
26
|
+
function copyMod(modSourcePath, modTargetPath, verbose) {
|
|
27
|
+
if (file.exists(modTargetPath, verbose)) {
|
|
28
|
+
file.deleteFileOrDirectory(modTargetPath, verbose);
|
|
29
|
+
}
|
|
30
|
+
file.copy(modSourcePath, modTargetPath, verbose);
|
|
31
|
+
console.log("Mod copied successfully.");
|
|
32
|
+
}
|
|
33
33
|
//# sourceMappingURL=copy.js.map
|
|
@@ -1,30 +1,28 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.checkIfProjectPathExists = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
6
|
-
const constants_1 = require("../../constants");
|
|
7
|
-
const file = tslib_1.__importStar(require("../../file"));
|
|
8
|
-
const prompt_1 = require("../../prompt");
|
|
9
|
-
const utils_1 = require("../../utils");
|
|
10
|
-
function checkIfProjectPathExists(projectPath, yes, verbose) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
exports.checkIfProjectPathExists = checkIfProjectPathExists;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkIfProjectPathExists = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
const file = tslib_1.__importStar(require("../../file"));
|
|
8
|
+
const prompt_1 = require("../../prompt");
|
|
9
|
+
const utils_1 = require("../../utils");
|
|
10
|
+
async function checkIfProjectPathExists(projectPath, yes, verbose) {
|
|
11
|
+
if (projectPath === constants_1.CWD || !file.exists(projectPath, verbose)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const fileType = file.isDir(projectPath, verbose) ? "directory" : "file";
|
|
15
|
+
if (yes) {
|
|
16
|
+
file.deleteFileOrDirectory(projectPath, verbose);
|
|
17
|
+
console.log(`Deleted ${fileType}: ${chalk_1.default.green(projectPath)}`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
console.log(`A ${fileType} already exists with a name of: ${chalk_1.default.green(projectPath)}`);
|
|
21
|
+
const shouldDelete = await (0, prompt_1.getInputYesNo)("Do you want me to delete it?");
|
|
22
|
+
if (!shouldDelete) {
|
|
23
|
+
(0, utils_1.error)("Ok then. Goodbye.");
|
|
24
|
+
}
|
|
25
|
+
file.deleteFileOrDirectory(projectPath, verbose);
|
|
26
|
+
}
|
|
27
|
+
exports.checkIfProjectPathExists = checkIfProjectPathExists;
|
|
30
28
|
//# sourceMappingURL=checkIfProjectPathExists.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkIfProjectPathExists.js","sourceRoot":"","sources":["../../../../../../packages/isaacscript-cli/src/commands/init/checkIfProjectPathExists.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAC1B,+CAAsC;AACtC,yDAAmC;AACnC,yCAA6C;AAC7C,uCAAoC;
|
|
1
|
+
{"version":3,"file":"checkIfProjectPathExists.js","sourceRoot":"","sources":["../../../../../../packages/isaacscript-cli/src/commands/init/checkIfProjectPathExists.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAC1B,+CAAsC;AACtC,yDAAmC;AACnC,yCAA6C;AAC7C,uCAAoC;AAE7B,KAAK,UAAU,wBAAwB,CAC5C,WAAmB,EACnB,GAAY,EACZ,OAAgB;IAEhB,IAAI,WAAW,KAAK,eAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE;QAC7D,OAAO;KACR;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IAEzE,IAAI,GAAG,EAAE;QACP,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,KAAK,eAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAChE,OAAO;KACR;IAED,OAAO,CAAC,GAAG,CACT,KAAK,QAAQ,mCAAmC,eAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAC3E,CAAC;IACF,MAAM,YAAY,GAAG,MAAM,IAAA,sBAAa,EAAC,8BAA8B,CAAC,CAAC;IAEzE,IAAI,CAAC,YAAY,EAAE;QACjB,IAAA,aAAK,EAAC,mBAAmB,CAAC,CAAC;KAC5B;IAED,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AA3BD,4DA2BC"}
|