formatting

This commit is contained in:
Kieran 2023-08-22 22:50:26 +01:00
parent 16c54185bb
commit 0e590feab4
Signed by: Kieran
GPG Key ID: DE71CEB3925BE941
16 changed files with 343 additions and 233 deletions

View File

@ -22,4 +22,4 @@ steps:
volumes: volumes:
- name: cache - name: cache
claim: claim:
name: docker-cache name: docker-cache

View File

@ -1,20 +1,19 @@
module.exports = { module.exports = {
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"], extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
parser: "@typescript-eslint/parser", parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint"], plugins: ["@typescript-eslint"],
root: true, root: true,
ignorePatterns: ["build/", "*.test.ts", "*.js"], ignorePatterns: ["build/", "*.test.ts", "*.js"],
env: { env: {
browser: true, browser: true,
worker: true, worker: true,
commonjs: true, commonjs: true,
node: false, node: false,
}, },
"rules": { rules: {
"@typescript-eslint/no-non-null-assertion": "error", "@typescript-eslint/no-non-null-assertion": "error",
"require-await": "error", "require-await": "error",
"eqeqeq": "error", eqeqeq: "error",
"object-shorthand": "warn", "object-shorthand": "warn",
} },
}; };

View File

@ -1,8 +1,8 @@
#!/usr/bin/env node #!/usr/bin/env node
const {existsSync} = require(`fs`); const { existsSync } = require(`fs`);
const {createRequire} = require(`module`); const { createRequire } = require(`module`);
const {resolve} = require(`path`); const { resolve } = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs"; const relPnpApiPath = "../../../../.pnp.cjs";

View File

@ -1,8 +1,8 @@
#!/usr/bin/env node #!/usr/bin/env node
const {existsSync} = require(`fs`); const { existsSync } = require(`fs`);
const {createRequire} = require(`module`); const { createRequire } = require(`module`);
const {resolve} = require(`path`); const { resolve } = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs"; const relPnpApiPath = "../../../../.pnp.cjs";

View File

@ -1,8 +1,8 @@
#!/usr/bin/env node #!/usr/bin/env node
const {existsSync} = require(`fs`); const { existsSync } = require(`fs`);
const {createRequire} = require(`module`); const { createRequire } = require(`module`);
const {resolve} = require(`path`); const { resolve } = require(`path`);
const relPnpApiPath = "../../../.pnp.cjs"; const relPnpApiPath = "../../../.pnp.cjs";

View File

@ -1,8 +1,8 @@
#!/usr/bin/env node #!/usr/bin/env node
const {existsSync} = require(`fs`); const { existsSync } = require(`fs`);
const {createRequire} = require(`module`); const { createRequire } = require(`module`);
const {resolve} = require(`path`); const { resolve } = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs"; const relPnpApiPath = "../../../../.pnp.cjs";

View File

@ -1,29 +1,31 @@
#!/usr/bin/env node #!/usr/bin/env node
const {existsSync} = require(`fs`); const { existsSync } = require(`fs`);
const {createRequire} = require(`module`); const { createRequire } = require(`module`);
const {resolve} = require(`path`); const { resolve } = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs"; const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath); const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath); const absRequire = createRequire(absPnpApiPath);
const moduleWrapper = tsserver => { const moduleWrapper = (tsserver) => {
if (!process.versions.pnp) { if (!process.versions.pnp) {
return tsserver; return tsserver;
} }
const {isAbsolute} = require(`path`); const { isAbsolute } = require(`path`);
const pnpApi = require(`pnpapi`); const pnpApi = require(`pnpapi`);
const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//); const isVirtual = (str) => str.match(/\/(\$\$virtual|__virtual__)\//);
const isPortal = str => str.startsWith("portal:/"); const isPortal = (str) => str.startsWith("portal:/");
const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`); const normalize = (str) => str.replace(/\\/g, `/`).replace(/^\/?/, `/`);
const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => { const dependencyTreeRoots = new Set(
return `${locator.name}@${locator.reference}`; pnpApi.getDependencyTreeRoots().map((locator) => {
})); return `${locator.name}@${locator.reference}`;
})
);
// VSCode sends the zip paths to TS using the "zip://" prefix, that TS // VSCode sends the zip paths to TS using the "zip://" prefix, that TS
// doesn't understand. This layer makes sure to remove the protocol // doesn't understand. This layer makes sure to remove the protocol
@ -31,7 +33,11 @@ const moduleWrapper = tsserver => {
function toEditorPath(str) { function toEditorPath(str) {
// We add the `zip:` prefix to both `.zip/` paths and virtual paths // We add the `zip:` prefix to both `.zip/` paths and virtual paths
if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) { if (
isAbsolute(str) &&
!str.match(/^\^?(zip:|\/zip\/)/) &&
(str.match(/\.zip\//) || isVirtual(str))
) {
// We also take the opportunity to turn virtual paths into physical ones; // We also take the opportunity to turn virtual paths into physical ones;
// this makes it much easier to work with workspaces that list peer // this makes it much easier to work with workspaces that list peer
// dependencies, since otherwise Ctrl+Click would bring us to the virtual // dependencies, since otherwise Ctrl+Click would bring us to the virtual
@ -45,7 +51,11 @@ const moduleWrapper = tsserver => {
const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str; const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str;
if (resolved) { if (resolved) {
const locator = pnpApi.findPackageLocator(resolved); const locator = pnpApi.findPackageLocator(resolved);
if (locator && (dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) || isPortal(locator.reference))) { if (
locator &&
(dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) ||
isPortal(locator.reference))
) {
str = resolved; str = resolved;
} }
} }
@ -73,41 +83,55 @@ const moduleWrapper = tsserver => {
// Before | ^/zip/c:/foo/bar.zip/package.json // Before | ^/zip/c:/foo/bar.zip/package.json
// After | ^/zip//c:/foo/bar.zip/package.json // After | ^/zip//c:/foo/bar.zip/package.json
// //
case `vscode <1.61`: { case `vscode <1.61`:
str = `^zip:${str}`; {
} break; str = `^zip:${str}`;
}
break;
case `vscode <1.66`: { case `vscode <1.66`:
str = `^/zip/${str}`; {
} break; str = `^/zip/${str}`;
}
break;
case `vscode <1.68`: { case `vscode <1.68`:
str = `^/zip${str}`; {
} break; str = `^/zip${str}`;
}
break;
case `vscode`: { case `vscode`:
str = `^/zip/${str}`; {
} break; str = `^/zip/${str}`;
}
break;
// To make "go to definition" work, // To make "go to definition" work,
// We have to resolve the actual file system path from virtual path // We have to resolve the actual file system path from virtual path
// and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip) // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip)
case `coc-nvim`: { case `coc-nvim`:
str = normalize(resolved).replace(/\.zip\//, `.zip::`); {
str = resolve(`zipfile:${str}`); str = normalize(resolved).replace(/\.zip\//, `.zip::`);
} break; str = resolve(`zipfile:${str}`);
}
break;
// Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server) // Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server)
// We have to resolve the actual file system path from virtual path, // We have to resolve the actual file system path from virtual path,
// everything else is up to neovim // everything else is up to neovim
case `neovim`: { case `neovim`:
str = normalize(resolved).replace(/\.zip\//, `.zip::`); {
str = `zipfile://${str}`; str = normalize(resolved).replace(/\.zip\//, `.zip::`);
} break; str = `zipfile://${str}`;
}
break;
default: { default:
str = `zip:${str}`; {
} break; str = `zip:${str}`;
}
break;
} }
} else { } else {
str = str.replace(/^\/?/, process.platform === `win32` ? `` : `/`); str = str.replace(/^\/?/, process.platform === `win32` ? `` : `/`);
@ -119,26 +143,35 @@ const moduleWrapper = tsserver => {
function fromEditorPath(str) { function fromEditorPath(str) {
switch (hostInfo) { switch (hostInfo) {
case `coc-nvim`: { case `coc-nvim`:
str = str.replace(/\.zip::/, `.zip/`); {
// The path for coc-nvim is in format of /<pwd>/zipfile:/<pwd>/.yarn/... str = str.replace(/\.zip::/, `.zip/`);
// So in order to convert it back, we use .* to match all the thing // The path for coc-nvim is in format of /<pwd>/zipfile:/<pwd>/.yarn/...
// before `zipfile:` // So in order to convert it back, we use .* to match all the thing
return process.platform === `win32` // before `zipfile:`
? str.replace(/^.*zipfile:\//, ``) return process.platform === `win32`
: str.replace(/^.*zipfile:/, ``); ? str.replace(/^.*zipfile:\//, ``)
} break; : str.replace(/^.*zipfile:/, ``);
}
break;
case `neovim`: { case `neovim`:
str = str.replace(/\.zip::/, `.zip/`); {
// The path for neovim is in format of zipfile:///<pwd>/.yarn/... str = str.replace(/\.zip::/, `.zip/`);
return str.replace(/^zipfile:\/\//, ``); // The path for neovim is in format of zipfile:///<pwd>/.yarn/...
} break; return str.replace(/^zipfile:\/\//, ``);
}
break;
case `vscode`: case `vscode`:
default: { default:
return str.replace(/^\^?(zip:|\/zip(\/ts-nul-authority)?)\/+/, process.platform === `win32` ? `` : `/`) {
} break; return str.replace(
/^\^?(zip:|\/zip(\/ts-nul-authority)?)\/+/,
process.platform === `win32` ? `` : `/`
);
}
break;
} }
} }
@ -150,8 +183,9 @@ const moduleWrapper = tsserver => {
// TypeScript already does local loads and if this code is running the user trusts the workspace // TypeScript already does local loads and if this code is running the user trusts the workspace
// https://github.com/microsoft/vscode/issues/45856 // https://github.com/microsoft/vscode/issues/45856
const ConfiguredProject = tsserver.server.ConfiguredProject; const ConfiguredProject = tsserver.server.ConfiguredProject;
const {enablePluginsWithOptions: originalEnablePluginsWithOptions} = ConfiguredProject.prototype; const { enablePluginsWithOptions: originalEnablePluginsWithOptions } =
ConfiguredProject.prototype.enablePluginsWithOptions = function() { ConfiguredProject.prototype;
ConfiguredProject.prototype.enablePluginsWithOptions = function () {
this.projectService.allowLocalPluginLoads = true; this.projectService.allowLocalPluginLoads = true;
return originalEnablePluginsWithOptions.apply(this, arguments); return originalEnablePluginsWithOptions.apply(this, arguments);
}; };
@ -161,12 +195,13 @@ const moduleWrapper = tsserver => {
// like an absolute path of ours and normalize it. // like an absolute path of ours and normalize it.
const Session = tsserver.server.Session; const Session = tsserver.server.Session;
const {onMessage: originalOnMessage, send: originalSend} = Session.prototype; const { onMessage: originalOnMessage, send: originalSend } =
Session.prototype;
let hostInfo = `unknown`; let hostInfo = `unknown`;
Object.assign(Session.prototype, { Object.assign(Session.prototype, {
onMessage(/** @type {string | object} */ message) { onMessage(/** @type {string | object} */ message) {
const isStringMessage = typeof message === 'string'; const isStringMessage = typeof message === "string";
const parsedMessage = isStringMessage ? JSON.parse(message) : message; const parsedMessage = isStringMessage ? JSON.parse(message) : message;
if ( if (
@ -177,10 +212,12 @@ const moduleWrapper = tsserver => {
) { ) {
hostInfo = parsedMessage.arguments.hostInfo; hostInfo = parsedMessage.arguments.hostInfo;
if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) { if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) {
const [, major, minor] = (process.env.VSCODE_IPC_HOOK.match( const [, major, minor] = (
// The RegExp from https://semver.org/ but without the caret at the start process.env.VSCODE_IPC_HOOK.match(
/(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/ // The RegExp from https://semver.org/ but without the caret at the start
) ?? []).map(Number) /(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
) ?? []
).map(Number);
if (major === 1) { if (major === 1) {
if (minor < 61) { if (minor < 61) {
@ -194,21 +231,31 @@ const moduleWrapper = tsserver => {
} }
} }
const processedMessageJSON = JSON.stringify(parsedMessage, (key, value) => { const processedMessageJSON = JSON.stringify(
return typeof value === 'string' ? fromEditorPath(value) : value; parsedMessage,
}); (key, value) => {
return typeof value === "string" ? fromEditorPath(value) : value;
}
);
return originalOnMessage.call( return originalOnMessage.call(
this, this,
isStringMessage ? processedMessageJSON : JSON.parse(processedMessageJSON) isStringMessage
? processedMessageJSON
: JSON.parse(processedMessageJSON)
); );
}, },
send(/** @type {any} */ msg) { send(/** @type {any} */ msg) {
return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => { return originalSend.call(
return typeof value === `string` ? toEditorPath(value) : value; this,
}))); JSON.parse(
} JSON.stringify(msg, (key, value) => {
return typeof value === `string` ? toEditorPath(value) : value;
})
)
);
},
}); });
return tsserver; return tsserver;

View File

@ -1,29 +1,31 @@
#!/usr/bin/env node #!/usr/bin/env node
const {existsSync} = require(`fs`); const { existsSync } = require(`fs`);
const {createRequire} = require(`module`); const { createRequire } = require(`module`);
const {resolve} = require(`path`); const { resolve } = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs"; const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath); const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath); const absRequire = createRequire(absPnpApiPath);
const moduleWrapper = tsserver => { const moduleWrapper = (tsserver) => {
if (!process.versions.pnp) { if (!process.versions.pnp) {
return tsserver; return tsserver;
} }
const {isAbsolute} = require(`path`); const { isAbsolute } = require(`path`);
const pnpApi = require(`pnpapi`); const pnpApi = require(`pnpapi`);
const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//); const isVirtual = (str) => str.match(/\/(\$\$virtual|__virtual__)\//);
const isPortal = str => str.startsWith("portal:/"); const isPortal = (str) => str.startsWith("portal:/");
const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`); const normalize = (str) => str.replace(/\\/g, `/`).replace(/^\/?/, `/`);
const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => { const dependencyTreeRoots = new Set(
return `${locator.name}@${locator.reference}`; pnpApi.getDependencyTreeRoots().map((locator) => {
})); return `${locator.name}@${locator.reference}`;
})
);
// VSCode sends the zip paths to TS using the "zip://" prefix, that TS // VSCode sends the zip paths to TS using the "zip://" prefix, that TS
// doesn't understand. This layer makes sure to remove the protocol // doesn't understand. This layer makes sure to remove the protocol
@ -31,7 +33,11 @@ const moduleWrapper = tsserver => {
function toEditorPath(str) { function toEditorPath(str) {
// We add the `zip:` prefix to both `.zip/` paths and virtual paths // We add the `zip:` prefix to both `.zip/` paths and virtual paths
if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) { if (
isAbsolute(str) &&
!str.match(/^\^?(zip:|\/zip\/)/) &&
(str.match(/\.zip\//) || isVirtual(str))
) {
// We also take the opportunity to turn virtual paths into physical ones; // We also take the opportunity to turn virtual paths into physical ones;
// this makes it much easier to work with workspaces that list peer // this makes it much easier to work with workspaces that list peer
// dependencies, since otherwise Ctrl+Click would bring us to the virtual // dependencies, since otherwise Ctrl+Click would bring us to the virtual
@ -45,7 +51,11 @@ const moduleWrapper = tsserver => {
const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str; const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str;
if (resolved) { if (resolved) {
const locator = pnpApi.findPackageLocator(resolved); const locator = pnpApi.findPackageLocator(resolved);
if (locator && (dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) || isPortal(locator.reference))) { if (
locator &&
(dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) ||
isPortal(locator.reference))
) {
str = resolved; str = resolved;
} }
} }
@ -73,41 +83,55 @@ const moduleWrapper = tsserver => {
// Before | ^/zip/c:/foo/bar.zip/package.json // Before | ^/zip/c:/foo/bar.zip/package.json
// After | ^/zip//c:/foo/bar.zip/package.json // After | ^/zip//c:/foo/bar.zip/package.json
// //
case `vscode <1.61`: { case `vscode <1.61`:
str = `^zip:${str}`; {
} break; str = `^zip:${str}`;
}
break;
case `vscode <1.66`: { case `vscode <1.66`:
str = `^/zip/${str}`; {
} break; str = `^/zip/${str}`;
}
break;
case `vscode <1.68`: { case `vscode <1.68`:
str = `^/zip${str}`; {
} break; str = `^/zip${str}`;
}
break;
case `vscode`: { case `vscode`:
str = `^/zip/${str}`; {
} break; str = `^/zip/${str}`;
}
break;
// To make "go to definition" work, // To make "go to definition" work,
// We have to resolve the actual file system path from virtual path // We have to resolve the actual file system path from virtual path
// and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip) // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip)
case `coc-nvim`: { case `coc-nvim`:
str = normalize(resolved).replace(/\.zip\//, `.zip::`); {
str = resolve(`zipfile:${str}`); str = normalize(resolved).replace(/\.zip\//, `.zip::`);
} break; str = resolve(`zipfile:${str}`);
}
break;
// Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server) // Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server)
// We have to resolve the actual file system path from virtual path, // We have to resolve the actual file system path from virtual path,
// everything else is up to neovim // everything else is up to neovim
case `neovim`: { case `neovim`:
str = normalize(resolved).replace(/\.zip\//, `.zip::`); {
str = `zipfile://${str}`; str = normalize(resolved).replace(/\.zip\//, `.zip::`);
} break; str = `zipfile://${str}`;
}
break;
default: { default:
str = `zip:${str}`; {
} break; str = `zip:${str}`;
}
break;
} }
} else { } else {
str = str.replace(/^\/?/, process.platform === `win32` ? `` : `/`); str = str.replace(/^\/?/, process.platform === `win32` ? `` : `/`);
@ -119,26 +143,35 @@ const moduleWrapper = tsserver => {
function fromEditorPath(str) { function fromEditorPath(str) {
switch (hostInfo) { switch (hostInfo) {
case `coc-nvim`: { case `coc-nvim`:
str = str.replace(/\.zip::/, `.zip/`); {
// The path for coc-nvim is in format of /<pwd>/zipfile:/<pwd>/.yarn/... str = str.replace(/\.zip::/, `.zip/`);
// So in order to convert it back, we use .* to match all the thing // The path for coc-nvim is in format of /<pwd>/zipfile:/<pwd>/.yarn/...
// before `zipfile:` // So in order to convert it back, we use .* to match all the thing
return process.platform === `win32` // before `zipfile:`
? str.replace(/^.*zipfile:\//, ``) return process.platform === `win32`
: str.replace(/^.*zipfile:/, ``); ? str.replace(/^.*zipfile:\//, ``)
} break; : str.replace(/^.*zipfile:/, ``);
}
break;
case `neovim`: { case `neovim`:
str = str.replace(/\.zip::/, `.zip/`); {
// The path for neovim is in format of zipfile:///<pwd>/.yarn/... str = str.replace(/\.zip::/, `.zip/`);
return str.replace(/^zipfile:\/\//, ``); // The path for neovim is in format of zipfile:///<pwd>/.yarn/...
} break; return str.replace(/^zipfile:\/\//, ``);
}
break;
case `vscode`: case `vscode`:
default: { default:
return str.replace(/^\^?(zip:|\/zip(\/ts-nul-authority)?)\/+/, process.platform === `win32` ? `` : `/`) {
} break; return str.replace(
/^\^?(zip:|\/zip(\/ts-nul-authority)?)\/+/,
process.platform === `win32` ? `` : `/`
);
}
break;
} }
} }
@ -150,8 +183,9 @@ const moduleWrapper = tsserver => {
// TypeScript already does local loads and if this code is running the user trusts the workspace // TypeScript already does local loads and if this code is running the user trusts the workspace
// https://github.com/microsoft/vscode/issues/45856 // https://github.com/microsoft/vscode/issues/45856
const ConfiguredProject = tsserver.server.ConfiguredProject; const ConfiguredProject = tsserver.server.ConfiguredProject;
const {enablePluginsWithOptions: originalEnablePluginsWithOptions} = ConfiguredProject.prototype; const { enablePluginsWithOptions: originalEnablePluginsWithOptions } =
ConfiguredProject.prototype.enablePluginsWithOptions = function() { ConfiguredProject.prototype;
ConfiguredProject.prototype.enablePluginsWithOptions = function () {
this.projectService.allowLocalPluginLoads = true; this.projectService.allowLocalPluginLoads = true;
return originalEnablePluginsWithOptions.apply(this, arguments); return originalEnablePluginsWithOptions.apply(this, arguments);
}; };
@ -161,12 +195,13 @@ const moduleWrapper = tsserver => {
// like an absolute path of ours and normalize it. // like an absolute path of ours and normalize it.
const Session = tsserver.server.Session; const Session = tsserver.server.Session;
const {onMessage: originalOnMessage, send: originalSend} = Session.prototype; const { onMessage: originalOnMessage, send: originalSend } =
Session.prototype;
let hostInfo = `unknown`; let hostInfo = `unknown`;
Object.assign(Session.prototype, { Object.assign(Session.prototype, {
onMessage(/** @type {string | object} */ message) { onMessage(/** @type {string | object} */ message) {
const isStringMessage = typeof message === 'string'; const isStringMessage = typeof message === "string";
const parsedMessage = isStringMessage ? JSON.parse(message) : message; const parsedMessage = isStringMessage ? JSON.parse(message) : message;
if ( if (
@ -177,10 +212,12 @@ const moduleWrapper = tsserver => {
) { ) {
hostInfo = parsedMessage.arguments.hostInfo; hostInfo = parsedMessage.arguments.hostInfo;
if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) { if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) {
const [, major, minor] = (process.env.VSCODE_IPC_HOOK.match( const [, major, minor] = (
// The RegExp from https://semver.org/ but without the caret at the start process.env.VSCODE_IPC_HOOK.match(
/(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/ // The RegExp from https://semver.org/ but without the caret at the start
) ?? []).map(Number) /(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
) ?? []
).map(Number);
if (major === 1) { if (major === 1) {
if (minor < 61) { if (minor < 61) {
@ -194,21 +231,31 @@ const moduleWrapper = tsserver => {
} }
} }
const processedMessageJSON = JSON.stringify(parsedMessage, (key, value) => { const processedMessageJSON = JSON.stringify(
return typeof value === 'string' ? fromEditorPath(value) : value; parsedMessage,
}); (key, value) => {
return typeof value === "string" ? fromEditorPath(value) : value;
}
);
return originalOnMessage.call( return originalOnMessage.call(
this, this,
isStringMessage ? processedMessageJSON : JSON.parse(processedMessageJSON) isStringMessage
? processedMessageJSON
: JSON.parse(processedMessageJSON)
); );
}, },
send(/** @type {any} */ msg) { send(/** @type {any} */ msg) {
return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => { return originalSend.call(
return typeof value === `string` ? toEditorPath(value) : value; this,
}))); JSON.parse(
} JSON.stringify(msg, (key, value) => {
return typeof value === `string` ? toEditorPath(value) : value;
})
)
);
},
}); });
return tsserver; return tsserver;

View File

@ -1,8 +1,8 @@
#!/usr/bin/env node #!/usr/bin/env node
const {existsSync} = require(`fs`); const { existsSync } = require(`fs`);
const {createRequire} = require(`module`); const { createRequire } = require(`module`);
const {resolve} = require(`path`); const { resolve } = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs"; const relPnpApiPath = "../../../../.pnp.cjs";

View File

@ -1,18 +1,17 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta name="description" content="Nostr live streaming" />
<link rel="apple-touch-icon" href="/logo.png" />
<link rel="icon" href="/favicon.ico" />
<link rel="manifest" href="/manifest.json" />
<title>zap.stream</title>
</head>
<head> <body>
<meta charset="utf-8" /> <div id="root"></div>
<meta name="viewport" content="width=device-width, initial-scale=1" /> </body>
<meta name="theme-color" content="#000000" />
<meta name="description" content="Nostr live streaming" />
<link rel="apple-touch-icon" href="/logo.png" />
<link rel="icon" href="/favicon.ico" />
<link rel="manifest" href="/manifest.json" />
<title>zap.stream</title>
</head>
<body>
<div id="root"></div>
</body>
</html> </html>

View File

@ -1,3 +1 @@
[ [{ "id": "nsfw", "text": "NSFW" }]
{ "id": "nsfw", "text": "NSFW" }
]

View File

@ -210,16 +210,16 @@ export function ChatMessage({
style={ style={
isTablet isTablet
? { ? {
display: showZapDialog || isHovering ? "flex" : "none", display: showZapDialog || isHovering ? "flex" : "none",
} }
: { : {
position: "fixed", position: "fixed",
top: topOffset ? topOffset - 12 : 0, top: topOffset ? topOffset - 12 : 0,
left: leftOffset ? leftOffset - 32 : 0, left: leftOffset ? leftOffset - 32 : 0,
opacity: showZapDialog || isHovering ? 1 : 0, opacity: showZapDialog || isHovering ? 1 : 0,
pointerEvents: pointerEvents:
showZapDialog || isHovering ? "auto" : "none", showZapDialog || isHovering ? "auto" : "none",
} }
} }
> >
{zapTarget && ( {zapTarget && (

View File

@ -36,7 +36,11 @@ function NewStream({ ev, onFinish }: StreamEditorProps) {
onFinish={(ex) => { onFinish={(ex) => {
currentProvider.updateStreamInfo(ex); currentProvider.updateStreamInfo(ex);
if (!ev) { if (!ev) {
if (findTag(ex, "content-warning") && __XXX_HOST && __XXX === false) { if (
findTag(ex, "content-warning") &&
__XXX_HOST &&
__XXX === false
) {
location.href = `${__XXX_HOST}/${eventLink(ex)}`; location.href = `${__XXX_HOST}/${eventLink(ex)}`;
} else { } else {
navigate(`/${eventLink(ex)}`, { navigate(`/${eventLink(ex)}`, {

View File

@ -46,7 +46,8 @@ export function SendZaps({
const UsdRate = 28_000; const UsdRate = 28_000;
const satsAmounts = [ const satsAmounts = [
21, 69, 121, 221, 420, 1_000, 2_100, 5_000, 6_666, 10_000, 21_000, 42_000, 69_000, 100_000, 210_000, 500_000, 1_000_000, 21, 69, 121, 221, 420, 1_000, 2_100, 5_000, 6_666, 10_000, 21_000, 42_000,
69_000, 100_000, 210_000, 500_000, 1_000_000,
]; ];
const usdAmounts = [0.05, 0.5, 2, 5, 10, 50, 100, 200]; const usdAmounts = [0.05, 0.5, 2, 5, 10, 50, 100, 200];
const [isFiat, setIsFiat] = useState(false); const [isFiat, setIsFiat] = useState(false);

View File

@ -1,72 +1,84 @@
/* latin-ext */ /* latin-ext */
@font-face { @font-face {
font-family: 'Outfit'; font-family: "Outfit";
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
font-display: swap; font-display: swap;
src: url(outfit_400_latin-ext.woff2) format('woff2'); src: url(outfit_400_latin-ext.woff2) format("woff2");
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
} }
/* latin */ /* latin */
@font-face { @font-face {
font-family: 'Outfit'; font-family: "Outfit";
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
font-display: swap; font-display: swap;
src: url(outfit_400_latin.woff2) format('woff2'); src: url(outfit_400_latin.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
} }
/* latin-ext */ /* latin-ext */
@font-face { @font-face {
font-family: 'Outfit'; font-family: "Outfit";
font-style: normal; font-style: normal;
font-weight: 500; font-weight: 500;
font-display: swap; font-display: swap;
src: url(outfit_500_latin-ext.woff2) format('woff2'); src: url(outfit_500_latin-ext.woff2) format("woff2");
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
} }
/* latin */ /* latin */
@font-face { @font-face {
font-family: 'Outfit'; font-family: "Outfit";
font-style: normal; font-style: normal;
font-weight: 500; font-weight: 500;
font-display: swap; font-display: swap;
src: url(outfit_500_latin.woff2) format('woff2'); src: url(outfit_500_latin.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
} }
/* latin-ext */ /* latin-ext */
@font-face { @font-face {
font-family: 'Outfit'; font-family: "Outfit";
font-style: normal; font-style: normal;
font-weight: 600; font-weight: 600;
font-display: swap; font-display: swap;
src: url(outfit_600_latin-ext.woff2) format('woff2'); src: url(outfit_600_latin-ext.woff2) format("woff2");
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
} }
/* latin */ /* latin */
@font-face { @font-face {
font-family: 'Outfit'; font-family: "Outfit";
font-style: normal; font-style: normal;
font-weight: 600; font-weight: 600;
font-display: swap; font-display: swap;
src: url(outfit_600_latin.woff2) format('woff2'); src: url(outfit_600_latin.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
} }
/* latin-ext */ /* latin-ext */
@font-face { @font-face {
font-family: 'Outfit'; font-family: "Outfit";
font-style: normal; font-style: normal;
font-weight: 700; font-weight: 700;
font-display: swap; font-display: swap;
src: url(outfit_700_latin-ext.woff2) format('woff2'); src: url(outfit_700_latin-ext.woff2) format("woff2");
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
} }
/* latin */ /* latin */
@font-face { @font-face {
font-family: 'Outfit'; font-family: "Outfit";
font-style: normal; font-style: normal;
font-weight: 700; font-weight: 700;
font-display: swap; font-display: swap;
src: url(outfit_700_latin.woff2) format('woff2'); src: url(outfit_700_latin.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
} }

View File

@ -45,7 +45,7 @@ const config = {
{ from: "public/robots.txt" }, { from: "public/robots.txt" },
{ from: "public/icons.svg" }, { from: "public/icons.svg" },
{ from: "public/logo.png" }, { from: "public/logo.png" },
{ from: "_headers" } { from: "_headers" },
], ],
}), }),
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
@ -68,8 +68,8 @@ const config = {
}), }),
new webpack.DefinePlugin({ new webpack.DefinePlugin({
__XXX: process.env["__XXX"] || JSON.stringify(false), __XXX: process.env["__XXX"] || JSON.stringify(false),
__XXX_HOST: JSON.stringify("https://xxzap.com") __XXX_HOST: JSON.stringify("https://xxzap.com"),
}) }),
], ],
module: { module: {
rules: [ rules: [
@ -89,9 +89,12 @@ const config = {
babelrc: false, babelrc: false,
configFile: false, configFile: false,
presets: [ presets: [
["@babel/preset-env", { [
targets: "defaults" "@babel/preset-env",
}], {
targets: "defaults",
},
],
["@babel/preset-react", { runtime: "automatic" }], ["@babel/preset-react", { runtime: "automatic" }],
"@babel/preset-typescript", "@babel/preset-typescript",
], ],
@ -106,7 +109,7 @@ const config = {
], ],
}, },
}, },
require.resolve("ts-loader") require.resolve("ts-loader"),
], ],
}, },
{ {
@ -148,7 +151,7 @@ const config = {
aliasFields: ["browser"], aliasFields: ["browser"],
extensions: ["...", ".tsx", ".ts", ".jsx", ".js"], extensions: ["...", ".tsx", ".ts", ".jsx", ".js"],
modules: ["...", __dirname, path.resolve(__dirname, "src")], modules: ["...", __dirname, path.resolve(__dirname, "src")],
fallback: { "crypto": false } fallback: { crypto: false },
}, },
}; };