@delance/runtime 2024.12.100 → 2025.1.100

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/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  [![npm](https://img.shields.io/npm/v/%40delance%2Fruntime.svg)][npm]
2
2
  [![license](https://img.shields.io/npm/l/%40delance%2Fruntime.svg)][license]
3
3
  [![builds.sr.ht status](https://builds.sr.ht/~self/delance-runtime.svg)][builds]
4
- ![maintenance](https://img.shields.io/maintenance/yes/2024.svg)
4
+ ![maintenance](https://img.shields.io/maintenance/yes/2025.svg)
5
5
 
6
6
  @delance/runtime
7
7
  ================
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- require('./v2024.12.100-a040b24fa18f6de20de211e78d8a6467a3f88fb34493439e74909b437292ec98/server.bundle.js');
3
+ require('./v2025.1.100-228191b2f2dd23dc53ddebd45746a73b2a122c6d05bf83bee49037e044d30898/server.bundle.js');
package/install.mjs CHANGED
@@ -9,10 +9,16 @@ import delance from '@delance/builder';
9
9
  import {BlobReader, BlobWriter, TextWriter, ZipReader} from '@zip.js/zip.js';
10
10
  import map from 'p-map';
11
11
 
12
- import pkg from './package.json' with {type: 'json'};
12
+ import {getPkg, pkg} from './utils.mjs';
13
13
 
14
- import {getPkg} from './utils.mjs';
14
+ async function writeEntry() {
15
+ return fs.writeFile(
16
+ 'dist/langserver.cjs',
17
+ `#!/usr/bin/env node
15
18
 
19
+ require('./v${pkg.version}-${pkg.delance.sha256}/server.bundle.js');`,
20
+ );
21
+ }
16
22
  const output = path.resolve(`dist/v${pkg.version}-${pkg.delance.sha256}`);
17
23
 
18
24
  await fs.mkdir(output, {recursive: true});
@@ -25,6 +31,7 @@ try {
25
31
  }
26
32
 
27
33
  if (processed) {
34
+ await writeEntry();
28
35
  process.exit();
29
36
  }
30
37
 
@@ -79,9 +86,4 @@ await map(
79
86
  {concurrency: 4},
80
87
  );
81
88
 
82
- await fs.writeFile(
83
- 'dist/langserver.cjs',
84
- `#!/usr/bin/env node
85
-
86
- require('./v${pkg.version}-${pkg.delance.sha256}/server.bundle.js');`,
87
- );
89
+ await writeEntry();
package/package.json CHANGED
@@ -1,17 +1,22 @@
1
1
  {
2
2
  "name": "@delance/runtime",
3
- "version": "2024.12.100",
3
+ "version": "2025.1.100",
4
4
  "description": "Runtime and entrypoint for the lance",
5
5
  "license": "0BSD",
6
6
  "bin": {
7
7
  "delance-langserver": "dist/langserver.cjs"
8
8
  },
9
9
  "delance": {
10
- "sha256": "a040b24fa18f6de20de211e78d8a6467a3f88fb34493439e74909b437292ec98"
10
+ "sha256": "228191b2f2dd23dc53ddebd45746a73b2a122c6d05bf83bee49037e044d30898"
11
11
  },
12
- "files": ["langserver.cjs", "install.mjs"],
12
+ "files": [
13
+ "langserver.cjs",
14
+ "install.mjs",
15
+ "utils.mjs"
16
+ ],
13
17
  "scripts": {
14
18
  "postinstall": "node install.mjs",
19
+ "prepublishOnly": "node install.mjs",
15
20
  "lint": "biome lint ."
16
21
  },
17
22
  "dependencies": {
@@ -22,8 +27,10 @@
22
27
  },
23
28
  "devDependencies": {
24
29
  "@biomejs/biome": "^1.9.4",
25
- "@types/node": "^22.10.2",
26
- "typescript": "^5.7.2"
30
+ "@types/node": "^22.10.5",
31
+ "typescript": "^5.7.3"
27
32
  },
28
- "trustedDependencies": ["@biomejs/biome"]
33
+ "trustedDependencies": [
34
+ "@biomejs/biome"
35
+ ]
29
36
  }
package/utils.mjs ADDED
@@ -0,0 +1,122 @@
1
+ // @ts-check
2
+ import assert, {AssertionError} from 'node:assert';
3
+ import {subtle} from 'node:crypto';
4
+ import fs from 'node:fs/promises';
5
+ import process from 'node:process';
6
+ import retry, {AbortError} from 'p-retry';
7
+
8
+ import pkg from './package.json' with {type: 'json'};
9
+
10
+ /**
11
+ * @param {string} string
12
+ */
13
+ const reverse = (string) => [...string].reverse().join('');
14
+
15
+ const BASE_URL = new URL(reverse('/moc.oidutslausiv.ecalptekram//:sptth'));
16
+ const PUBLISHER = reverse('nohtyp-sm');
17
+ const EXTENSION = reverse('ecnalyp-edocsv');
18
+
19
+ const ITEMS = new URL(`/items?itemName=${PUBLISHER}.${EXTENSION}`, BASE_URL);
20
+
21
+ /** @type {RequestInit} */
22
+ const INIT = {
23
+ headers: {
24
+ 'user-agent': 'Mozilla/5.0 (Delance) Gecko/20100101 Firefox/120.0',
25
+ },
26
+ credentials: 'include',
27
+ };
28
+
29
+ /**
30
+ * @param {Blob} blob
31
+ */
32
+ export const sha256 = async (blob) =>
33
+ Array.from(
34
+ new Uint8Array(
35
+ await subtle.digest('SHA-256', await blob.arrayBuffer()),
36
+ ),
37
+ )
38
+ .map((b) => b.toString(16).padStart(2, '0'))
39
+ .join('');
40
+
41
+ const pkgVersion = pkg.version.split('-')[0];
42
+
43
+ export async function getPkg({check = true, version = pkgVersion} = {}) {
44
+ const PACKAGE = new URL(
45
+ `/_apis/public/gallery/publishers/${PUBLISHER}/vsextensions/${EXTENSION}/${version}/vspackage`,
46
+ BASE_URL,
47
+ );
48
+
49
+ /** @type {Blob?} */
50
+ let vsix = null;
51
+
52
+ if (process.env.DELANCE_VSIX) {
53
+ try {
54
+ vsix = new Blob([await fs.readFile(process.env.DELANCE_VSIX)]);
55
+ if (check)
56
+ assert.equal(
57
+ await sha256(vsix),
58
+ pkg.delance.sha256,
59
+ 'sha256 mismatch',
60
+ );
61
+ } catch (e) {
62
+ if (
63
+ /** @type {Error & {syscall: string}} */ (e)?.syscall === 'open'
64
+ ) {
65
+ console.error(e);
66
+ } else {
67
+ throw e;
68
+ }
69
+ }
70
+ }
71
+
72
+ if (!vsix) {
73
+ const {headers} = await fetch(ITEMS, INIT);
74
+ const cookie = headers
75
+ .getSetCookie()
76
+ .map((c) => c.split(';', 2)[0])
77
+ .join('; ');
78
+
79
+ vsix = await retry(async () => {
80
+ const response = await fetch(PACKAGE, {
81
+ headers: {
82
+ cookie,
83
+ },
84
+ redirect: 'follow',
85
+ referrer: ITEMS.href,
86
+ });
87
+
88
+ if (response.status === 429) {
89
+ const delay = response.headers.get('retry-after');
90
+ if (delay) {
91
+ throw new Error('Rate limited');
92
+ }
93
+ }
94
+
95
+ if (!response.ok) {
96
+ throw new AbortError(response.statusText);
97
+ }
98
+
99
+ const blob = await response.blob();
100
+
101
+ if (check)
102
+ try {
103
+ assert.equal(
104
+ await sha256(blob),
105
+ pkg.delance.sha256,
106
+ 'sha256 mismatch',
107
+ );
108
+ } catch (error) {
109
+ if (error instanceof AssertionError) {
110
+ throw new AbortError(error);
111
+ }
112
+ throw error;
113
+ }
114
+
115
+ return blob;
116
+ });
117
+ }
118
+
119
+ return vsix;
120
+ }
121
+
122
+ export {pkg};