@devaloop/devalang 0.0.1-alpha.14 → 0.0.1-alpha.16
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/.devalang +10 -8
- package/.github/workflows/ci.yml +92 -0
- package/Cargo.toml +60 -58
- package/README.md +32 -15
- package/docs/CHANGELOG.md +93 -1
- package/docs/CONTRIBUTING.md +101 -1
- package/docs/ROADMAP.md +2 -2
- package/docs/TODO.md +1 -1
- package/examples/automation.deva +42 -0
- package/examples/bank.deva +4 -4
- package/examples/events.deva +12 -0
- package/examples/function.deva +4 -4
- package/examples/index.deva +39 -25
- package/examples/loop.deva +5 -11
- package/examples/pattern.deva +8 -0
- package/examples/plugin.deva +16 -0
- package/examples/variables.deva +1 -1
- package/out-tsc/bin/index.js +51 -7
- package/out-tsc/index.js +3 -1
- package/out-tsc/scripts/postbuild.js +9 -10
- package/out-tsc/scripts/postinstall.js +49 -0
- package/package.json +12 -4
- package/project-version.json +3 -3
- package/rust/cli/bank.rs +462 -456
- package/rust/cli/build.rs +252 -199
- package/rust/cli/check.rs +221 -180
- package/rust/cli/driver.rs +297 -292
- package/rust/cli/generator.rs +1 -0
- package/rust/cli/init.rs +87 -79
- package/rust/cli/install.rs +35 -32
- package/rust/cli/login.rs +127 -134
- package/rust/cli/mod.rs +13 -11
- package/rust/cli/play.rs +1123 -218
- package/rust/cli/telemetry.rs +19 -0
- package/rust/cli/template.rs +69 -57
- package/rust/cli/update.rs +6 -4
- package/rust/common/api.rs +5 -8
- package/rust/common/cdn.rs +3 -6
- package/rust/common/mod.rs +3 -3
- package/rust/common/sso.rs +3 -6
- package/rust/config/driver.rs +118 -94
- package/rust/config/loader.rs +165 -156
- package/rust/config/mod.rs +4 -2
- package/rust/config/settings.rs +91 -0
- package/rust/config/stats.rs +257 -0
- package/rust/core/audio/engine.rs +696 -518
- package/rust/core/audio/evaluator.rs +263 -31
- package/rust/core/audio/interpreter/arrow_call.rs +198 -161
- package/rust/core/audio/interpreter/automate.rs +18 -0
- package/rust/core/audio/interpreter/call.rs +98 -95
- package/rust/core/audio/interpreter/condition.rs +70 -71
- package/rust/core/audio/interpreter/driver.rs +487 -198
- package/rust/core/audio/interpreter/function.rs +26 -21
- package/rust/core/audio/interpreter/let_.rs +38 -19
- package/rust/core/audio/interpreter/load.rs +18 -18
- package/rust/core/audio/interpreter/loop_.rs +113 -73
- package/rust/core/audio/interpreter/mod.rs +14 -13
- package/rust/core/audio/interpreter/sleep.rs +27 -30
- package/rust/core/audio/interpreter/spawn.rs +105 -102
- package/rust/core/audio/interpreter/tempo.rs +19 -16
- package/rust/core/audio/interpreter/trigger.rs +239 -210
- package/rust/core/audio/loader/mod.rs +1 -1
- package/rust/core/audio/loader/trigger.rs +100 -97
- package/rust/core/audio/mod.rs +7 -6
- package/rust/core/audio/player.rs +64 -64
- package/rust/core/audio/renderer.rs +56 -53
- package/rust/core/audio/special/easing.rs +189 -0
- package/rust/core/audio/special/env.rs +43 -0
- package/rust/core/audio/special/math.rs +102 -0
- package/rust/core/audio/special/mod.rs +9 -0
- package/rust/core/audio/special/modulator.rs +143 -0
- package/rust/core/builder/mod.rs +80 -85
- package/rust/core/debugger/lexer.rs +27 -27
- package/rust/core/debugger/mod.rs +24 -23
- package/rust/core/debugger/module.rs +55 -47
- package/rust/core/debugger/preprocessor.rs +27 -27
- package/rust/core/debugger/store.rs +40 -39
- package/rust/core/error/mod.rs +80 -66
- package/rust/core/lexer/handler/arrow.rs +82 -31
- package/rust/core/lexer/handler/at.rs +21 -21
- package/rust/core/lexer/handler/brace.rs +41 -41
- package/rust/core/lexer/handler/colon.rs +21 -21
- package/rust/core/lexer/handler/comment.rs +30 -30
- package/rust/core/lexer/handler/dot.rs +21 -21
- package/rust/core/lexer/handler/driver.rs +337 -263
- package/rust/core/lexer/handler/identifier.rs +46 -42
- package/rust/core/lexer/handler/indent.rs +66 -66
- package/rust/core/lexer/handler/mod.rs +16 -16
- package/rust/core/lexer/handler/newline.rs +23 -23
- package/rust/core/lexer/handler/number.rs +31 -31
- package/rust/core/lexer/handler/operator.rs +46 -44
- package/rust/core/lexer/handler/parenthesis.rs +41 -41
- package/rust/core/lexer/handler/slash.rs +21 -21
- package/rust/core/lexer/handler/string.rs +63 -63
- package/rust/core/lexer/mod.rs +54 -51
- package/rust/core/lexer/token.rs +97 -91
- package/rust/core/mod.rs +11 -11
- package/rust/core/parser/driver.rs +513 -408
- package/rust/core/parser/handler/arrow_call.rs +233 -211
- package/rust/core/parser/handler/at.rs +245 -162
- package/rust/core/parser/handler/bank.rs +94 -69
- package/rust/core/parser/handler/condition.rs +80 -74
- package/rust/core/parser/handler/dot.rs +143 -135
- package/rust/core/parser/handler/identifier/automate.rs +257 -0
- package/rust/core/parser/handler/identifier/call.rs +91 -88
- package/rust/core/parser/handler/identifier/emit.rs +66 -0
- package/rust/core/parser/handler/identifier/function.rs +100 -92
- package/rust/core/parser/handler/identifier/group.rs +85 -75
- package/rust/core/parser/handler/identifier/let_.rs +158 -127
- package/rust/core/parser/handler/identifier/mod.rs +54 -52
- package/rust/core/parser/handler/identifier/on.rs +98 -0
- package/rust/core/parser/handler/identifier/print.rs +52 -0
- package/rust/core/parser/handler/identifier/sleep.rs +36 -33
- package/rust/core/parser/handler/identifier/spawn.rs +91 -88
- package/rust/core/parser/handler/identifier/synth.rs +65 -65
- package/rust/core/parser/handler/loop_.rs +170 -72
- package/rust/core/parser/handler/mod.rs +8 -8
- package/rust/core/parser/handler/tempo.rs +53 -47
- package/rust/core/parser/mod.rs +4 -4
- package/rust/core/parser/statement.rs +142 -108
- package/rust/core/plugin/loader.rs +123 -48
- package/rust/core/plugin/mod.rs +2 -1
- package/rust/core/plugin/runner.rs +296 -0
- package/rust/core/preprocessor/loader.rs +515 -326
- package/rust/core/preprocessor/mod.rs +4 -4
- package/rust/core/preprocessor/module.rs +60 -58
- package/rust/core/preprocessor/processor.rs +99 -101
- package/rust/core/preprocessor/resolver/bank.rs +51 -49
- package/rust/core/preprocessor/resolver/call.rs +100 -100
- package/rust/core/preprocessor/resolver/condition.rs +97 -97
- package/rust/core/preprocessor/resolver/driver.rs +310 -278
- package/rust/core/preprocessor/resolver/function.rs +69 -78
- package/rust/core/preprocessor/resolver/group.rs +96 -91
- package/rust/core/preprocessor/resolver/let_.rs +32 -28
- package/rust/core/preprocessor/resolver/loop_.rs +320 -91
- package/rust/core/preprocessor/resolver/mod.rs +15 -15
- package/rust/core/preprocessor/resolver/spawn.rs +76 -92
- package/rust/core/preprocessor/resolver/synth.rs +56 -50
- package/rust/core/preprocessor/resolver/tempo.rs +50 -49
- package/rust/core/preprocessor/resolver/trigger.rs +113 -116
- package/rust/core/preprocessor/resolver/value.rs +81 -87
- package/rust/core/shared/bank.rs +1 -1
- package/rust/core/shared/duration.rs +9 -9
- package/rust/core/shared/mod.rs +3 -3
- package/rust/core/shared/value.rs +35 -32
- package/rust/core/store/function.rs +34 -34
- package/rust/core/store/global.rs +55 -38
- package/rust/core/store/mod.rs +5 -5
- package/rust/core/store/variable.rs +37 -34
- package/rust/core/utils/mod.rs +2 -2
- package/rust/core/utils/path.rs +37 -31
- package/rust/core/utils/validation.rs +35 -37
- package/rust/installer/addon.rs +84 -80
- package/rust/installer/bank.rs +62 -65
- package/rust/installer/mod.rs +5 -5
- package/rust/installer/plugin.rs +54 -55
- package/rust/installer/utils.rs +56 -56
- package/rust/lib.rs +156 -164
- package/rust/main.rs +250 -145
- package/rust/utils/error.rs +200 -0
- package/rust/utils/file.rs +38 -35
- package/rust/utils/first_usage.rs +76 -0
- package/rust/utils/logger.rs +195 -139
- package/rust/utils/mod.rs +9 -50
- package/rust/utils/signature.rs +19 -17
- package/rust/utils/spinner.rs +22 -19
- package/rust/utils/telemetry.rs +292 -0
- package/rust/utils/watcher.rs +34 -33
- package/templates/minimal/README.md +97 -121
- package/templates/welcome/README.md +97 -121
- package/typescript/bin/index.ts +19 -5
- package/typescript/index.ts +3 -1
- package/typescript/scripts/postbuild.ts +10 -6
- package/typescript/scripts/postinstall.ts +56 -0
- package/typescript/scripts/version/bump.ts +0 -1
- package/typescript/scripts/version/index.ts +0 -1
- package/out-tsc/bin/devalang.exe +0 -0
package/examples/index.deva
CHANGED
|
@@ -1,29 +1,43 @@
|
|
|
1
|
-
# This
|
|
1
|
+
# This file demonstrates general uses of Devalang.
|
|
2
2
|
|
|
3
|
-
bpm
|
|
3
|
+
bpm 120
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
group main:
|
|
6
|
+
let lead = synth sine {
|
|
7
|
+
attack: 0,
|
|
8
|
+
decay: 100,
|
|
9
|
+
sustain: 100,
|
|
10
|
+
release: 100
|
|
11
|
+
}
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
velocity: 0.6
|
|
27
|
-
})
|
|
13
|
+
# Global automation for this synth (applies to subsequent notes)
|
|
14
|
+
automate lead:
|
|
15
|
+
param volume {
|
|
16
|
+
0% = 0.0
|
|
17
|
+
100% = 1.0
|
|
18
|
+
}
|
|
19
|
+
param pan {
|
|
20
|
+
0% = -1.0
|
|
21
|
+
100% = 1.0
|
|
22
|
+
}
|
|
23
|
+
param pitch {
|
|
24
|
+
0% = -12.0
|
|
25
|
+
100% = 12.0
|
|
26
|
+
}
|
|
28
27
|
|
|
29
|
-
|
|
28
|
+
# Notes (per-note automation can override globals)
|
|
29
|
+
lead -> note(C4, {
|
|
30
|
+
duration: 400,
|
|
31
|
+
velocity: 0.8,
|
|
32
|
+
automate: {
|
|
33
|
+
pan: {
|
|
34
|
+
0%: -1.0
|
|
35
|
+
100%: 0.0
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
lead -> note(E4, { duration: 400 })
|
|
40
|
+
lead -> note(G4, { duration: 600, glide: true, target_freq: 659.25 })
|
|
41
|
+
lead -> note(B3, { duration: 400, slide: true, target_amp: 0.3 })
|
|
42
|
+
|
|
43
|
+
call main
|
package/examples/loop.deva
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
# This file demonstrates the use of
|
|
2
|
-
|
|
3
|
-
@import { duration, default_bank, params, loopCount, tempo } from "./variables.deva"
|
|
4
|
-
|
|
5
|
-
@load "./samples/kick-808.wav" as kickCustom
|
|
6
|
-
@load "./samples/hat-808.wav" as hatCustom
|
|
1
|
+
# This file demonstrates the use of loops in Devalang.
|
|
7
2
|
|
|
8
3
|
group myLoop:
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
for i in [1, 2, 3]:
|
|
5
|
+
print "looping with for" + i
|
|
11
6
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
# .hatCustom duration params
|
|
7
|
+
loop 3:
|
|
8
|
+
print "looping with loop"
|
|
15
9
|
|
|
16
10
|
@export { myLoop }
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# This is an example of using a plugin in Devalang.
|
|
2
|
+
# Make sure you have the plugin installed in your Devaloop application. (devalang install plugin <author>.<plugin_name>)
|
|
3
|
+
|
|
4
|
+
@use devaloop.acid as acidPlugin
|
|
5
|
+
|
|
6
|
+
let acidSynth = synth acidPlugin.synth {
|
|
7
|
+
waveform: "saw",
|
|
8
|
+
accent: 0.1,
|
|
9
|
+
decay: 250
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
group mySynthGroup:
|
|
13
|
+
acidSynth -> note(C4, { duration: 600 })
|
|
14
|
+
acidSynth -> note(E4, { duration: 600 })
|
|
15
|
+
|
|
16
|
+
call mySynthGroup
|
package/examples/variables.deva
CHANGED
package/out-tsc/bin/index.js
CHANGED
|
@@ -1,13 +1,57 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
6
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
37
|
const child_process_1 = require("child_process");
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
let binaryName;
|
|
40
|
+
switch (process.platform) {
|
|
41
|
+
case "win32":
|
|
42
|
+
binaryName = "devalang-x86_64-pc-windows-msvc.exe";
|
|
43
|
+
break;
|
|
44
|
+
case "darwin":
|
|
45
|
+
binaryName = "devalang-x86_64-apple-darwin";
|
|
46
|
+
break;
|
|
47
|
+
case "linux":
|
|
48
|
+
binaryName = "devalang-x86_64-unknown-linux-gnu";
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
console.error(`Unsupported platform: ${process.platform}`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
const binaryPath = path.join(__dirname, binaryName);
|
|
11
55
|
const args = process.argv.slice(2);
|
|
12
56
|
const child = (0, child_process_1.spawn)(binaryPath, args, { stdio: "inherit" });
|
|
13
|
-
child.on("exit", (code) => process.exit(code));
|
|
57
|
+
child.on("exit", (code) => process.exit(code !== null && code !== void 0 ? code : 1));
|
package/out-tsc/index.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
fs_1.default.chmodSync(destination, 0o755);
|
|
2
|
+
/**
|
|
3
|
+
* NOTE: This script is deprecated since we use Github Actions
|
|
4
|
+
*/
|
|
5
|
+
// import fs from "fs";
|
|
6
|
+
// import path from "path";
|
|
7
|
+
// const source = path.join(__dirname, "..", "..", "target", "release", "devalang.exe");
|
|
8
|
+
// const destination = path.join(__dirname, "..", "bin", "devalang.exe");
|
|
9
|
+
// fs.copyFileSync(source, destination);
|
|
10
|
+
// fs.chmodSync(destination, 0o755);
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const follow_redirects_1 = require("follow-redirects");
|
|
9
|
+
const fs_2 = __importDefault(require("fs"));
|
|
10
|
+
const path_2 = __importDefault(require("path"));
|
|
11
|
+
const projectVersionPath = path_2.default.join(__dirname, "../../project-version.json");
|
|
12
|
+
const version = fs_2.default.readFileSync(projectVersionPath, "utf-8").trim();
|
|
13
|
+
const versionString = JSON.parse(version).version;
|
|
14
|
+
const platform = process.platform;
|
|
15
|
+
let binaryName;
|
|
16
|
+
switch (platform) {
|
|
17
|
+
case "win32":
|
|
18
|
+
binaryName = "devalang-x86_64-pc-windows-msvc.exe";
|
|
19
|
+
break;
|
|
20
|
+
case "darwin":
|
|
21
|
+
binaryName = "devalang-x86_64-apple-darwin";
|
|
22
|
+
break;
|
|
23
|
+
case "linux":
|
|
24
|
+
binaryName = "devalang-x86_64-unknown-linux-gnu";
|
|
25
|
+
break;
|
|
26
|
+
default:
|
|
27
|
+
console.error(`❌ Unsupported platform: ${platform}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const destDir = (0, path_1.join)(__dirname, "..", "..", "out-tsc", "bin");
|
|
31
|
+
const dest = (0, path_1.join)(destDir, binaryName);
|
|
32
|
+
const url = `https://github.com/devaloop-labs/devalang/releases/download/v${versionString}/${binaryName}`;
|
|
33
|
+
(0, fs_1.mkdirSync)(destDir, { recursive: true });
|
|
34
|
+
console.log(`⬇️ Downloading ${binaryName} from ${url}`);
|
|
35
|
+
follow_redirects_1.https.get(url, (res) => {
|
|
36
|
+
if (res.statusCode !== 200) {
|
|
37
|
+
console.error(`❌ Failed (HTTP ${res.statusCode})`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const file = (0, fs_1.createWriteStream)(dest, { mode: 0o755 });
|
|
41
|
+
res.pipe(file);
|
|
42
|
+
file.on("finish", () => {
|
|
43
|
+
file.close();
|
|
44
|
+
console.log(`✅ Downloaded ${binaryName} to ${dest}`);
|
|
45
|
+
});
|
|
46
|
+
}).on("error", (err) => {
|
|
47
|
+
console.error(`❌ Error: ${err.message}`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
});
|
package/package.json
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devaloop/devalang",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.0.1-alpha.
|
|
4
|
+
"version": "0.0.1-alpha.16",
|
|
5
5
|
"description": "Write music like code. Devalang is a domain-specific language (DSL) for sound designers and music hackers. Compose, automate, and control sound — in plain text.",
|
|
6
6
|
"main": "out-tsc/index.js",
|
|
7
7
|
"bin": {
|
|
8
8
|
"devalang": "./out-tsc/bin/index.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
+
"rust:fmt": "cargo fmt",
|
|
11
12
|
"rust:dev:build": "cargo run build --entry examples --output output --debug",
|
|
12
13
|
"rust:dev:check": "cargo run check --entry examples --output output --debug",
|
|
13
14
|
"rust:dev:play": "cargo run play --entry examples --output output --repeat --debug",
|
|
14
15
|
"rust:wasm:web": "wasm-pack build --target=web --no-default-features",
|
|
15
16
|
"rust:wasm:node": "wasm-pack build --target=nodejs --no-default-features",
|
|
17
|
+
"script:build": "tsc",
|
|
16
18
|
"script:postbuild": "tsc && node out-tsc/scripts/postbuild.js",
|
|
17
19
|
"script:version:bump": "tsc && node out-tsc/scripts/version/index.js",
|
|
18
|
-
"prepublish": "cargo build --release
|
|
20
|
+
"prepublish": "cargo build --release",
|
|
21
|
+
"postinstall": "tsc && node out-tsc/scripts/postinstall.js"
|
|
19
22
|
},
|
|
20
23
|
"homepage": "https://devalang.com",
|
|
21
24
|
"keywords": [
|
|
@@ -40,6 +43,11 @@
|
|
|
40
43
|
"url": "https://github.com/devaloop-labs/devalang.git"
|
|
41
44
|
},
|
|
42
45
|
"dependencies": {
|
|
43
|
-
"@types/
|
|
46
|
+
"@types/follow-redirects": "^1.14.4",
|
|
47
|
+
"@types/node": "^24.0.3",
|
|
48
|
+
"follow-redirects": "^1.15.11"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"typescript": "^5.9.2"
|
|
44
52
|
}
|
|
45
|
-
}
|
|
53
|
+
}
|
package/project-version.json
CHANGED