Compare commits
71
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab869e8469 | ||
|
|
3b048a990b | ||
|
|
e36a41dcc4 | ||
|
|
54d5450200 | ||
|
|
85c81a046c | ||
|
|
3a91ce8411 | ||
|
|
752a5d56ab | ||
|
|
d987b87d6d | ||
|
|
3e936d0e3f | ||
|
|
e57709f4d9 | ||
|
|
8e34418a64 | ||
|
|
55edb3fc58 | ||
|
|
2c5c9636a2 | ||
|
|
290a62d727 | ||
|
|
d001070938 | ||
|
|
9f5f254d2e | ||
|
|
d3a5ccae5e | ||
|
|
ecc47da2a3 | ||
|
|
f868933d09 | ||
|
|
4090ff3db2 | ||
|
|
77e4e30364 | ||
|
|
ab386ca3d6 | ||
|
|
0a5975d046 | ||
|
|
ca2692a0dc | ||
|
|
9119a5bd3d | ||
|
|
567bdb5e1e | ||
|
|
4b1abad427 | ||
|
|
5efb9d63ec | ||
|
|
db5039b702 | ||
|
|
5e45f78478 | ||
|
|
18bf1f4658 | ||
|
|
72b7b1ea3b | ||
|
|
3717a26fcb | ||
|
|
f0c47e6e2d | ||
|
|
7826dee4ea | ||
|
|
2905d317af | ||
|
|
0fc0cfdab6 | ||
|
|
3668ca8977 | ||
|
|
36f7110813 | ||
|
|
0d48f9fec8 | ||
|
|
c03eee3f55 | ||
|
|
978cfb4258 | ||
|
|
726cbbecbc | ||
|
|
208f9218f9 | ||
|
|
c0b99e4785 | ||
|
|
53feef5cf5 | ||
|
|
eed1e1cf27 | ||
|
|
29a2735168 | ||
|
|
aa75ddccbb | ||
|
|
d7ac67dbf8 | ||
|
|
0bc9ebb914 | ||
|
|
d8417a5576 | ||
|
|
e1570658ec | ||
|
|
46f20da8c2 | ||
|
|
a64cfd6ebb | ||
|
|
3e9f3304ce | ||
|
|
50be61163a | ||
|
|
fa79ad755d | ||
|
|
c9be1b35fb | ||
|
|
4bf3b49c41 | ||
|
|
a903ac1afc | ||
|
|
84665761ff | ||
|
|
7138fd1ffb | ||
|
|
3a6cbe0787 | ||
|
|
f1be014b8f | ||
|
|
8b3ac48ea1 | ||
|
|
69809452a8 | ||
|
|
91edee5791 | ||
|
|
9eb7c18143 | ||
|
|
a35721026f | ||
|
|
f8066b86df |
@@ -11,7 +11,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 14
|
||||
node-version: 16
|
||||
|
||||
- name: Cache node modules
|
||||
id: cacheNodeModules
|
||||
@@ -50,6 +50,9 @@ jobs:
|
||||
- name: Package using webpack plugin
|
||||
run: npm run package-for-smoketest --prefix webpack-plugin
|
||||
|
||||
- name: Package using esbuild
|
||||
run: npm run package-for-smoketest-esbuild
|
||||
|
||||
- name: Run smoke test
|
||||
run: npm run smoketest
|
||||
|
||||
|
||||
@@ -12,13 +12,13 @@ on:
|
||||
default: 'true'
|
||||
jobs:
|
||||
publish:
|
||||
if: github.repository == "microsoft/monaco-editor"
|
||||
if: ${{ github.repository == 'microsoft/monaco-editor' }}
|
||||
name: Publish to npm
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 14
|
||||
node-version: 16
|
||||
|
||||
- name: (monaco-editor) checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 14
|
||||
node-version: 16
|
||||
|
||||
- name: Cache node modules
|
||||
id: cacheNodeModules
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@
|
||||
/samples/browser-esm-webpack-small/dist/*.js
|
||||
/samples/browser-esm-webpack-typescript/dist/*.js
|
||||
/samples/browser-esm-webpack-typescript-react/dist/*.js
|
||||
/src/typescript/lib/
|
||||
/src/language/typescript/lib/
|
||||
/test/manual/generated/
|
||||
/website/lib/
|
||||
/website/typedoc/monaco.d.ts
|
||||
|
||||
+39
-1
@@ -1,6 +1,26 @@
|
||||
# Monaco Editor Changelog
|
||||
|
||||
## [0.32.0] (TBD)
|
||||
## [0.33.0]
|
||||
|
||||
- The first parameter of all `monaco.languages.register*Provider` functions has changed to take a `DocumentSelector` instead of a single `languageId`
|
||||
- The `Environment.getWorker` function can now return a `Promise`
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- `InlayHintKind.Other` is removed.
|
||||
|
||||
### Thank you
|
||||
|
||||
Contributions to `monaco-editor`:
|
||||
|
||||
- [@Dan1ve (Daniel Veihelmann)](https://github.com/Dan1ve): Make Vite sample code Firefox compatible [PR #2991](https://github.com/microsoft/monaco-editor/pull/2991)
|
||||
- [@philipturner (Philip Turner)](https://github.com/philipturner): Add `@noDerivative` modifier to Swift [PR #2957](https://github.com/microsoft/monaco-editor/pull/2957)
|
||||
|
||||
## [0.32.1] (04.02.2022)
|
||||
|
||||
- fixes [an issue with service initialization](https://github.com/microsoft/monaco-editor/issues/2941).
|
||||
|
||||
## [0.32.0] (03.02.2022)
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
@@ -8,6 +28,24 @@
|
||||
- `IDiffEditor.getDomNode()` has been renamed to `IDiffEditor.getContainerDomNode()`.
|
||||
- `InlayHint.text` has been replaced by `InlayHint.label` and `InlayHintsProvider.provideInlayHints` now returns an `InlayHintList`.
|
||||
|
||||
### Thank you
|
||||
|
||||
Contributions to `monaco-editor`:
|
||||
|
||||
- [@blutorange (Andre Wachsmuth)](https://github.com/blutorange): Implements #2383 Add syntax modes for FreeMarker template language [PR #2847](https://github.com/microsoft/monaco-editor/pull/2847)
|
||||
- [@forensicmike (forensicmike1)](https://github.com/forensicmike): Add "cd monaco-editor" to the step by step commandline instructions for cloning and running the samples [PR #2894](https://github.com/microsoft/monaco-editor/pull/2894)
|
||||
- [@juan-carlos-diaz](https://github.com/juan-carlos-diaz): Fix #2851 Highlight correctly the attributes and identifiers (with dashes) for Shell language [PR #2871](https://github.com/microsoft/monaco-editor/pull/2871)
|
||||
- [@MasterOdin (Matthew Peveler)](https://github.com/MasterOdin): Only run publish workflow on main monaco-editor repo [PR #2926](https://github.com/microsoft/monaco-editor/pull/2926)
|
||||
- [@philipturner (Philip Turner)](https://github.com/philipturner)
|
||||
- Update Swift language specification to version 5.5 [PR #2855](https://github.com/microsoft/monaco-editor/pull/2855)
|
||||
- Add @preconcurrency to Swift declaration attributes [PR #2924](https://github.com/microsoft/monaco-editor/pull/2924)
|
||||
- [@rcjsuen (Remy Suen)](https://github.com/rcjsuen): Support hyphenated HTML tags in Markdown syntax [PR #2864](https://github.com/microsoft/monaco-editor/pull/2864)
|
||||
- [@resistdesign (Ryan Graff)](https://github.com/resistdesign): doc: (samples) Simplify Browser ESM Parcel build [PR #2832](https://github.com/microsoft/monaco-editor/pull/2832)
|
||||
- [@ValeraS (Valeriy)](https://github.com/ValeraS)
|
||||
- fix(monaco-editor-webpack-plugin): load monaco-editor with webpack 4 [PR #2818](https://github.com/microsoft/monaco-editor/pull/2818)
|
||||
- tune(monaco-editor-webpack-plugin): expose plugin options type [PR #2853](https://github.com/microsoft/monaco-editor/pull/2853)
|
||||
- [@ZusorCode (Tobias Messner)](https://github.com/ZusorCode): Add .cjs extension for javascript files [PR #2929](https://github.com/microsoft/monaco-editor/pull/2929)
|
||||
|
||||
## [0.31.1] (14.12.2021)
|
||||
|
||||
- Fixes [a problem with missing colors](https://github.com/microsoft/monaco-editor/issues/2822)
|
||||
|
||||
+3
-4
@@ -13,14 +13,13 @@
|
||||
|
||||
- update `package.json` and bump `"version"` as necessary
|
||||
- update `package.json` and edit `"vscode"` to point to the vscode repo commit that should be shipped at `monaco-editor-core` (both `monaco-editor-core` and `monaco-editor` will be published under the same version defined in `package.json`).
|
||||
- write entry in `CHANGELOG.md`
|
||||
- API Changes / Breaking Changes / New and noteworthy
|
||||
- Thank you ([use this tool](https://vscode-tools.azurewebsites.net/acknowledgement/))
|
||||
- trigger a build using [`Publish to npm`](https://github.com/microsoft/monaco-editor/actions/workflows/publish.yml) and type false when asked "is nightly?"
|
||||
- if the publish succeeded, run `git tag 0.x.y` and `git push origin 0.x.y`
|
||||
- edit `package.json` and update the `"monaco-editor-core"` dev dependency.
|
||||
- run `npm install`
|
||||
- run `npm run release`
|
||||
- write entry in `CHANGELOG.md`
|
||||
- API Changes / Breaking Changes / New and noteworthy
|
||||
- Thank you ([use this tool](https://vscode-tools.azurewebsites.net/acknowledgement/))
|
||||
|
||||
#### 8. Publish new webpack plugin
|
||||
|
||||
|
||||
@@ -3,11 +3,9 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
//@ts-check
|
||||
|
||||
const glob = require('glob');
|
||||
const { tsc, dts, buildESM, buildAMD } = require('../build/utils');
|
||||
const { copyFile, removeDir } = require('../build/fs');
|
||||
import glob from 'glob';
|
||||
import { tsc, dts, buildESM, buildAMD } from './utils';
|
||||
import { copyFile, removeDir } from './fs';
|
||||
|
||||
removeDir(`out`);
|
||||
|
||||
@@ -15,20 +13,24 @@ tsc(`src/tsconfig.json`);
|
||||
|
||||
//#region Type Defintion
|
||||
|
||||
dts(`out/amd/css/monaco.contribution.d.ts`, `out/release/css/monaco.d.ts`, 'monaco.languages.css');
|
||||
dts(
|
||||
`out/amd/html/monaco.contribution.d.ts`,
|
||||
`out/release/html/monaco.d.ts`,
|
||||
`out/amd/language/css/monaco.contribution.d.ts`,
|
||||
`out/release/css.d.ts`,
|
||||
'monaco.languages.css'
|
||||
);
|
||||
dts(
|
||||
`out/amd/language/html/monaco.contribution.d.ts`,
|
||||
`out/release/html.d.ts`,
|
||||
'monaco.languages.html'
|
||||
);
|
||||
dts(
|
||||
`out/amd/json/monaco.contribution.d.ts`,
|
||||
`out/release/json/monaco.d.ts`,
|
||||
`out/amd/language/json/monaco.contribution.d.ts`,
|
||||
`out/release/json.d.ts`,
|
||||
'monaco.languages.json'
|
||||
);
|
||||
dts(
|
||||
`out/amd/typescript/monaco.contribution.d.ts`,
|
||||
`out/release/typescript/monaco.d.ts`,
|
||||
`out/amd/language/typescript/monaco.contribution.d.ts`,
|
||||
`out/release/typescript.d.ts`,
|
||||
'monaco.languages.typescript'
|
||||
);
|
||||
|
||||
@@ -37,24 +39,29 @@ dts(
|
||||
//#region css
|
||||
|
||||
buildESM({
|
||||
base: 'css',
|
||||
entryPoints: ['src/css/monaco.contribution.ts', 'src/css/cssMode.ts', 'src/css/css.worker.ts'],
|
||||
external: ['monaco-editor-core', '*/cssMode']
|
||||
base: 'language/css',
|
||||
entryPoints: [
|
||||
'src/language/css/monaco.contribution.ts',
|
||||
'src/language/css/cssMode.ts',
|
||||
'src/language/css/css.worker.ts'
|
||||
],
|
||||
external: ['monaco-editor-core', '*/cssMode', '*/monaco.contribution']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'css',
|
||||
entryPoint: 'src/css/monaco.contribution.ts',
|
||||
base: 'language/css',
|
||||
entryPoint: 'src/language/css/monaco.contribution.ts',
|
||||
amdModuleId: 'vs/language/css/monaco.contribution',
|
||||
amdDependencies: ['vs/editor/editor.api']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'css',
|
||||
entryPoint: 'src/css/cssMode.ts',
|
||||
amdModuleId: 'vs/language/css/cssMode'
|
||||
base: 'language/css',
|
||||
entryPoint: 'src/language/css/cssMode.ts',
|
||||
amdModuleId: 'vs/language/css/cssMode',
|
||||
external: ['*/monaco.contribution']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'css',
|
||||
entryPoint: 'src/css/cssWorker.ts',
|
||||
base: 'language/css',
|
||||
entryPoint: 'src/language/css/cssWorker.ts',
|
||||
amdModuleId: 'vs/language/css/cssWorker'
|
||||
});
|
||||
|
||||
@@ -63,28 +70,29 @@ buildAMD({
|
||||
//#region html
|
||||
|
||||
buildESM({
|
||||
base: 'html',
|
||||
base: 'language/html',
|
||||
entryPoints: [
|
||||
'src/html/monaco.contribution.ts',
|
||||
'src/html/htmlMode.ts',
|
||||
'src/html/html.worker.ts'
|
||||
'src/language/html/monaco.contribution.ts',
|
||||
'src/language/html/htmlMode.ts',
|
||||
'src/language/html/html.worker.ts'
|
||||
],
|
||||
external: ['monaco-editor-core', '*/htmlMode']
|
||||
external: ['monaco-editor-core', '*/htmlMode', '*/monaco.contribution']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'html',
|
||||
entryPoint: 'src/html/monaco.contribution.ts',
|
||||
base: 'language/html',
|
||||
entryPoint: 'src/language/html/monaco.contribution.ts',
|
||||
amdModuleId: 'vs/language/html/monaco.contribution',
|
||||
amdDependencies: ['vs/editor/editor.api']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'html',
|
||||
entryPoint: 'src/html/htmlMode.ts',
|
||||
amdModuleId: 'vs/language/html/htmlMode'
|
||||
base: 'language/html',
|
||||
entryPoint: 'src/language/html/htmlMode.ts',
|
||||
amdModuleId: 'vs/language/html/htmlMode',
|
||||
external: ['*/monaco.contribution']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'html',
|
||||
entryPoint: 'src/html/htmlWorker.ts',
|
||||
base: 'language/html',
|
||||
entryPoint: 'src/language/html/htmlWorker.ts',
|
||||
amdModuleId: 'vs/language/html/htmlWorker'
|
||||
});
|
||||
|
||||
@@ -93,28 +101,29 @@ buildAMD({
|
||||
//#region json
|
||||
|
||||
buildESM({
|
||||
base: 'json',
|
||||
base: 'language/json',
|
||||
entryPoints: [
|
||||
'src/json/monaco.contribution.ts',
|
||||
'src/json/jsonMode.ts',
|
||||
'src/json/json.worker.ts'
|
||||
'src/language/json/monaco.contribution.ts',
|
||||
'src/language/json/jsonMode.ts',
|
||||
'src/language/json/json.worker.ts'
|
||||
],
|
||||
external: ['monaco-editor-core', '*/jsonMode']
|
||||
external: ['monaco-editor-core', '*/jsonMode', '*/monaco.contribution']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'json',
|
||||
entryPoint: 'src/json/monaco.contribution.ts',
|
||||
base: 'language/json',
|
||||
entryPoint: 'src/language/json/monaco.contribution.ts',
|
||||
amdModuleId: 'vs/language/json/monaco.contribution',
|
||||
amdDependencies: ['vs/editor/editor.api']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'json',
|
||||
entryPoint: 'src/json/jsonMode.ts',
|
||||
amdModuleId: 'vs/language/json/jsonMode'
|
||||
base: 'language/json',
|
||||
entryPoint: 'src/language/json/jsonMode.ts',
|
||||
amdModuleId: 'vs/language/json/jsonMode',
|
||||
external: ['*/monaco.contribution']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'json',
|
||||
entryPoint: 'src/json/jsonWorker.ts',
|
||||
base: 'language/json',
|
||||
entryPoint: 'src/language/json/jsonWorker.ts',
|
||||
amdModuleId: 'vs/language/json/jsonWorker'
|
||||
});
|
||||
|
||||
@@ -123,33 +132,34 @@ buildAMD({
|
||||
//#region typescript
|
||||
|
||||
copyFile(
|
||||
`src/typescript/lib/typescriptServices-amd.js`,
|
||||
`out/amd/typescript/lib/typescriptServices.js`
|
||||
`src/language/typescript/lib/typescriptServices-amd.js`,
|
||||
`out/amd/language/typescript/lib/typescriptServices.js`
|
||||
);
|
||||
|
||||
buildESM({
|
||||
base: 'typescript',
|
||||
base: 'language/typescript',
|
||||
entryPoints: [
|
||||
'src/typescript/monaco.contribution.ts',
|
||||
'src/typescript/tsMode.ts',
|
||||
'src/typescript/ts.worker.ts'
|
||||
'src/language/typescript/monaco.contribution.ts',
|
||||
'src/language/typescript/tsMode.ts',
|
||||
'src/language/typescript/ts.worker.ts'
|
||||
],
|
||||
external: ['monaco-editor-core', '*/tsMode']
|
||||
external: ['monaco-editor-core', '*/tsMode', '*/monaco.contribution']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'typescript',
|
||||
entryPoint: 'src/typescript/monaco.contribution.ts',
|
||||
base: 'language/typescript',
|
||||
entryPoint: 'src/language/typescript/monaco.contribution.ts',
|
||||
amdModuleId: 'vs/language/typescript/monaco.contribution',
|
||||
amdDependencies: ['vs/editor/editor.api']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'typescript',
|
||||
entryPoint: 'src/typescript/tsMode.ts',
|
||||
amdModuleId: 'vs/language/typescript/tsMode'
|
||||
base: 'language/typescript',
|
||||
entryPoint: 'src/language/typescript/tsMode.ts',
|
||||
amdModuleId: 'vs/language/typescript/tsMode',
|
||||
external: ['*/monaco.contribution']
|
||||
});
|
||||
buildAMD({
|
||||
base: 'typescript',
|
||||
entryPoint: 'src/typescript/tsWorker.ts',
|
||||
base: 'language/typescript',
|
||||
entryPoint: 'src/language/typescript/tsWorker.ts',
|
||||
amdModuleId: 'vs/language/typescript/tsWorker'
|
||||
});
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
// Resolves with the global monaco API
|
||||
|
||||
export = (<any>self).monaco;
|
||||
@@ -3,18 +3,14 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
//@ts-check
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
const REPO_ROOT = path.join(__dirname, '../');
|
||||
|
||||
const existingDirCache = new Set();
|
||||
/**
|
||||
* @param {string} dirname
|
||||
*/
|
||||
function ensureDir(dirname) {
|
||||
|
||||
export function ensureDir(dirname: string) {
|
||||
/** @type {string[]} */
|
||||
const dirs = [];
|
||||
|
||||
@@ -32,15 +28,11 @@ function ensureDir(dirname) {
|
||||
}
|
||||
});
|
||||
}
|
||||
exports.ensureDir = ensureDir;
|
||||
|
||||
/**
|
||||
* Copy a file.
|
||||
*
|
||||
* @param {string} _source
|
||||
* @param {string} _destination
|
||||
*/
|
||||
function copyFile(_source, _destination) {
|
||||
export function copyFile(_source: string, _destination: string) {
|
||||
const source = path.join(REPO_ROOT, _source);
|
||||
const destination = path.join(REPO_ROOT, _destination);
|
||||
|
||||
@@ -49,15 +41,11 @@ function copyFile(_source, _destination) {
|
||||
|
||||
console.log(`Copied ${_source} to ${_destination}`);
|
||||
}
|
||||
exports.copyFile = copyFile;
|
||||
|
||||
/**
|
||||
* Remove a directory and all its contents.
|
||||
*
|
||||
* @param {string} _dirPath
|
||||
* @param {((filename:string)=>boolean)} [keep]
|
||||
*/
|
||||
function removeDir(_dirPath, keep) {
|
||||
export function removeDir(_dirPath: string, keep?: (filename: string) => boolean) {
|
||||
if (typeof keep === 'undefined') {
|
||||
keep = () => false;
|
||||
}
|
||||
@@ -68,18 +56,13 @@ function removeDir(_dirPath, keep) {
|
||||
rmDir(dirPath, _dirPath);
|
||||
console.log(`Deleted ${_dirPath}`);
|
||||
|
||||
/**
|
||||
* @param {string} dirPath
|
||||
* @param {string} relativeDirPath
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function rmDir(dirPath, relativeDirPath) {
|
||||
function rmDir(dirPath: string, relativeDirPath: string): boolean {
|
||||
let keepsFiles = false;
|
||||
const entries = fs.readdirSync(dirPath);
|
||||
for (const entry of entries) {
|
||||
const filePath = path.join(dirPath, entry);
|
||||
const relativeFilePath = path.join(relativeDirPath, entry);
|
||||
if (keep(relativeFilePath)) {
|
||||
if (keep!(relativeFilePath)) {
|
||||
keepsFiles = true;
|
||||
continue;
|
||||
}
|
||||
@@ -95,4 +78,3 @@ function removeDir(_dirPath, keep) {
|
||||
return keepsFiles;
|
||||
}
|
||||
}
|
||||
exports.removeDir = removeDir;
|
||||
@@ -3,12 +3,10 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
//@ts-check
|
||||
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const child_process = require('child_process');
|
||||
const { REPO_ROOT } = require('./utils');
|
||||
import path = require('path');
|
||||
import fs = require('fs');
|
||||
import child_process = require('child_process');
|
||||
import { REPO_ROOT } from './utils';
|
||||
|
||||
const generatedNote = `//
|
||||
// **NOTE**: Do not edit directly! This file is generated using \`npm run import-typescript\`
|
||||
@@ -16,7 +14,7 @@ const generatedNote = `//
|
||||
`;
|
||||
|
||||
const TYPESCRIPT_LIB_SOURCE = path.join(REPO_ROOT, 'node_modules/typescript/lib');
|
||||
const TYPESCRIPT_LIB_DESTINATION = path.join(REPO_ROOT, 'src/typescript/lib');
|
||||
const TYPESCRIPT_LIB_DESTINATION = path.join(REPO_ROOT, 'src/language/typescript/lib');
|
||||
|
||||
(function () {
|
||||
try {
|
||||
@@ -74,6 +72,11 @@ export const typescriptVersion = "${typeScriptDependencyVersion}";\n`
|
||||
'/* MONACOCHANGE */false/* END MONACOCHANGE */'
|
||||
);
|
||||
|
||||
tsServices = tsServices.replace(
|
||||
/module.exports = ts;/m,
|
||||
'/* MONACOCHANGE */ /*module.exports = ts;*/ /* END MONACOCHANGE */'
|
||||
);
|
||||
|
||||
// Flag any new require calls (outside comments) so they can be corrected preemptively.
|
||||
// To avoid missing cases (or using an even more complex regex), temporarily remove comments
|
||||
// about require() and then check for lines actually calling require().
|
||||
@@ -3,14 +3,12 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
//@ts-check
|
||||
|
||||
const glob = require('glob');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const cp = require('child_process');
|
||||
import glob = require('glob');
|
||||
import path = require('path');
|
||||
import fs = require('fs');
|
||||
import cp = require('child_process');
|
||||
const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
||||
const { REPO_ROOT } = require('../utils');
|
||||
import { REPO_ROOT } from '../utils';
|
||||
|
||||
const files = glob.sync('**/package.json', {
|
||||
cwd: REPO_ROOT,
|
||||
@@ -29,18 +27,16 @@ for (const file of files) {
|
||||
}
|
||||
|
||||
function npmInstall(location) {
|
||||
/** @type {'inherit'} */
|
||||
const stdio = 'inherit';
|
||||
const opts = {
|
||||
env: process.env,
|
||||
cwd: location,
|
||||
stdio
|
||||
};
|
||||
const args = ['install'];
|
||||
|
||||
console.log(`Installing dependencies in ${location}...`);
|
||||
console.log(`$ npm ${args.join(' ')}`);
|
||||
const result = cp.spawnSync(npm, args, opts);
|
||||
const result = cp.spawnSync(npm, args, {
|
||||
env: process.env,
|
||||
cwd: location,
|
||||
stdio
|
||||
});
|
||||
|
||||
if (result.error || result.status !== 0) {
|
||||
process.exit(1);
|
||||
@@ -3,12 +3,10 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
//@ts-check
|
||||
|
||||
const glob = require('glob');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const { REPO_ROOT } = require('../utils');
|
||||
import glob from 'glob';
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
import { REPO_ROOT } from '../utils';
|
||||
|
||||
const files = glob.sync('**/package-lock.json', {
|
||||
cwd: REPO_ROOT,
|
||||
@@ -3,8 +3,8 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
const cp = require('child_process');
|
||||
const path = require('path');
|
||||
import cp = require('child_process');
|
||||
import path = require('path');
|
||||
|
||||
function huskyInstall() {
|
||||
console.log(`Installing husky hooks...`);
|
||||
@@ -3,24 +3,12 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
//@ts-check
|
||||
|
||||
/**
|
||||
* @typedef { { src:string; built:string; releaseDev:string; releaseMin:string; } } ICorePaths
|
||||
* @typedef { { dev:string; min:string; esm: string; } } IPluginPaths
|
||||
* @typedef { { name:string; contrib:string; modulePrefix:string; rootPath:string; paths:IPluginPaths } } IPlugin
|
||||
* @typedef { { METADATA: {CORE:{paths:ICorePaths}; PLUGINS:IPlugin[];} } } IMetadata
|
||||
*/
|
||||
/** @typedef {import('../build/utils').IFile} IFile */
|
||||
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const { REPO_ROOT, readFiles, writeFiles } = require('../build/utils');
|
||||
const { removeDir } = require('../build/fs');
|
||||
const ts = require('typescript');
|
||||
/**@type { IMetadata } */
|
||||
const metadata = require('../metadata.js');
|
||||
const { generateMetadata } = require('./releaseMetadata');
|
||||
import path = require('path');
|
||||
import fs = require('fs');
|
||||
import { REPO_ROOT, readFiles, writeFiles, IFile } from '../build/utils';
|
||||
import { removeDir } from '../build/fs';
|
||||
import ts = require('typescript');
|
||||
import { generateMetadata } from './releaseMetadata';
|
||||
|
||||
removeDir(`release`);
|
||||
|
||||
@@ -76,33 +64,19 @@ generateMetadata();
|
||||
|
||||
/**
|
||||
* Release to `dev` or `min`.
|
||||
* @param {'dev'|'min'} type
|
||||
*/
|
||||
function AMD_releaseOne(type) {
|
||||
function AMD_releaseOne(type: 'dev' | 'min') {
|
||||
const coreFiles = readFiles(`node_modules/monaco-editor-core/${type}/**/*`, {
|
||||
base: `node_modules/monaco-editor-core/${type}`
|
||||
});
|
||||
AMD_addPluginContribs(type, coreFiles);
|
||||
writeFiles(coreFiles, `release/${type}`);
|
||||
|
||||
for (const plugin of metadata.METADATA.PLUGINS) {
|
||||
AMD_releasePlugin(plugin, type, `release/${type}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Release a plugin to `dev` or `min`.
|
||||
* @param {IPlugin} plugin
|
||||
* @param {'dev'|'min'} type
|
||||
* @param {string} destinationPath
|
||||
*/
|
||||
function AMD_releasePlugin(plugin, type, destinationPath) {
|
||||
const pluginPath = path.join(plugin.rootPath, plugin.paths[type]); // dev or min
|
||||
const contribPath =
|
||||
path.join(pluginPath, plugin.contrib.substring(plugin.modulePrefix.length)) + '.js';
|
||||
|
||||
const files = readFiles(`${pluginPath}/**/*`, { base: pluginPath, ignore: [contribPath] });
|
||||
writeFiles(files, path.join(destinationPath, plugin.modulePrefix));
|
||||
const pluginFiles = readFiles(`out/release/${type}/**/*`, {
|
||||
base: `out/release/${type}`,
|
||||
ignore: ['**/monaco.contribution.js']
|
||||
});
|
||||
writeFiles(pluginFiles, `release/${type}`);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -110,11 +84,8 @@ function AMD_releasePlugin(plugin, type, destinationPath) {
|
||||
* - rename the AMD module 'vs/editor/editor.main' to 'vs/editor/edcore.main'
|
||||
* - append monaco.contribution modules from plugins
|
||||
* - append new AMD module 'vs/editor/editor.main' that stiches things together
|
||||
*
|
||||
* @param {'dev'|'min'} type
|
||||
* @param {IFile[]} files
|
||||
*/
|
||||
function AMD_addPluginContribs(type, files) {
|
||||
function AMD_addPluginContribs(type: 'dev' | 'min', files: IFile[]) {
|
||||
for (const file of files) {
|
||||
if (!/editor\.main\.js$/.test(file.path)) {
|
||||
continue;
|
||||
@@ -125,25 +96,21 @@ function AMD_addPluginContribs(type, files) {
|
||||
// Rename the AMD module 'vs/editor/editor.main' to 'vs/editor/edcore.main'
|
||||
contents = contents.replace(/"vs\/editor\/editor\.main\"/, '"vs/editor/edcore.main"');
|
||||
|
||||
/** @type {string[]} */
|
||||
let extraContent = [];
|
||||
/** @type {string[]} */
|
||||
let allPluginsModuleIds = [];
|
||||
const pluginFiles = readFiles(`out/release/${type}/**/monaco.contribution.js`, {
|
||||
base: `out/release/${type}`
|
||||
});
|
||||
|
||||
metadata.METADATA.PLUGINS.forEach(function (plugin) {
|
||||
allPluginsModuleIds.push(plugin.contrib);
|
||||
const pluginPath = path.join(plugin.rootPath, plugin.paths[type]); // dev or min
|
||||
const contribPath =
|
||||
path.join(REPO_ROOT, pluginPath, plugin.contrib.substring(plugin.modulePrefix.length)) +
|
||||
'.js';
|
||||
let contribContents = fs.readFileSync(contribPath).toString();
|
||||
const extraContent = pluginFiles.map((file) => {
|
||||
return file.contents
|
||||
.toString()
|
||||
.replace(
|
||||
/define\((['"][a-z\/\-]+\/fillers\/monaco-editor-core['"]),\[\],/,
|
||||
"define($1,['vs/editor/editor.api'],"
|
||||
);
|
||||
});
|
||||
|
||||
contribContents = contribContents.replace(
|
||||
/define\((['"][a-z\/\-]+\/fillers\/monaco-editor-core['"]),\[\],/,
|
||||
"define($1,['vs/editor/editor.api'],"
|
||||
);
|
||||
|
||||
extraContent.push(contribContents);
|
||||
const allPluginsModuleIds = pluginFiles.map((file) => {
|
||||
return file.path.replace(/\.js$/, '');
|
||||
});
|
||||
|
||||
extraContent.push(
|
||||
@@ -176,22 +143,16 @@ function ESM_release() {
|
||||
ESM_addPluginContribs(coreFiles);
|
||||
writeFiles(coreFiles, `release/esm`);
|
||||
|
||||
for (const plugin of metadata.METADATA.PLUGINS) {
|
||||
ESM_releasePlugin(plugin, `release/esm`);
|
||||
}
|
||||
ESM_releasePlugins();
|
||||
}
|
||||
|
||||
/**
|
||||
* Release a plugin to `esm`.
|
||||
* Adds a dependency to 'vs/editor/editor.api' in contrib files in order for `monaco` to be defined.
|
||||
* Rewrites imports for 'monaco-editor-core/**'
|
||||
* @param {IPlugin} plugin
|
||||
* @param {string} destinationPath
|
||||
*/
|
||||
function ESM_releasePlugin(plugin, destinationPath) {
|
||||
const pluginPath = path.join(plugin.rootPath, plugin.paths['esm']);
|
||||
|
||||
const files = readFiles(`${pluginPath}/**/*`, { base: pluginPath });
|
||||
function ESM_releasePlugins() {
|
||||
const files = readFiles(`out/release/esm/**/*`, { base: 'out/release/esm/' });
|
||||
|
||||
for (const file of files) {
|
||||
if (!/(\.js$)|(\.ts$)/.test(file.path)) {
|
||||
@@ -217,10 +178,9 @@ function ESM_releasePlugin(plugin, destinationPath) {
|
||||
importText = 'monaco-editor-core/esm/vs/editor/editor.api';
|
||||
}
|
||||
|
||||
const myFileDestPath = path.join(plugin.modulePrefix, file.path);
|
||||
const importFilePath = importText.substring('monaco-editor-core/esm/'.length);
|
||||
let relativePath = path
|
||||
.relative(path.dirname(myFileDestPath), importFilePath)
|
||||
.relative(path.dirname(file.path), importFilePath)
|
||||
.replace(/\\/g, '/');
|
||||
if (!/(^\.\/)|(^\.\.\/)/.test(relativePath)) {
|
||||
relativePath = './' + relativePath;
|
||||
@@ -238,9 +198,8 @@ function ESM_releasePlugin(plugin, destinationPath) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const myFileDestPath = path.join(plugin.modulePrefix, file.path);
|
||||
const apiFilePath = 'vs/editor/editor.api';
|
||||
let relativePath = path.relative(path.dirname(myFileDestPath), apiFilePath).replace(/\\/g, '/');
|
||||
let relativePath = path.relative(path.dirname(file.path), apiFilePath).replace(/\\/g, '/');
|
||||
if (!/(^\.\/)|(^\.\.\/)/.test(relativePath)) {
|
||||
relativePath = './' + relativePath;
|
||||
}
|
||||
@@ -251,14 +210,13 @@ function ESM_releasePlugin(plugin, destinationPath) {
|
||||
}
|
||||
|
||||
ESM_addImportSuffix(files);
|
||||
writeFiles(files, path.join(destinationPath, plugin.modulePrefix));
|
||||
writeFiles(files, `release/esm`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds `.js` to all import statements.
|
||||
* @param {IFile[]} files
|
||||
*/
|
||||
function ESM_addImportSuffix(files) {
|
||||
function ESM_addImportSuffix(files: IFile[]) {
|
||||
for (const file of files) {
|
||||
if (!/\.js$/.test(file.path)) {
|
||||
continue;
|
||||
@@ -287,9 +245,8 @@ function ESM_addImportSuffix(files) {
|
||||
/**
|
||||
* - Rename esm/vs/editor/editor.main.js to esm/vs/editor/edcore.main.js
|
||||
* - Create esm/vs/editor/editor.main.js that that stiches things together
|
||||
* @param {IFile[]} files
|
||||
*/
|
||||
function ESM_addPluginContribs(files) {
|
||||
function ESM_addPluginContribs(files: IFile[]) {
|
||||
for (const file of files) {
|
||||
if (!/editor\.main\.js$/.test(file.path)) {
|
||||
continue;
|
||||
@@ -299,20 +256,20 @@ function ESM_addPluginContribs(files) {
|
||||
|
||||
const mainFileDestPath = 'vs/editor/editor.main.js';
|
||||
|
||||
/** @type {string[]} */
|
||||
let mainFileImports = [];
|
||||
for (const plugin of metadata.METADATA.PLUGINS) {
|
||||
const contribDestPath = plugin.contrib;
|
||||
|
||||
const mainFileImports = readFiles(`out/release/esm/**/monaco.contribution.js`, {
|
||||
base: `out/release/esm`
|
||||
}).map((file) => {
|
||||
let relativePath = path
|
||||
.relative(path.dirname(mainFileDestPath), contribDestPath)
|
||||
.replace(/\\/g, '/');
|
||||
.relative(path.dirname(mainFileDestPath), file.path)
|
||||
.replace(/\\/g, '/')
|
||||
.replace(/\.js$/, '');
|
||||
|
||||
if (!/(^\.\/)|(^\.\.\/)/.test(relativePath)) {
|
||||
relativePath = './' + relativePath;
|
||||
}
|
||||
|
||||
mainFileImports.push(relativePath);
|
||||
}
|
||||
return relativePath;
|
||||
});
|
||||
|
||||
const mainFileContents =
|
||||
mainFileImports.map((name) => `import '${name}';`).join('\n') +
|
||||
@@ -335,17 +292,10 @@ function releaseDTS() {
|
||||
|
||||
let contents = monacodts.contents.toString();
|
||||
|
||||
/** @type {string[]} */
|
||||
const extraContent = [];
|
||||
metadata.METADATA.PLUGINS.forEach(function (plugin) {
|
||||
const dtsPath = path.join(plugin.rootPath, './monaco.d.ts');
|
||||
try {
|
||||
let plugindts = fs.readFileSync(dtsPath).toString();
|
||||
plugindts = plugindts.replace(/\/\/\/ <reference.*\n/m, '');
|
||||
extraContent.push(plugindts);
|
||||
} catch (err) {
|
||||
return;
|
||||
}
|
||||
const extraContent = readFiles('out/release/*.d.ts', {
|
||||
base: 'out/release/'
|
||||
}).map((file) => {
|
||||
return file.contents.toString().replace(/\/\/\/ <reference.*\n/m, '');
|
||||
});
|
||||
|
||||
contents =
|
||||
@@ -380,10 +330,8 @@ function releaseDTS() {
|
||||
/**
|
||||
* Transforms a .d.ts which uses internal modules (namespaces) to one which is usable with external modules
|
||||
* This function is duplicated in the `vscode` repo.
|
||||
* @param {string} contents
|
||||
* @returns string
|
||||
*/
|
||||
function toExternalDTS(contents) {
|
||||
function toExternalDTS(contents: string): string {
|
||||
let lines = contents.split(/\r\n|\r|\n/);
|
||||
let killNextCloseCurlyBrace = false;
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
@@ -427,10 +375,8 @@ function toExternalDTS(contents) {
|
||||
|
||||
/**
|
||||
* Normalize line endings and ensure consistent 4 spaces indentation
|
||||
* @param {string} contents
|
||||
* @returns {string}
|
||||
*/
|
||||
function cleanFile(contents) {
|
||||
function cleanFile(contents: string): string {
|
||||
return contents
|
||||
.split(/\r\n|\r|\n/)
|
||||
.map(function (line) {
|
||||
@@ -3,13 +3,11 @@
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
//@ts-check
|
||||
|
||||
const glob = require('glob');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const { REPO_ROOT } = require('./utils');
|
||||
const { ensureDir } = require('./fs');
|
||||
import glob = require('glob');
|
||||
import path = require('path');
|
||||
import fs = require('fs');
|
||||
import { REPO_ROOT } from './utils';
|
||||
import { ensureDir } from './fs';
|
||||
|
||||
const customFeatureLabels = {
|
||||
'vs/editor/browser/controller/coreCommands': 'coreCommands',
|
||||
@@ -25,10 +23,7 @@ const customFeatureLabels = {
|
||||
'vs/editor/standalone/browser/quickAccess/standaloneHelpQuickAccess': 'quickHelp'
|
||||
};
|
||||
|
||||
/**
|
||||
* @returns { Promise<{ label: string; entry: string; }[]> }
|
||||
*/
|
||||
function getBasicLanguages() {
|
||||
function getBasicLanguages(): Promise<{ label: string; entry: string }[]> {
|
||||
return new Promise((resolve, reject) => {
|
||||
glob(
|
||||
'./release/esm/vs/basic-languages/*/*.contribution.js',
|
||||
@@ -54,10 +49,7 @@ function getBasicLanguages() {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns { Promise<string[]> }
|
||||
*/
|
||||
function readAdvancedLanguages() {
|
||||
function readAdvancedLanguages(): Promise<string[]> {
|
||||
return new Promise((resolve, reject) => {
|
||||
glob(
|
||||
'./release/esm/vs/language/*/monaco.contribution.js',
|
||||
@@ -78,10 +70,9 @@ function readAdvancedLanguages() {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns { Promise<{ label: string; entry: string; worker: { id: string; entry: string; }; }[]> }
|
||||
*/
|
||||
function getAdvancedLanguages() {
|
||||
function getAdvancedLanguages(): Promise<
|
||||
{ label: string; entry: string; worker: { id: string; entry: string } }[]
|
||||
> {
|
||||
return readAdvancedLanguages().then((languages) => {
|
||||
let result = [];
|
||||
for (const lang of languages) {
|
||||
@@ -112,11 +103,11 @@ function getAdvancedLanguages() {
|
||||
}
|
||||
}
|
||||
|
||||
function generateMetadata() {
|
||||
export function generateMetadata() {
|
||||
return Promise.all([getBasicLanguages(), getAdvancedLanguages()]).then(
|
||||
([basicLanguages, advancedLanguages]) => {
|
||||
basicLanguages.sort(strcmp);
|
||||
advancedLanguages.sort(strcmp);
|
||||
basicLanguages.sort((a, b) => strcmp(a.entry, b.entry));
|
||||
advancedLanguages.sort((a, b) => strcmp(a.entry, b.entry));
|
||||
|
||||
let i = 0,
|
||||
len = basicLanguages.length;
|
||||
@@ -197,13 +188,8 @@ exports.languages = ${JSON.stringify(languages, null, ' ')};
|
||||
}
|
||||
);
|
||||
}
|
||||
exports.generateMetadata = generateMetadata;
|
||||
|
||||
/**
|
||||
* @tyoe {string} a
|
||||
* @tyoe {string} b
|
||||
*/
|
||||
function strcmp(a, b) {
|
||||
function strcmp(a: string, b: string) {
|
||||
if (a < b) {
|
||||
return -1;
|
||||
}
|
||||
@@ -213,10 +199,7 @@ function strcmp(a, b) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {{label:string;entry:string|string[];}[]}
|
||||
*/
|
||||
function getFeatures() {
|
||||
function getFeatures(): { label: string; entry: string | string[] }[] {
|
||||
const skipImports = [
|
||||
'vs/editor/browser/widget/codeEditorWidget',
|
||||
'vs/editor/browser/widget/diffEditorWidget',
|
||||
@@ -228,8 +211,7 @@ function getFeatures() {
|
||||
'vs/editor/contrib/gotoSymbol/documentSymbols'
|
||||
];
|
||||
|
||||
/** @type {string[]} */
|
||||
let features = [];
|
||||
let features: string[] = [];
|
||||
const files =
|
||||
fs.readFileSync(path.join(REPO_ROOT, 'release/esm/vs/editor/edcore.main.js')).toString() +
|
||||
fs.readFileSync(path.join(REPO_ROOT, 'release/esm/vs/editor/editor.all.js')).toString();
|
||||
@@ -243,8 +225,7 @@ function getFeatures() {
|
||||
}
|
||||
});
|
||||
|
||||
/** @type {{label:string;entry:any;}[]} */
|
||||
let result = features.map((feature) => {
|
||||
let result: { label: string; entry: any }[] = features.map((feature) => {
|
||||
/** @type {string} */ let label;
|
||||
if (customFeatureLabels[feature]) {
|
||||
label = customFeatureLabels[feature];
|
||||
@@ -3,14 +3,12 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
//@ts-check
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const http = require('http');
|
||||
const yaserver = require('yaserver');
|
||||
const { REPO_ROOT } = require('./utils');
|
||||
const { ensureDir } = require('./fs');
|
||||
import fs = require('fs');
|
||||
import path = require('path');
|
||||
import http = require('http');
|
||||
import yaserver = require('yaserver');
|
||||
import { REPO_ROOT } from './utils';
|
||||
import { ensureDir } from './fs';
|
||||
|
||||
const WEBSITE_GENERATED_PATH = path.join(REPO_ROOT, 'website/playground/new-samples');
|
||||
|
||||
@@ -100,7 +98,6 @@ function generateTestSamplesTask() {
|
||||
'</div>',
|
||||
'<div style="clear:both"></div>',
|
||||
'',
|
||||
'<script src="../../metadata.js"></script>',
|
||||
'<script src="dev-setup.js"></script>',
|
||||
'<script>',
|
||||
'loadEditor(function() {',
|
||||
@@ -148,7 +145,6 @@ function generateTestSamplesTask() {
|
||||
);
|
||||
})
|
||||
.join('<br/>\n'),
|
||||
'<script src="../../metadata.js"></script>',
|
||||
'<script src="dev-setup.js"></script>',
|
||||
'</body>',
|
||||
'</html>'
|
||||
@@ -159,11 +155,7 @@ function generateTestSamplesTask() {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} rootDir
|
||||
* @param {number} port
|
||||
*/
|
||||
function createSimpleServer(rootDir, port) {
|
||||
function createSimpleServer(rootDir: string, port: number) {
|
||||
yaserver
|
||||
.createServer({
|
||||
rootDir: rootDir
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"files": ["./**/*"]
|
||||
}
|
||||
@@ -3,26 +3,20 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
//@ts-check
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import * as cp from 'child_process';
|
||||
import * as esbuild from 'esbuild';
|
||||
import alias from 'esbuild-plugin-alias';
|
||||
import * as glob from 'glob';
|
||||
import { ensureDir } from './fs';
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const cp = require('child_process');
|
||||
const esbuild = require('esbuild');
|
||||
/** @type {any} */
|
||||
const alias = require('esbuild-plugin-alias');
|
||||
const glob = require('glob');
|
||||
const { ensureDir } = require('./fs');
|
||||
|
||||
const REPO_ROOT = path.join(__dirname, '../');
|
||||
exports.REPO_ROOT = REPO_ROOT;
|
||||
export const REPO_ROOT = path.join(__dirname, '../');
|
||||
|
||||
/**
|
||||
* Launch the typescript compiler synchronously over a project.
|
||||
*
|
||||
* @param {string} _projectPath
|
||||
*/
|
||||
function tsc(_projectPath) {
|
||||
export function tsc(_projectPath: string) {
|
||||
const projectPath = path.join(REPO_ROOT, _projectPath);
|
||||
console.log(`Launching compiler at ${_projectPath}...`);
|
||||
const res = cp.spawnSync(
|
||||
@@ -35,14 +29,11 @@ function tsc(_projectPath) {
|
||||
process.exit(res.status);
|
||||
}
|
||||
}
|
||||
exports.tsc = tsc;
|
||||
|
||||
/**
|
||||
* Launch prettier on a specific file.
|
||||
*
|
||||
* @param {string} _filePath
|
||||
*/
|
||||
function prettier(_filePath) {
|
||||
export function prettier(_filePath: string) {
|
||||
const filePath = path.join(REPO_ROOT, _filePath);
|
||||
cp.spawnSync(
|
||||
process.execPath,
|
||||
@@ -52,16 +43,11 @@ function prettier(_filePath) {
|
||||
|
||||
console.log(`Ran prettier over ${_filePath}`);
|
||||
}
|
||||
exports.prettier = prettier;
|
||||
|
||||
/**
|
||||
* Transform an external .d.ts file to an internal .d.ts file
|
||||
*
|
||||
* @param {string} _source
|
||||
* @param {string} _destination
|
||||
* @param {string} namespace
|
||||
*/
|
||||
function dts(_source, _destination, namespace) {
|
||||
export function dts(_source: string, _destination: string, namespace: string) {
|
||||
const source = path.join(REPO_ROOT, _source);
|
||||
const destination = path.join(REPO_ROOT, _destination);
|
||||
|
||||
@@ -100,12 +86,8 @@ function dts(_source, _destination, namespace) {
|
||||
|
||||
prettier(_destination);
|
||||
}
|
||||
exports.dts = dts;
|
||||
|
||||
/**
|
||||
* @param {import('esbuild').BuildOptions} options
|
||||
*/
|
||||
function build(options) {
|
||||
export function build(options: import('esbuild').BuildOptions) {
|
||||
esbuild.build(options).then((result) => {
|
||||
if (result.errors.length > 0) {
|
||||
console.error(result.errors);
|
||||
@@ -115,16 +97,8 @@ function build(options) {
|
||||
}
|
||||
});
|
||||
}
|
||||
exports.build = build;
|
||||
|
||||
/**
|
||||
* @param {{
|
||||
* base: string;
|
||||
* entryPoints: string[];
|
||||
* external: string[];
|
||||
* }} options
|
||||
*/
|
||||
function buildESM(options) {
|
||||
export function buildESM(options: { base: string; entryPoints: string[]; external: string[] }) {
|
||||
build({
|
||||
entryPoints: options.entryPoints,
|
||||
bundle: true,
|
||||
@@ -138,7 +112,7 @@ function buildESM(options) {
|
||||
},
|
||||
external: options.external,
|
||||
outbase: `src/${options.base}`,
|
||||
outdir: `out/release/${options.base}/esm/`,
|
||||
outdir: `out/release/esm/vs/${options.base}/`,
|
||||
plugins: [
|
||||
alias({
|
||||
'vscode-nls': path.join(__dirname, 'fillers/vscode-nls.ts')
|
||||
@@ -146,20 +120,23 @@ function buildESM(options) {
|
||||
]
|
||||
});
|
||||
}
|
||||
exports.buildESM = buildESM;
|
||||
|
||||
/**
|
||||
* @param {'dev'|'min'} type
|
||||
* @param {{
|
||||
* base: string;
|
||||
* entryPoint: string;
|
||||
* amdModuleId: string;
|
||||
* amdDependencies?: string[];
|
||||
* }} options
|
||||
*/
|
||||
function buildOneAMD(type, options) {
|
||||
/** @type {import('esbuild').BuildOptions} */
|
||||
const opts = {
|
||||
function buildOneAMD(
|
||||
type: 'dev' | 'min',
|
||||
options: {
|
||||
base: string;
|
||||
entryPoint: string;
|
||||
amdModuleId: string;
|
||||
amdDependencies?: string[];
|
||||
external?: string[];
|
||||
}
|
||||
) {
|
||||
if (!options.amdDependencies) {
|
||||
options.amdDependencies = [];
|
||||
}
|
||||
options.amdDependencies.unshift('require');
|
||||
|
||||
const opts: esbuild.BuildOptions = {
|
||||
entryPoints: [options.entryPoint],
|
||||
bundle: true,
|
||||
target: 'esnext',
|
||||
@@ -169,21 +146,22 @@ function buildOneAMD(type, options) {
|
||||
},
|
||||
globalName: 'moduleExports',
|
||||
banner: {
|
||||
js: `${bundledFileHeader}define("${options.amdModuleId}",[${(options.amdDependencies || [])
|
||||
js: `${bundledFileHeader}define("${options.amdModuleId}", [${(options.amdDependencies || [])
|
||||
.map((dep) => `"${dep}"`)
|
||||
.join(',')}],()=>{`
|
||||
.join(',')}],(require)=>{`
|
||||
},
|
||||
footer: {
|
||||
js: 'return moduleExports;\n});'
|
||||
},
|
||||
outbase: `src/${options.base}`,
|
||||
outdir: `out/release/${options.base}/${type}/`,
|
||||
outdir: `out/release/${type}/vs/${options.base}/`,
|
||||
plugins: [
|
||||
alias({
|
||||
'vscode-nls': path.join(__dirname, '../build/fillers/vscode-nls.ts'),
|
||||
'monaco-editor-core': path.join(__dirname, '../build/fillers/monaco-editor-core-amd.ts')
|
||||
'monaco-editor-core': path.join(__dirname, '../src/fillers/monaco-editor-core-amd.ts')
|
||||
})
|
||||
]
|
||||
],
|
||||
external: ['vs/editor/editor.api', ...(options.external || [])]
|
||||
};
|
||||
if (type === 'min') {
|
||||
opts.minify = true;
|
||||
@@ -191,19 +169,16 @@ function buildOneAMD(type, options) {
|
||||
build(opts);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {{
|
||||
* base: string;
|
||||
* entryPoint: string;
|
||||
* amdModuleId: string;
|
||||
* amdDependencies?: string[];
|
||||
* }} options
|
||||
*/
|
||||
function buildAMD(options) {
|
||||
export function buildAMD(options: {
|
||||
base: string;
|
||||
entryPoint: string;
|
||||
amdModuleId: string;
|
||||
amdDependencies?: string[];
|
||||
external?: string[];
|
||||
}) {
|
||||
buildOneAMD('dev', options);
|
||||
buildOneAMD('min', options);
|
||||
}
|
||||
exports.buildAMD = buildAMD;
|
||||
|
||||
function getGitVersion() {
|
||||
const git = path.join(REPO_ROOT, '.git');
|
||||
@@ -255,7 +230,7 @@ function getGitVersion() {
|
||||
return refs[ref];
|
||||
}
|
||||
|
||||
const bundledFileHeader = (() => {
|
||||
export const bundledFileHeader = (() => {
|
||||
const sha1 = getGitVersion();
|
||||
const semver = require('../package.json').version;
|
||||
const headerVersion = semver + '(' + sha1 + ')';
|
||||
@@ -272,16 +247,16 @@ const bundledFileHeader = (() => {
|
||||
|
||||
return BUNDLED_FILE_HEADER;
|
||||
})();
|
||||
exports.bundledFileHeader = bundledFileHeader;
|
||||
|
||||
/** @typedef {{ path:string; contents:Buffer;}} IFile */
|
||||
export interface IFile {
|
||||
path: string;
|
||||
contents: Buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} pattern
|
||||
* @param {{ base:string; ignore?:string[]; dot?:boolean; }} options
|
||||
* @returns {IFile[]}
|
||||
*/
|
||||
function readFiles(pattern, options) {
|
||||
export function readFiles(
|
||||
pattern: string,
|
||||
options: { base: string; ignore?: string[]; dot?: boolean }
|
||||
): IFile[] {
|
||||
let files = glob.sync(pattern, { cwd: REPO_ROOT, ignore: options.ignore, dot: options.dot });
|
||||
// remove dirs
|
||||
files = files.filter((file) => {
|
||||
@@ -302,17 +277,11 @@ function readFiles(pattern, options) {
|
||||
};
|
||||
});
|
||||
}
|
||||
exports.readFiles = readFiles;
|
||||
|
||||
/**
|
||||
* @param {IFile[]} files
|
||||
* @param {string} dest
|
||||
*/
|
||||
function writeFiles(files, dest) {
|
||||
export function writeFiles(files: IFile[], dest: string) {
|
||||
for (const file of files) {
|
||||
const fullPath = path.join(REPO_ROOT, dest, file.path);
|
||||
ensureDir(path.dirname(fullPath));
|
||||
fs.writeFileSync(fullPath, file.contents);
|
||||
}
|
||||
}
|
||||
exports.writeFiles = writeFiles;
|
||||
@@ -3,20 +3,15 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
//@ts-check
|
||||
import glob = require('glob');
|
||||
import path = require('path');
|
||||
import fs = require('fs');
|
||||
import cp = require('child_process');
|
||||
import CleanCSS from 'clean-css';
|
||||
import { REPO_ROOT, readFiles, writeFiles } from './utils';
|
||||
import { removeDir } from './fs';
|
||||
|
||||
/** @typedef {import('../build/utils').IFile} IFile */
|
||||
|
||||
const glob = require('glob');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const cp = require('child_process');
|
||||
const CleanCSS = require('clean-css');
|
||||
const { REPO_ROOT, readFiles, writeFiles } = require('./utils');
|
||||
const { removeDir } = require('./fs');
|
||||
|
||||
/** @type {string} */
|
||||
const MONACO_EDITOR_VERSION = (() => {
|
||||
const MONACO_EDITOR_VERSION: string = (() => {
|
||||
const output = cp.execSync(`npm show monaco-editor version`).toString();
|
||||
const version = output.split(/\r\n|\r|\n/g)[0];
|
||||
if (!/\d+\.\d+\.\d+/.test(version)) {
|
||||
@@ -72,14 +67,12 @@ function checkSamples() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} dataPath
|
||||
* @param {string} contents
|
||||
* @param {RegExp} regex
|
||||
* @param {(match:string, fileContents:Buffer)=>string} callback
|
||||
* @returns {string}
|
||||
*/
|
||||
function replaceWithRelativeResource(dataPath, contents, regex, callback) {
|
||||
function replaceWithRelativeResource(
|
||||
dataPath: string,
|
||||
contents: string,
|
||||
regex: RegExp,
|
||||
callback: (match: string, fileContents: Buffer) => string
|
||||
): string {
|
||||
return contents.replace(regex, function (_, m0) {
|
||||
const filePath = path.join(REPO_ROOT, 'website', path.dirname(dataPath), m0);
|
||||
return callback(m0, fs.readFileSync(filePath));
|
||||
@@ -140,7 +133,7 @@ function generateWebsite() {
|
||||
contents,
|
||||
/<link data-inline="yes-please" href="([^"]+)".*/g,
|
||||
function (m0, fileContents) {
|
||||
const minifiedCSS = new CleanCSS().minify(fileContents.toString('utf8')).styles;
|
||||
const minifiedCSS = (new CleanCSS() as any).minify(fileContents.toString('utf8')).styles;
|
||||
return `<style>${minifiedCSS}</style>`;
|
||||
}
|
||||
);
|
||||
+24
-18
@@ -192,27 +192,33 @@ Adding monaco editor to [Vite](https://vitejs.dev/) is simple since it has built
|
||||
|
||||
```js
|
||||
import * as monaco from 'monaco-editor';
|
||||
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
|
||||
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
|
||||
import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
|
||||
import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
|
||||
import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
|
||||
|
||||
self.MonacoEnvironment = {
|
||||
getWorker(_, label) {
|
||||
if (label === 'json') {
|
||||
return new jsonWorker();
|
||||
getWorker: function (workerId, label) {
|
||||
const getWorkerModule = (moduleUrl, label) => {
|
||||
return new Worker(self.MonacoEnvironment.getWorkerUrl(moduleUrl), {
|
||||
name: label,
|
||||
type: 'module'
|
||||
});
|
||||
};
|
||||
|
||||
switch (label) {
|
||||
case 'json':
|
||||
return getWorkerModule('/monaco-editor/esm/vs/language/json/json.worker?worker', label);
|
||||
case 'css':
|
||||
case 'scss':
|
||||
case 'less':
|
||||
return getWorkerModule('/monaco-editor/esm/vs/language/css/css.worker?worker', label);
|
||||
case 'html':
|
||||
case 'handlebars':
|
||||
case 'razor':
|
||||
return getWorkerModule('/monaco-editor/esm/vs/language/html/html.worker?worker', label);
|
||||
case 'typescript':
|
||||
case 'javascript':
|
||||
return getWorkerModule('/monaco-editor/esm/vs/language/typescript/ts.worker?worker', label);
|
||||
default:
|
||||
return getWorkerModule('/monaco-editor/esm/vs/editor/editor.worker?worker', label);
|
||||
}
|
||||
if (label === 'css' || label === 'scss' || label === 'less') {
|
||||
return new cssWorker();
|
||||
}
|
||||
if (label === 'html' || label === 'handlebars' || label === 'razor') {
|
||||
return new htmlWorker();
|
||||
}
|
||||
if (label === 'typescript' || label === 'javascript') {
|
||||
return new tsWorker();
|
||||
}
|
||||
return new editorWorker();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
-87
@@ -1,87 +0,0 @@
|
||||
(function () {
|
||||
var METADATA = {
|
||||
CORE: {
|
||||
paths: {
|
||||
src: '/vscode/out/vs',
|
||||
'npm/dev': 'node_modules/monaco-editor-core/dev/vs',
|
||||
'npm/min': 'node_modules/monaco-editor-core/min/vs',
|
||||
built: '/vscode/out-monaco-editor-core/min/vs',
|
||||
releaseDev: 'release/dev/vs',
|
||||
releaseMin: 'release/min/vs'
|
||||
}
|
||||
},
|
||||
PLUGINS: [
|
||||
{
|
||||
name: 'monaco-typescript',
|
||||
contrib: 'vs/language/typescript/monaco.contribution',
|
||||
modulePrefix: 'vs/language/typescript',
|
||||
rootPath: './out/release/typescript',
|
||||
paths: {
|
||||
// use ./ to indicate it is relative to the `rootPath`
|
||||
src: './../../amd/typescript',
|
||||
dev: './dev',
|
||||
min: './min',
|
||||
esm: './esm'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'monaco-css',
|
||||
contrib: 'vs/language/css/monaco.contribution',
|
||||
modulePrefix: 'vs/language/css',
|
||||
rootPath: './out/release/css',
|
||||
paths: {
|
||||
// use ./ to indicate it is relative to the `rootPath`
|
||||
src: './../../amd/css',
|
||||
dev: './dev',
|
||||
min: './min',
|
||||
esm: './esm'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'monaco-json',
|
||||
contrib: 'vs/language/json/monaco.contribution',
|
||||
modulePrefix: 'vs/language/json',
|
||||
rootPath: './out/release/json',
|
||||
paths: {
|
||||
// use ./ to indicate it is relative to the `rootPath`
|
||||
src: './../../amd/json',
|
||||
dev: './dev',
|
||||
min: './min',
|
||||
esm: './esm'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'monaco-html',
|
||||
contrib: 'vs/language/html/monaco.contribution',
|
||||
modulePrefix: 'vs/language/html',
|
||||
rootPath: './out/release/html',
|
||||
paths: {
|
||||
// use ./ to indicate it is relative to the `rootPath`
|
||||
src: './../../amd/html',
|
||||
dev: './dev',
|
||||
min: './min',
|
||||
esm: './esm'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'monaco-languages',
|
||||
contrib: 'vs/basic-languages/monaco.contribution',
|
||||
modulePrefix: 'vs/basic-languages',
|
||||
rootPath: './out/release/basic-languages',
|
||||
paths: {
|
||||
// use ./ to indicate it is relative to the `rootPath`
|
||||
src: './../../amd/basic-languages',
|
||||
dev: './dev',
|
||||
min: './min',
|
||||
esm: './esm'
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
if (typeof exports !== 'undefined') {
|
||||
exports.METADATA = METADATA;
|
||||
} else {
|
||||
self.METADATA = METADATA;
|
||||
}
|
||||
})();
|
||||
Generated
+3073
-273
File diff suppressed because it is too large
Load Diff
+27
-23
@@ -1,25 +1,28 @@
|
||||
{
|
||||
"name": "monaco-editor",
|
||||
"version": "0.31.1",
|
||||
"vscode": "5a1b4999493d49c857497ad481d73a737439f305",
|
||||
"version": "0.33.0",
|
||||
"vscode": "c722ca6c7eed3d7987c0d5c3df5c45f6b15e77d1",
|
||||
"private": true,
|
||||
"description": "A browser based code editor",
|
||||
"author": "Microsoft Corporation",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"build-website": "node ./build/website.js && npm run typedoc",
|
||||
"import-typescript": "node ./build/importTypescript.js",
|
||||
"build-website": "ts-node ./build/website && npm run typedoc",
|
||||
"import-typescript": "ts-node ./build/importTypescript",
|
||||
"package-for-smoketest-esbuild": "ts-node ./test/smoke/package-esbuild",
|
||||
"playwright-install": "node ./node_modules/playwright/install.js",
|
||||
"playwright-install-deps": "playwright install-deps",
|
||||
"postinstall": "node ./build/postinstall.js",
|
||||
"postinstall": "ts-node ./build/postinstall",
|
||||
"prettier-check": "prettier --check .",
|
||||
"prettier": "prettier --write .",
|
||||
"pretty-quick": "pretty-quick --staged",
|
||||
"release": "node ./build/build.js && node ./build/release.js",
|
||||
"simpleserver": "node ./build/simpleserver",
|
||||
"release": "ts-node ./build/build && ts-node ./build/release",
|
||||
"simpleserver": "ts-node ./build/simpleserver",
|
||||
"smoketest-debug": "node ./test/smoke/runner.js --debug-tests",
|
||||
"smoketest": "node ./test/smoke/runner.js",
|
||||
"test": "mocha test/unit/all.js",
|
||||
"deps-all-remove": "ts-node ./build/npm/removeAll",
|
||||
"deps-all-install": "ts-node ./build/npm/installAll",
|
||||
"typedoc": "cd website/typedoc && \"../../node_modules/.bin/typedoc\" --options ./typedoc.json",
|
||||
"watch": "tsc -w -p ./src"
|
||||
},
|
||||
@@ -30,31 +33,32 @@
|
||||
"url": "https://github.com/microsoft/monaco-editor"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/mocha": "^9.0.0",
|
||||
"@types/mocha": "^9.1.0",
|
||||
"@typescript/vfs": "^1.3.5",
|
||||
"chai": "^4.3.4",
|
||||
"clean-css": "^5.2.2",
|
||||
"esbuild": "^0.13.13",
|
||||
"chai": "^4.3.6",
|
||||
"clean-css": "^5.2.4",
|
||||
"esbuild": "^0.14.18",
|
||||
"esbuild-plugin-alias": "^0.2.1",
|
||||
"glob": "^7.2.0",
|
||||
"husky": "^7.0.4",
|
||||
"jsdom": "^19.0.0",
|
||||
"jsonc-parser": "^3.0.0",
|
||||
"mocha": "^9.1.3",
|
||||
"monaco-editor-core": "0.32.0-dev.20220126",
|
||||
"playwright": "^1.16.3",
|
||||
"prettier": "^2.4.1",
|
||||
"pretty-quick": "^3.1.1",
|
||||
"mocha": "^9.2.0",
|
||||
"monaco-editor-core": "0.33.0-dev.20220214",
|
||||
"playwright": "^1.18.1",
|
||||
"prettier": "^2.5.1",
|
||||
"pretty-quick": "^3.1.3",
|
||||
"requirejs": "^2.3.6",
|
||||
"terser": "^5.10.0",
|
||||
"typedoc": "^0.22.9",
|
||||
"typescript": "4.4.4",
|
||||
"vscode-css-languageservice": "^5.1.8",
|
||||
"vscode-html-languageservice": "^4.1.1",
|
||||
"vscode-json-languageservice": "4.1.10",
|
||||
"vscode-languageserver-textdocument": "^1.0.2",
|
||||
"ts-node": "^10.6.0",
|
||||
"typedoc": "^0.22.11",
|
||||
"typescript": "4.5.5",
|
||||
"vscode-css-languageservice": "5.4.1",
|
||||
"vscode-html-languageservice": "4.2.4",
|
||||
"vscode-json-languageservice": "4.2.1",
|
||||
"vscode-languageserver-textdocument": "^1.0.4",
|
||||
"vscode-languageserver-types": "3.16.0",
|
||||
"vscode-uri": "3.0.2",
|
||||
"vscode-uri": "3.0.3",
|
||||
"yaserver": "^0.4.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,74 +1,74 @@
|
||||
|
||||
/// <reference path="../../references.js" />
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
var deltaDecorations = function (oldDecorations, newDecorations) {
|
||||
/// <summary>
|
||||
/// Update oldDecorations to match newDecorations.
|
||||
/// It will remove old decorations which are not found in new decorations
|
||||
/// and add only the really new decorations.
|
||||
/// </summary>
|
||||
/// <param name="oldDecorations" type="Array">
|
||||
/// An array containing ids of existing decorations
|
||||
/// </param>
|
||||
/// <param name="newDecorations" type="Array">
|
||||
/// An array containing literal objects describing new decorations. A
|
||||
/// literal contains the following two fields:
|
||||
/// range
|
||||
/// options
|
||||
/// </param>
|
||||
/// <returns type="Array">
|
||||
/// Returns an array of decorations ids
|
||||
/// </returns>
|
||||
var hashFunc = function (range, options) {
|
||||
return range.startLineNumber + "," + range.startColumn + "-" + range.endLineNumber + "," + range.endColumn +
|
||||
"-" + options.hoverMessage + "-" + options.className + "-" + options.isOverlay + "-" + options.showInOverviewRuler;
|
||||
};
|
||||
return this.changeDecorations(function (changeAccessor) {
|
||||
var i, len, oldDecorationsMap = {}, hash;
|
||||
|
||||
// Record old decorations in a map
|
||||
// Two decorations can have the same hash
|
||||
for (i = 0, len = oldDecorations.length; i < len; i++) {
|
||||
hash = hashFunc(this.getDecorationRange(oldDecorations[i]), this.getDecorationOptions(oldDecorations[i]));
|
||||
oldDecorationsMap[hash] = oldDecorationsMap[hash] || [];
|
||||
oldDecorationsMap[hash].push(oldDecorations[i]);
|
||||
}
|
||||
|
||||
// Add only new decorations & mark reused ones
|
||||
var j, lenJ, result = [], usedOldDecorations = {}, oldDecorationsCandidates, reusedOldDecoration;
|
||||
for (i = 0, len = newDecorations.length; i < len; i++) {
|
||||
hash = hashFunc(newDecorations[i].range, newDecorations[i].options);
|
||||
reusedOldDecoration = false;
|
||||
if (oldDecorationsMap.hasOwnProperty(hash)) {
|
||||
oldDecorationsCandidates = oldDecorationsMap[hash];
|
||||
// We can try reusing an old decoration (if it hasn't been reused before)
|
||||
for (j = 0, lenJ = oldDecorationsCandidates.length; j < lenJ; j++) {
|
||||
if (!usedOldDecorations.hasOwnProperty(oldDecorationsCandidates[j])) {
|
||||
// Found an old decoration which can be reused & it hasn't been reused before
|
||||
reusedOldDecoration = true;
|
||||
usedOldDecorations[oldDecorationsCandidates[j]] = true;
|
||||
result.push(oldDecorationsCandidates[j]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!reusedOldDecoration) {
|
||||
result.push(changeAccessor.addDecoration(newDecorations[i].range, newDecorations[i].options));
|
||||
}
|
||||
}
|
||||
|
||||
// Remove unused old decorations
|
||||
for (i = 0, len = oldDecorations.length; i < len; i++) {
|
||||
if (!usedOldDecorations.hasOwnProperty(oldDecorations[i])) {
|
||||
changeAccessor.removeDecoration(oldDecorations[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
/// <reference path="../../references.js" />
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
var deltaDecorations = function (oldDecorations, newDecorations) {
|
||||
/// <summary>
|
||||
/// Update oldDecorations to match newDecorations.
|
||||
/// It will remove old decorations which are not found in new decorations
|
||||
/// and add only the really new decorations.
|
||||
/// </summary>
|
||||
/// <param name="oldDecorations" type="Array">
|
||||
/// An array containing ids of existing decorations
|
||||
/// </param>
|
||||
/// <param name="newDecorations" type="Array">
|
||||
/// An array containing literal objects describing new decorations. A
|
||||
/// literal contains the following two fields:
|
||||
/// range
|
||||
/// options
|
||||
/// </param>
|
||||
/// <returns type="Array">
|
||||
/// Returns an array of decorations ids
|
||||
/// </returns>
|
||||
var hashFunc = function (range, options) {
|
||||
return range.startLineNumber + "," + range.startColumn + "-" + range.endLineNumber + "," + range.endColumn +
|
||||
"-" + options.hoverMessage + "-" + options.className + "-" + options.isOverlay + "-" + options.showInOverviewRuler;
|
||||
};
|
||||
return this.changeDecorations(function (changeAccessor) {
|
||||
var i, len, oldDecorationsMap = {}, hash;
|
||||
|
||||
// Record old decorations in a map
|
||||
// Two decorations can have the same hash
|
||||
for (i = 0, len = oldDecorations.length; i < len; i++) {
|
||||
hash = hashFunc(this.getDecorationRange(oldDecorations[i]), this.getDecorationOptions(oldDecorations[i]));
|
||||
oldDecorationsMap[hash] = oldDecorationsMap[hash] || [];
|
||||
oldDecorationsMap[hash].push(oldDecorations[i]);
|
||||
}
|
||||
|
||||
// Add only new decorations & mark reused ones
|
||||
var j, lenJ, result = [], usedOldDecorations = {}, oldDecorationsCandidates, reusedOldDecoration;
|
||||
for (i = 0, len = newDecorations.length; i < len; i++) {
|
||||
hash = hashFunc(newDecorations[i].range, newDecorations[i].options);
|
||||
reusedOldDecoration = false;
|
||||
if (oldDecorationsMap.hasOwnProperty(hash)) {
|
||||
oldDecorationsCandidates = oldDecorationsMap[hash];
|
||||
// We can try reusing an old decoration (if it hasn't been reused before)
|
||||
for (j = 0, lenJ = oldDecorationsCandidates.length; j < lenJ; j++) {
|
||||
if (!usedOldDecorations.hasOwnProperty(oldDecorationsCandidates[j])) {
|
||||
// Found an old decoration which can be reused & it hasn't been reused before
|
||||
reusedOldDecoration = true;
|
||||
usedOldDecorations[oldDecorationsCandidates[j]] = true;
|
||||
result.push(oldDecorationsCandidates[j]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!reusedOldDecoration) {
|
||||
result.push(changeAccessor.addDecoration(newDecorations[i].range, newDecorations[i].options));
|
||||
}
|
||||
}
|
||||
|
||||
// Remove unused old decorations
|
||||
for (i = 0, len = oldDecorations.length; i < len; i++) {
|
||||
if (!usedOldDecorations.hasOwnProperty(oldDecorations[i])) {
|
||||
changeAccessor.removeDecoration(oldDecorations[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
@@ -1,61 +1,61 @@
|
||||
/// <reference path="../../references.js" />
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
// Some useless comment
|
||||
|
||||
var deltaDecorations = function (oldDecorations, newDecorations) {
|
||||
/// <summary>
|
||||
/// Update oldDecorations to match newDecorations.
|
||||
/// It will remove old decorations which are not found in new decorations
|
||||
/// and add only the really new decorations.
|
||||
/// </summary>
|
||||
/// <param name="oldDecorations" type="Array">
|
||||
/// An array containing ids of existing decorations
|
||||
/// </param>
|
||||
/// <param name="newDecorations" type="Array">
|
||||
/// An array containing literal objects describing new decorations. A
|
||||
/// literal contains the following two fields:
|
||||
/// range
|
||||
/// options
|
||||
/// </param>
|
||||
/// <returns type="Array">
|
||||
/// Returns an array of decorations ids
|
||||
/// </returns>
|
||||
var hashFunc = function (range, options) {
|
||||
return range.startLineNumber + "," + range.startColumn + "-" + range.endLineNumber + "," + range.endColumn +
|
||||
"-" + options.hoverMessage + "-" + options.className + "-" + options.isOverlay + "-" + options.showInOverviewRuler;
|
||||
};
|
||||
return this.changeDecorations(function (changeAccessor) {
|
||||
var i, len, oldDecorationsMap = {}, hash;
|
||||
|
||||
// Record old decorations in a map
|
||||
for (i = 0, len = oldDecorations.length; i < len; i++) {
|
||||
hash = hashFunc(this.getDecorationRange(oldDecorations[i]), this.getDecorationOptions(oldDecorations[i]));
|
||||
oldDecorationsMap[hash] = i;
|
||||
}
|
||||
|
||||
// Add only new decorations & mark reused ones
|
||||
var result = [], usedOldDecorationsMap = {};
|
||||
for (i = 0, len = newDecorations.length; i < len; i++) {
|
||||
hash = hashFunc(newDecorations[i].range, newDecorations[i].options);
|
||||
if (oldDecorationsMap.hasOwnProperty(hash)) {
|
||||
usedOldDecorationsMap[oldDecorationsMap[hash]] = true;
|
||||
result.push(oldDecorations[oldDecorationsMap[hash]]);
|
||||
} else {
|
||||
result.push(changeAccessor.addDecoration(newDecorations[i].range, newDecorations[i].options));
|
||||
}
|
||||
}
|
||||
|
||||
// Remove unused old decorations
|
||||
for (i = 0, len = oldDecorations.length; i < len; i++) {
|
||||
if (!usedOldDecorationsMap.hasOwnProperty(i)) {
|
||||
changeAccessor.removeDecoration(oldDecorations[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
})();
|
||||
/// <reference path="../../references.js" />
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
// Some useless comment
|
||||
|
||||
var deltaDecorations = function (oldDecorations, newDecorations) {
|
||||
/// <summary>
|
||||
/// Update oldDecorations to match newDecorations.
|
||||
/// It will remove old decorations which are not found in new decorations
|
||||
/// and add only the really new decorations.
|
||||
/// </summary>
|
||||
/// <param name="oldDecorations" type="Array">
|
||||
/// An array containing ids of existing decorations
|
||||
/// </param>
|
||||
/// <param name="newDecorations" type="Array">
|
||||
/// An array containing literal objects describing new decorations. A
|
||||
/// literal contains the following two fields:
|
||||
/// range
|
||||
/// options
|
||||
/// </param>
|
||||
/// <returns type="Array">
|
||||
/// Returns an array of decorations ids
|
||||
/// </returns>
|
||||
var hashFunc = function (range, options) {
|
||||
return range.startLineNumber + "," + range.startColumn + "-" + range.endLineNumber + "," + range.endColumn +
|
||||
"-" + options.hoverMessage + "-" + options.className + "-" + options.isOverlay + "-" + options.showInOverviewRuler;
|
||||
};
|
||||
return this.changeDecorations(function (changeAccessor) {
|
||||
var i, len, oldDecorationsMap = {}, hash;
|
||||
|
||||
// Record old decorations in a map
|
||||
for (i = 0, len = oldDecorations.length; i < len; i++) {
|
||||
hash = hashFunc(this.getDecorationRange(oldDecorations[i]), this.getDecorationOptions(oldDecorations[i]));
|
||||
oldDecorationsMap[hash] = i;
|
||||
}
|
||||
|
||||
// Add only new decorations & mark reused ones
|
||||
var result = [], usedOldDecorationsMap = {};
|
||||
for (i = 0, len = newDecorations.length; i < len; i++) {
|
||||
hash = hashFunc(newDecorations[i].range, newDecorations[i].options);
|
||||
if (oldDecorationsMap.hasOwnProperty(hash)) {
|
||||
usedOldDecorationsMap[oldDecorationsMap[hash]] = true;
|
||||
result.push(oldDecorations[oldDecorationsMap[hash]]);
|
||||
} else {
|
||||
result.push(changeAccessor.addDecoration(newDecorations[i].range, newDecorations[i].options));
|
||||
}
|
||||
}
|
||||
|
||||
// Remove unused old decorations
|
||||
for (i = 0, len = oldDecorations.length; i < len; i++) {
|
||||
if (!usedOldDecorationsMap.hasOwnProperty(i)) {
|
||||
changeAccessor.removeDecoration(oldDecorations[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
|
||||
const esbuild = require('esbuild');
|
||||
const path = require('path');
|
||||
const { removeDir } = require('../../build/fs');
|
||||
const fs = require('fs');
|
||||
|
||||
removeDir('samples/browser-esm-esbuild/dist', (entry) => /index.html$/.test(entry));
|
||||
removeDir('dist', (entry) => /index.html$/.test(entry));
|
||||
|
||||
const workerEntryPoints = [
|
||||
'vs/language/json/json.worker.js',
|
||||
@@ -50,3 +50,47 @@ function build(opts) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a directory and all its contents.
|
||||
* @param {string} _dirPath
|
||||
* @param {(filename: string) => boolean} [keep]
|
||||
*/
|
||||
function removeDir(_dirPath, keep) {
|
||||
if (typeof keep === 'undefined') {
|
||||
keep = () => false;
|
||||
}
|
||||
const dirPath = path.join(__dirname, _dirPath);
|
||||
if (!fs.existsSync(dirPath)) {
|
||||
return;
|
||||
}
|
||||
rmDir(dirPath, _dirPath);
|
||||
console.log(`Deleted ${_dirPath}`);
|
||||
|
||||
/**
|
||||
* @param {string} dirPath
|
||||
* @param {string} relativeDirPath
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function rmDir(dirPath, relativeDirPath) {
|
||||
let keepsFiles = false;
|
||||
const entries = fs.readdirSync(dirPath);
|
||||
for (const entry of entries) {
|
||||
const filePath = path.join(dirPath, entry);
|
||||
const relativeFilePath = path.join(relativeDirPath, entry);
|
||||
if (keep(relativeFilePath)) {
|
||||
keepsFiles = true;
|
||||
continue;
|
||||
}
|
||||
if (fs.statSync(filePath).isFile()) {
|
||||
fs.unlinkSync(filePath);
|
||||
} else {
|
||||
keepsFiles = rmDir(filePath, relativeFilePath) || keepsFiles;
|
||||
}
|
||||
}
|
||||
if (!keepsFiles) {
|
||||
fs.rmdirSync(dirPath);
|
||||
}
|
||||
return keepsFiles;
|
||||
}
|
||||
}
|
||||
|
||||
+2880
-5024
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,7 @@
|
||||
"start": "parcel ./src/index.html"
|
||||
},
|
||||
"devDependencies": {
|
||||
"monaco-editor": "^0.31.0",
|
||||
"parcel": "^2.0.1"
|
||||
"monaco-editor": "^0.32.0",
|
||||
"parcel": "^2.2.1"
|
||||
}
|
||||
}
|
||||
|
||||
+1783
-343
File diff suppressed because it is too large
Load Diff
@@ -8,13 +8,13 @@
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"monaco-editor": "^0.31.0",
|
||||
"monaco-editor": "^0.32.0",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"@types/react": "^17.0.35",
|
||||
"@types/react": "^17.0.39",
|
||||
"@types/react-dom": "^17.0.11",
|
||||
"@vitejs/plugin-react": "^1.0.9",
|
||||
"typescript": "^4.4.4",
|
||||
"vite": "^2.6.14"
|
||||
"@vitejs/plugin-react": "^1.1.4",
|
||||
"typescript": "^4.5.5",
|
||||
"vite": "^2.7.13"
|
||||
}
|
||||
}
|
||||
|
||||
+4771
-640
File diff suppressed because it is too large
Load Diff
@@ -6,12 +6,12 @@
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.16.0",
|
||||
"@babel/preset-env": "^7.16.0",
|
||||
"@babel/preset-react": "^7.16.0",
|
||||
"@babel/preset-typescript": "^7.16.0",
|
||||
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.1",
|
||||
"@types/react": "^17.0.35",
|
||||
"@babel/core": "^7.17.0",
|
||||
"@babel/preset-env": "^7.16.11",
|
||||
"@babel/preset-react": "^7.16.7",
|
||||
"@babel/preset-typescript": "^7.16.7",
|
||||
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.4",
|
||||
"@types/react": "^17.0.39",
|
||||
"@types/react-dom": "^17.0.11",
|
||||
"babel-loader": "^8.2.3",
|
||||
"react": "^17.0.2",
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
dist/*.js
|
||||
dist/*.ttf
|
||||
dist/*.js
|
||||
dist/*.ttf
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
/dist/*.js
|
||||
/dist/*.ttf
|
||||
/dist/*.js
|
||||
/dist/*.ttf
|
||||
|
||||
Generated
+5805
-410
File diff suppressed because it is too large
Load Diff
@@ -10,20 +10,20 @@
|
||||
"author": "Microsoft Corporation",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"css-loader": "^6.5.1",
|
||||
"electron": "^15.3.1",
|
||||
"css-loader": "^6.6.0",
|
||||
"electron": "^17.0.0",
|
||||
"file-loader": "^6.2.0",
|
||||
"glob": "^7.2.0",
|
||||
"html-webpack-plugin": "^5.5.0",
|
||||
"monaco-editor-webpack-plugin": "^7.0.1",
|
||||
"monaco-editor": "^0.31.1",
|
||||
"monaco-editor": "^0.32.1",
|
||||
"style-loader": "^3.3.1",
|
||||
"terser-webpack-plugin": "^5.2.5",
|
||||
"terser-webpack-plugin": "^5.3.1",
|
||||
"ts-loader": "^9.2.6",
|
||||
"typescript": "^4.4.4",
|
||||
"webpack-cli": "^4.9.1",
|
||||
"webpack-dev-server": "^4.5.0",
|
||||
"webpack": "^5.64.1",
|
||||
"typescript": "^4.5.5",
|
||||
"webpack-cli": "^4.9.2",
|
||||
"webpack-dev-server": "^4.7.4",
|
||||
"webpack": "^5.68.0",
|
||||
"yaserver": "^0.4.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ export const language = <languages.IMonarchLanguage>{
|
||||
|
||||
units: [
|
||||
[
|
||||
'(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?',
|
||||
'(em|ex|ch|rem|fr|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?',
|
||||
'attribute.value.unit',
|
||||
'@pop'
|
||||
]
|
||||
|
||||
@@ -10,7 +10,7 @@ declare var require: any;
|
||||
|
||||
registerLanguage({
|
||||
id: 'javascript',
|
||||
extensions: ['.js', '.es6', '.jsx', '.mjs'],
|
||||
extensions: ['.js', '.es6', '.jsx', '.mjs', '.cjs'],
|
||||
firstLine: '^#!.*\\bnode',
|
||||
filenames: ['jakefile'],
|
||||
aliases: ['JavaScript', 'javascript', 'js'],
|
||||
|
||||
@@ -164,7 +164,7 @@ export const language = <languages.IMonarchLanguage>{
|
||||
|
||||
units: [
|
||||
[
|
||||
'(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?',
|
||||
'(em|ex|ch|rem|fr|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?',
|
||||
'attribute.value.unit',
|
||||
'@pop'
|
||||
]
|
||||
|
||||
@@ -187,7 +187,7 @@ export const language = <languages.IMonarchLanguage>{
|
||||
|
||||
units: [
|
||||
[
|
||||
'(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?',
|
||||
'(em|ex|ch|rem|fr|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?',
|
||||
'number',
|
||||
'@pop'
|
||||
]
|
||||
|
||||
@@ -68,6 +68,7 @@ export const language = <languages.IMonarchLanguage>{
|
||||
'@inlinable',
|
||||
'@inline',
|
||||
'@main',
|
||||
'@noDerivative',
|
||||
'@nonobjc',
|
||||
'@noreturn',
|
||||
'@objc',
|
||||
|
||||
@@ -127,6 +127,7 @@ export const language = {
|
||||
'null',
|
||||
'number',
|
||||
'object',
|
||||
'out',
|
||||
'package',
|
||||
'private',
|
||||
'protected',
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { languages } from '../../fillers/monaco-editor-core';
|
||||
import { languages } from '../../fillers/monaco-editor-core';
|
||||
|
||||
export const conf: languages.LanguageConfiguration = {
|
||||
comments: {
|
||||
@@ -25,7 +25,15 @@ export const conf: languages.LanguageConfiguration = {
|
||||
],
|
||||
folding: {
|
||||
offSide: true
|
||||
}
|
||||
},
|
||||
onEnterRules: [
|
||||
{
|
||||
beforeText: /:\s*$/,
|
||||
action: {
|
||||
indentAction: languages.IndentAction.Indent
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
export const language = <languages.IMonarchLanguage>{
|
||||
|
||||
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
declare module 'vs/editor/editor.api' {
|
||||
const x: any;
|
||||
export = x;
|
||||
}
|
||||
@@ -5,8 +5,7 @@
|
||||
|
||||
// Resolves with the global monaco API
|
||||
|
||||
declare var define: any;
|
||||
/// <reference path="./editor.api.d.ts" />
|
||||
import * as api from 'vs/editor/editor.api';
|
||||
|
||||
define([], function () {
|
||||
return (<any>self).monaco;
|
||||
});
|
||||
export = api;
|
||||
|
||||
@@ -16,7 +16,7 @@ import {
|
||||
IDisposable,
|
||||
MarkerSeverity,
|
||||
IEvent
|
||||
} from '../fillers/monaco-editor-core';
|
||||
} from '../../fillers/monaco-editor-core';
|
||||
|
||||
export interface WorkerAccessor<T> {
|
||||
(...more: Uri[]): Promise<T>;
|
||||
@@ -7,7 +7,7 @@ import { WorkerManager } from './workerManager';
|
||||
import type { CSSWorker } from './cssWorker';
|
||||
import { LanguageServiceDefaults } from './monaco.contribution';
|
||||
import * as languageFeatures from '../common/lspLanguageFeatures';
|
||||
import { Uri, IDisposable, languages } from '../fillers/monaco-editor-core';
|
||||
import { Uri, IDisposable, languages } from '../../fillers/monaco-editor-core';
|
||||
|
||||
export function setupMode(defaults: LanguageServiceDefaults): IDisposable {
|
||||
const disposables: IDisposable[] = [];
|
||||
@@ -106,6 +106,22 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable {
|
||||
)
|
||||
);
|
||||
}
|
||||
if (modeConfiguration.documentFormattingEdits) {
|
||||
providers.push(
|
||||
languages.registerDocumentFormattingEditProvider(
|
||||
languageId,
|
||||
new languageFeatures.DocumentFormattingEditProvider(worker)
|
||||
)
|
||||
);
|
||||
}
|
||||
if (modeConfiguration.documentRangeFormattingEdits) {
|
||||
providers.push(
|
||||
languages.registerDocumentRangeFormattingEditProvider(
|
||||
languageId,
|
||||
new languageFeatures.DocumentRangeFormattingEditProvider(worker)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
registerProviders();
|
||||
@@ -3,7 +3,7 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import type { worker } from '../fillers/monaco-editor-core';
|
||||
import type { worker } from '../../fillers/monaco-editor-core';
|
||||
import * as cssService from 'vscode-css-languageservice';
|
||||
import { Options } from './monaco.contribution';
|
||||
|
||||
@@ -12,7 +12,7 @@ export class CSSWorker {
|
||||
|
||||
private _ctx: worker.IWorkerContext;
|
||||
private _languageService: cssService.LanguageService;
|
||||
private _languageSettings: cssService.LanguageSettings;
|
||||
private _languageSettings: Options;
|
||||
private _languageId: string;
|
||||
|
||||
constructor(ctx: worker.IWorkerContext, createData: ICreateData) {
|
||||
@@ -53,10 +53,10 @@ export class CSSWorker {
|
||||
// --- language service host ---------------
|
||||
|
||||
async doValidation(uri: string): Promise<cssService.Diagnostic[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (document) {
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let diagnostics = this._languageService.doValidation(document, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const diagnostics = this._languageService.doValidation(document, stylesheet);
|
||||
return Promise.resolve(diagnostics);
|
||||
}
|
||||
return Promise.resolve([]);
|
||||
@@ -65,63 +65,63 @@ export class CSSWorker {
|
||||
uri: string,
|
||||
position: cssService.Position
|
||||
): Promise<cssService.CompletionList | null> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return null;
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let completions = this._languageService.doComplete(document, position, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const completions = this._languageService.doComplete(document, position, stylesheet);
|
||||
return Promise.resolve(completions);
|
||||
}
|
||||
async doHover(uri: string, position: cssService.Position): Promise<cssService.Hover | null> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return null;
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let hover = this._languageService.doHover(document, position, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const hover = this._languageService.doHover(document, position, stylesheet);
|
||||
return Promise.resolve(hover);
|
||||
}
|
||||
async findDefinition(
|
||||
uri: string,
|
||||
position: cssService.Position
|
||||
): Promise<cssService.Location | null> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return null;
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let definition = this._languageService.findDefinition(document, position, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const definition = this._languageService.findDefinition(document, position, stylesheet);
|
||||
return Promise.resolve(definition);
|
||||
}
|
||||
async findReferences(uri: string, position: cssService.Position): Promise<cssService.Location[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let references = this._languageService.findReferences(document, position, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const references = this._languageService.findReferences(document, position, stylesheet);
|
||||
return Promise.resolve(references);
|
||||
}
|
||||
async findDocumentHighlights(
|
||||
uri: string,
|
||||
position: cssService.Position
|
||||
): Promise<cssService.DocumentHighlight[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let highlights = this._languageService.findDocumentHighlights(document, position, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const highlights = this._languageService.findDocumentHighlights(document, position, stylesheet);
|
||||
return Promise.resolve(highlights);
|
||||
}
|
||||
async findDocumentSymbols(uri: string): Promise<cssService.SymbolInformation[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let symbols = this._languageService.findDocumentSymbols(document, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const symbols = this._languageService.findDocumentSymbols(document, stylesheet);
|
||||
return Promise.resolve(symbols);
|
||||
}
|
||||
async doCodeActions(
|
||||
@@ -129,21 +129,21 @@ export class CSSWorker {
|
||||
range: cssService.Range,
|
||||
context: cssService.CodeActionContext
|
||||
): Promise<cssService.Command[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let actions = this._languageService.doCodeActions(document, range, context, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const actions = this._languageService.doCodeActions(document, range, context, stylesheet);
|
||||
return Promise.resolve(actions);
|
||||
}
|
||||
async findDocumentColors(uri: string): Promise<cssService.ColorInformation[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let colorSymbols = this._languageService.findDocumentColors(document, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const colorSymbols = this._languageService.findDocumentColors(document, stylesheet);
|
||||
return Promise.resolve(colorSymbols);
|
||||
}
|
||||
async getColorPresentations(
|
||||
@@ -151,12 +151,12 @@ export class CSSWorker {
|
||||
color: cssService.Color,
|
||||
range: cssService.Range
|
||||
): Promise<cssService.ColorPresentation[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let colorPresentations = this._languageService.getColorPresentations(
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const colorPresentations = this._languageService.getColorPresentations(
|
||||
document,
|
||||
stylesheet,
|
||||
color,
|
||||
@@ -168,23 +168,23 @@ export class CSSWorker {
|
||||
uri: string,
|
||||
context?: { rangeLimit?: number }
|
||||
): Promise<cssService.FoldingRange[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
let ranges = this._languageService.getFoldingRanges(document, context);
|
||||
const ranges = this._languageService.getFoldingRanges(document, context);
|
||||
return Promise.resolve(ranges);
|
||||
}
|
||||
async getSelectionRanges(
|
||||
uri: string,
|
||||
positions: cssService.Position[]
|
||||
): Promise<cssService.SelectionRange[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let ranges = this._languageService.getSelectionRanges(document, positions, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const ranges = this._languageService.getSelectionRanges(document, positions, stylesheet);
|
||||
return Promise.resolve(ranges);
|
||||
}
|
||||
async doRename(
|
||||
@@ -192,17 +192,30 @@ export class CSSWorker {
|
||||
position: cssService.Position,
|
||||
newName: string
|
||||
): Promise<cssService.WorkspaceEdit | null> {
|
||||
let document = this._getTextDocument(uri);
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return null;
|
||||
}
|
||||
let stylesheet = this._languageService.parseStylesheet(document);
|
||||
let renames = this._languageService.doRename(document, position, newName, stylesheet);
|
||||
const stylesheet = this._languageService.parseStylesheet(document);
|
||||
const renames = this._languageService.doRename(document, position, newName, stylesheet);
|
||||
return Promise.resolve(renames);
|
||||
}
|
||||
async format(
|
||||
uri: string,
|
||||
range: cssService.Range | null,
|
||||
options: cssService.CSSFormatConfiguration
|
||||
): Promise<cssService.TextEdit[]> {
|
||||
const document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
const settings = { ...this._languageSettings.format, ...options };
|
||||
const textEdits = this._languageService.format(document, range! /* TODO */, settings);
|
||||
return Promise.resolve(textEdits);
|
||||
}
|
||||
private _getTextDocument(uri: string): cssService.TextDocument | null {
|
||||
let models = this._ctx.getMirrorModels();
|
||||
for (let model of models) {
|
||||
const models = this._ctx.getMirrorModels();
|
||||
for (const model of models) {
|
||||
if (model.uri.toString() === uri) {
|
||||
return cssService.TextDocument.create(
|
||||
uri,
|
||||
@@ -4,7 +4,22 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as mode from './cssMode';
|
||||
import { languages, Emitter, IEvent } from '../fillers/monaco-editor-core';
|
||||
import { languages, Emitter, IEvent } from '../../fillers/monaco-editor-core';
|
||||
|
||||
export interface CSSFormatConfiguration {
|
||||
/** separate selectors with newline (e.g. "a,\nbr" or "a, br"): Default: true */
|
||||
newlineBetweenSelectors?: boolean;
|
||||
/** add a new line after every css rule: Default: true */
|
||||
newlineBetweenRules?: boolean;
|
||||
/** ensure space around selector separators: '>', '+', '~' (e.g. "a>b" -> "a > b"): Default: false */
|
||||
spaceAroundSelectorSeparator?: boolean;
|
||||
/** put braces on the same line as rules (`collapse`), or put braces on own line, Allman / ANSI style (`expand`). Default `collapse` */
|
||||
braceStyle?: 'collapse' | 'expand';
|
||||
/** whether existing line breaks before elements should be preserved. Default: true */
|
||||
preserveNewLines?: boolean;
|
||||
/** maximum number of line breaks to be preserved in one chunk. Default: unlimited */
|
||||
maxPreserveNewLines?: number;
|
||||
}
|
||||
|
||||
export interface Options {
|
||||
readonly validate?: boolean;
|
||||
@@ -32,6 +47,11 @@ export interface Options {
|
||||
* Configures the CSS data types known by the langauge service.
|
||||
*/
|
||||
readonly data?: CSSDataConfiguration;
|
||||
|
||||
/**
|
||||
* Settings for the CSS formatter.
|
||||
*/
|
||||
readonly format?: CSSFormatConfiguration;
|
||||
}
|
||||
|
||||
export interface ModeConfiguration {
|
||||
@@ -89,6 +109,16 @@ export interface ModeConfiguration {
|
||||
* Defines whether the built-in selection range provider is enabled.
|
||||
*/
|
||||
readonly selectionRanges?: boolean;
|
||||
|
||||
/**
|
||||
* Defines whether the built-in document formatting edit provider is enabled.
|
||||
*/
|
||||
readonly documentFormattingEdits?: boolean;
|
||||
|
||||
/**
|
||||
* Defines whether the built-in document formatting range edit provider is enabled.
|
||||
*/
|
||||
readonly documentRangeFormattingEdits?: boolean;
|
||||
}
|
||||
|
||||
export interface LanguageServiceDefaults {
|
||||
@@ -180,7 +210,15 @@ const optionsDefault: Required<Options> = {
|
||||
float: 'ignore',
|
||||
idSelector: 'ignore'
|
||||
},
|
||||
data: { useDefaultDataProvider: true }
|
||||
data: { useDefaultDataProvider: true },
|
||||
format: {
|
||||
newlineBetweenSelectors: true,
|
||||
newlineBetweenRules: true,
|
||||
spaceAroundSelectorSeparator: false,
|
||||
braceStyle: 'collapse',
|
||||
maxPreserveNewLines: undefined,
|
||||
preserveNewLines: true
|
||||
}
|
||||
};
|
||||
|
||||
const modeConfigurationDefault: Required<ModeConfiguration> = {
|
||||
@@ -194,7 +232,9 @@ const modeConfigurationDefault: Required<ModeConfiguration> = {
|
||||
colors: true,
|
||||
foldingRanges: true,
|
||||
diagnostics: true,
|
||||
selectionRanges: true
|
||||
selectionRanges: true,
|
||||
documentFormattingEdits: true,
|
||||
documentRangeFormattingEdits: true
|
||||
};
|
||||
|
||||
export const cssDefaults: LanguageServiceDefaults = new LanguageServiceDefaultsImpl(
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import { LanguageServiceDefaults } from './monaco.contribution';
|
||||
import type { CSSWorker } from './cssWorker';
|
||||
import { editor, IDisposable, Uri } from '../fillers/monaco-editor-core';
|
||||
import { editor, IDisposable, Uri } from '../../fillers/monaco-editor-core';
|
||||
|
||||
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000; // 2min
|
||||
|
||||
@@ -7,7 +7,7 @@ import { WorkerManager } from './workerManager';
|
||||
import type { HTMLWorker } from './htmlWorker';
|
||||
import { LanguageServiceDefaults } from './monaco.contribution';
|
||||
import * as languageFeatures from '../common/lspLanguageFeatures';
|
||||
import { Uri, IDisposable, languages } from '../fillers/monaco-editor-core';
|
||||
import { Uri, IDisposable, languages } from '../../fillers/monaco-editor-core';
|
||||
|
||||
class HTMLCompletionAdapter extends languageFeatures.CompletionAdapter<HTMLWorker> {
|
||||
constructor(worker: languageFeatures.WorkerAccessor<HTMLWorker>) {
|
||||
@@ -3,7 +3,7 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { worker } from '../fillers/monaco-editor-core';
|
||||
import { worker } from '../../fillers/monaco-editor-core';
|
||||
import * as htmlService from 'vscode-html-languageservice';
|
||||
import type { Options } from './monaco.contribution';
|
||||
import { IHTMLDataProvider } from 'vscode-html-languageservice';
|
||||
@@ -4,7 +4,7 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as mode from './htmlMode';
|
||||
import { languages, Emitter, IEvent, IDisposable } from '../fillers/monaco-editor-core';
|
||||
import { languages, Emitter, IEvent, IDisposable } from '../../fillers/monaco-editor-core';
|
||||
|
||||
export interface HTMLFormatConfiguration {
|
||||
readonly tabSize: number;
|
||||
@@ -27,11 +27,11 @@ export interface CompletionConfiguration {
|
||||
|
||||
export interface Options {
|
||||
/**
|
||||
* If set, comments are tolerated. If set to false, syntax errors will be emitted for comments.
|
||||
* Settings for the HTML formatter.
|
||||
*/
|
||||
readonly format?: HTMLFormatConfiguration;
|
||||
/**
|
||||
* A list of known schemas and/or associations of schemas to file names.
|
||||
* Code completion settings.
|
||||
*/
|
||||
readonly suggest?: CompletionConfiguration;
|
||||
/**
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import { LanguageServiceDefaults } from './monaco.contribution';
|
||||
import type { HTMLWorker } from './htmlWorker';
|
||||
import { Uri, IDisposable, editor } from '../fillers/monaco-editor-core';
|
||||
import { Uri, IDisposable, editor } from '../../fillers/monaco-editor-core';
|
||||
|
||||
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000; // 2min
|
||||
|
||||
@@ -8,7 +8,7 @@ import type { JSONWorker } from './jsonWorker';
|
||||
import { LanguageServiceDefaults } from './monaco.contribution';
|
||||
import * as languageFeatures from '../common/lspLanguageFeatures';
|
||||
import { createTokenizationSupport } from './tokenization';
|
||||
import { Uri, IDisposable, languages, editor } from '../fillers/monaco-editor-core';
|
||||
import { Uri, IDisposable, languages, editor } from '../../fillers/monaco-editor-core';
|
||||
|
||||
class JSONDiagnosticsAdapter extends languageFeatures.DiagnosticsAdapter<JSONWorker> {
|
||||
constructor(
|
||||
@@ -4,7 +4,7 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as jsonService from 'vscode-json-languageservice';
|
||||
import type { worker } from '../fillers/monaco-editor-core';
|
||||
import type { worker } from '../../fillers/monaco-editor-core';
|
||||
import { URI } from 'vscode-uri';
|
||||
import { DiagnosticsOptions } from './monaco.contribution';
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as mode from './jsonMode';
|
||||
import { Emitter, IEvent, languages } from '../fillers/monaco-editor-core';
|
||||
import { Emitter, IEvent, languages } from '../../fillers/monaco-editor-core';
|
||||
|
||||
// --- JSON configuration and defaults ---------
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as json from 'jsonc-parser';
|
||||
import { languages } from '../fillers/monaco-editor-core';
|
||||
import { languages } from '../../fillers/monaco-editor-core';
|
||||
|
||||
export function createTokenizationSupport(supportComments: boolean): languages.TokensProvider {
|
||||
return {
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import { LanguageServiceDefaults } from './monaco.contribution';
|
||||
import type { JSONWorker } from './jsonWorker';
|
||||
import { IDisposable, Uri, editor } from '../fillers/monaco-editor-core';
|
||||
import { IDisposable, Uri, editor } from '../../fillers/monaco-editor-core';
|
||||
|
||||
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000; // 2min
|
||||
|
||||
@@ -23,7 +23,7 @@ import {
|
||||
IRange,
|
||||
MarkerTag,
|
||||
MarkerSeverity
|
||||
} from '../fillers/monaco-editor-core';
|
||||
} from '../../fillers/monaco-editor-core';
|
||||
|
||||
//#region utils copied from typescript to prevent loading the entire typescriptServices ---
|
||||
|
||||
@@ -1259,7 +1259,7 @@ export class InlayHintsAdapter extends Adapter implements languages.InlayHintsPr
|
||||
case 'Type':
|
||||
return languages.InlayHintKind.Type;
|
||||
default:
|
||||
return languages.InlayHintKind.Other;
|
||||
return languages.InlayHintKind.Type;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,6 +55,7 @@ libFileSet['lib.es2020.string.d.ts'] = true;
|
||||
libFileSet['lib.es2020.symbol.wellknown.d.ts'] = true;
|
||||
libFileSet['lib.es2021.d.ts'] = true;
|
||||
libFileSet['lib.es2021.full.d.ts'] = true;
|
||||
libFileSet['lib.es2021.intl.d.ts'] = true;
|
||||
libFileSet['lib.es2021.promise.d.ts'] = true;
|
||||
libFileSet['lib.es2021.string.d.ts'] = true;
|
||||
libFileSet['lib.es2021.weakref.d.ts'] = true;
|
||||
File diff suppressed because one or more lines are too long
+13000
-9701
File diff suppressed because it is too large
Load Diff
Vendored
+401
-285
File diff suppressed because it is too large
Load Diff
+13000
-9701
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -2,4 +2,4 @@
|
||||
// **NOTE**: Do not edit directly! This file is generated using `npm run import-typescript`
|
||||
//
|
||||
|
||||
export const typescriptVersion = "4.4.4";
|
||||
export const typescriptVersion = "4.5.5";
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
|
||||
import type * as mode from './tsMode';
|
||||
import { typescriptVersion as tsversion } from './lib/typescriptServicesMetadata'; // do not import the whole typescriptServices here
|
||||
import { languages, Emitter, IEvent, IDisposable, Uri } from '../fillers/monaco-editor-core';
|
||||
import { languages, Emitter, IEvent, IDisposable, Uri } from '../../fillers/monaco-editor-core';
|
||||
|
||||
//#region enums copied from typescript to prevent loading the entire typescriptServices ---
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import * as edworker from 'monaco-editor-core/esm/vs/editor/editor.worker';
|
||||
import { ICreateData, create } from './tsWorker';
|
||||
import { worker } from '../fillers/monaco-editor-core';
|
||||
import { worker } from '../../fillers/monaco-editor-core';
|
||||
|
||||
self.onmessage = () => {
|
||||
// ignore the first message
|
||||
@@ -7,7 +7,7 @@ import { WorkerManager } from './workerManager';
|
||||
import type { TypeScriptWorker } from './tsWorker';
|
||||
import { LanguageServiceDefaults } from './monaco.contribution';
|
||||
import * as languageFeatures from './languageFeatures';
|
||||
import { languages, Uri } from '../fillers/monaco-editor-core';
|
||||
import { languages, Uri } from '../../fillers/monaco-editor-core';
|
||||
|
||||
let javaScriptWorker: (...uris: Uri[]) => Promise<TypeScriptWorker>;
|
||||
let typeScriptWorker: (...uris: Uri[]) => Promise<TypeScriptWorker>;
|
||||
@@ -11,7 +11,7 @@ import {
|
||||
IExtraLibs,
|
||||
TypeScriptWorker as ITypeScriptWorker
|
||||
} from './monaco.contribution';
|
||||
import { Uri, worker } from '../fillers/monaco-editor-core';
|
||||
import { Uri, worker } from '../../fillers/monaco-editor-core';
|
||||
|
||||
/**
|
||||
* Loading a default lib as a source file will mess up TS completely.
|
||||
@@ -181,6 +181,14 @@ export class TypeScriptWorker implements ts.LanguageServiceHost, ITypeScriptWork
|
||||
return fileName === this.getDefaultLibFileName(this._compilerOptions);
|
||||
}
|
||||
|
||||
readFile(path: string): string | undefined {
|
||||
return this._getScriptText(path);
|
||||
}
|
||||
|
||||
fileExists(path: string): boolean {
|
||||
return this._getScriptText(path) !== undefined;
|
||||
}
|
||||
|
||||
async getLibFiles(): Promise<Record<string, string>> {
|
||||
return libFileMap;
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import { LanguageServiceDefaults } from './monaco.contribution';
|
||||
import type { TypeScriptWorker } from './tsWorker';
|
||||
import { editor, Uri, IDisposable } from '../fillers/monaco-editor-core';
|
||||
import { editor, Uri, IDisposable } from '../../fillers/monaco-editor-core';
|
||||
|
||||
export class WorkerManager {
|
||||
private _modeId: string;
|
||||
File diff suppressed because one or more lines are too long
@@ -13,7 +13,6 @@
|
||||
></div>
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<script src="../../metadata.js"></script>
|
||||
<script src="dev-setup.js"></script>
|
||||
<script>
|
||||
loadEditor(function () {
|
||||
|
||||
+188
-226
@@ -1,44 +1,196 @@
|
||||
//@ts-check
|
||||
|
||||
(function () {
|
||||
let IS_FILE_PROTOCOL = window.location.protocol === 'file:';
|
||||
let DIRNAME = null;
|
||||
if (IS_FILE_PROTOCOL) {
|
||||
let port = window.location.port;
|
||||
if (port.length > 0) {
|
||||
port = ':' + port;
|
||||
}
|
||||
DIRNAME =
|
||||
window.location.protocol +
|
||||
'//' +
|
||||
window.location.hostname +
|
||||
port +
|
||||
window.location.pathname.substr(0, window.location.pathname.lastIndexOf('/'));
|
||||
const corePaths = {
|
||||
src: '/vscode/out/vs',
|
||||
'npm/dev': 'node_modules/monaco-editor-core/dev/vs',
|
||||
'npm/min': 'node_modules/monaco-editor-core/min/vs',
|
||||
built: '/vscode/out-monaco-editor-core/min/vs',
|
||||
releaseDev: 'release/dev/vs',
|
||||
releaseMin: 'release/min/vs'
|
||||
};
|
||||
const pluginPaths = {
|
||||
src: 'out/amd',
|
||||
dev: 'out/release/dev/vs',
|
||||
min: 'out/release/min/vs'
|
||||
};
|
||||
const parsedQuery = parseQueryString();
|
||||
const editorQueryName = 'editor';
|
||||
const pluginsQueryName = 'plugins';
|
||||
const defaultEditorQueryValue = 'npm/dev';
|
||||
const defaultPluginsQueryValue = 'src';
|
||||
const editorQueryValue = parsedQuery[editorQueryName] || defaultEditorQueryValue;
|
||||
const pluginsQueryValue = parsedQuery[pluginsQueryName] || defaultPluginsQueryValue;
|
||||
const corePath = resolvePath(corePaths[editorQueryValue]);
|
||||
const pluginPath = resolvePath(pluginPaths[pluginsQueryValue]);
|
||||
const isRelease = /release/.test(editorQueryValue);
|
||||
|
||||
let bases = document.getElementsByTagName('base');
|
||||
if (bases.length > 0) {
|
||||
DIRNAME = DIRNAME + '/' + bases[0].getAttribute('href');
|
||||
}
|
||||
}
|
||||
(function () {
|
||||
let div = document.createElement('div');
|
||||
div.className = 'dev-setup-control';
|
||||
div.style.position = 'fixed';
|
||||
div.style.top = '0';
|
||||
div.style.right = '0';
|
||||
div.style.background = 'lightgray';
|
||||
div.style.padding = '5px 20px 5px 5px';
|
||||
div.style.zIndex = '1000';
|
||||
|
||||
let LOADER_OPTS = (function () {
|
||||
function parseQueryString() {
|
||||
let str = window.location.search;
|
||||
str = str.replace(/^\?/, '');
|
||||
let pieces = str.split(/&/);
|
||||
let result = {};
|
||||
pieces.forEach(function (piece) {
|
||||
let config = piece.split(/=/);
|
||||
result[config[0]] = config[1];
|
||||
div.innerHTML =
|
||||
'<ul><li>' +
|
||||
renderLoadingOptions(true) +
|
||||
(isRelease ? '' : `</li><li>${renderLoadingOptions(false)}`) +
|
||||
'</li></ul>';
|
||||
|
||||
document.body.appendChild(div);
|
||||
|
||||
let aElements = document.getElementsByTagName('a');
|
||||
for (let i = 0; i < aElements.length; i++) {
|
||||
let aElement = aElements[i];
|
||||
if (aElement.className === 'loading-opts') {
|
||||
aElement.href += window.location.search;
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
/** @type {any} */
|
||||
const global = self;
|
||||
|
||||
global.getCodiconPath = () => {
|
||||
return `${corePath}/base/browser/ui/codicons/codicon/codicon.ttf`;
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {()=>void} callback
|
||||
* @param {string} [PATH_PREFIX]
|
||||
*/
|
||||
global.loadEditor = (callback, PATH_PREFIX) => {
|
||||
PATH_PREFIX = PATH_PREFIX || '';
|
||||
|
||||
loadScript(`${PATH_PREFIX}${corePath}/loader.js`, () => {
|
||||
global.AMD = true;
|
||||
|
||||
/** @type {{[name:string]: string;}} */
|
||||
const loaderPathsConfig = {};
|
||||
if (isRelease) {
|
||||
loaderPathsConfig['vs'] = `${PATH_PREFIX}${corePath}`;
|
||||
} else {
|
||||
loaderPathsConfig[
|
||||
'vs/fillers/monaco-editor-core'
|
||||
] = `${PATH_PREFIX}/monaco-editor/out/amd/fillers/monaco-editor-core-amd`;
|
||||
loaderPathsConfig['vs/language'] = `${PATH_PREFIX}${pluginPath}/language`;
|
||||
loaderPathsConfig['vs/basic-language'] = `${PATH_PREFIX}${pluginPath}/basic-language`;
|
||||
loaderPathsConfig['vs'] = `${PATH_PREFIX}${corePath}`;
|
||||
}
|
||||
|
||||
console.log('LOADER CONFIG: ');
|
||||
console.log(JSON.stringify(loaderPathsConfig, null, '\t'));
|
||||
|
||||
/** @type {any} */
|
||||
const req = require;
|
||||
|
||||
req.config({
|
||||
paths: loaderPathsConfig
|
||||
// 'vs/nls' : {
|
||||
// availableLanguages: {
|
||||
// '*': 'de'
|
||||
// }
|
||||
// }
|
||||
});
|
||||
return result;
|
||||
}
|
||||
let overwrites = parseQueryString();
|
||||
let result = {};
|
||||
result['editor'] = overwrites['editor'] || 'npm/dev';
|
||||
METADATA.PLUGINS.map(function (plugin) {
|
||||
result[plugin.name] = overwrites[plugin.name] || 'dev';
|
||||
|
||||
req(['vs/editor/editor.main'], () => {
|
||||
if (isRelease) {
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
// At this point we've loaded the monaco-editor-core
|
||||
req(
|
||||
[
|
||||
'vs/basic-languages/monaco.contribution',
|
||||
'vs/language/css/monaco.contribution',
|
||||
'vs/language/html/monaco.contribution',
|
||||
'vs/language/json/monaco.contribution',
|
||||
'vs/language/typescript/monaco.contribution'
|
||||
],
|
||||
callback
|
||||
);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
function parseQueryString() {
|
||||
const str = window.location.search.replace(/^\?/, '');
|
||||
const pieces = str.split(/&/);
|
||||
/** @type {{[name:string]: string;}} */
|
||||
const result = {};
|
||||
pieces.forEach((piece) => {
|
||||
const config = piece.split(/=/);
|
||||
result[config[0]] = config[1];
|
||||
});
|
||||
return result;
|
||||
})();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} path
|
||||
*/
|
||||
function resolvePath(path) {
|
||||
if (/^\//.test(path)) {
|
||||
return path;
|
||||
}
|
||||
return `/monaco-editor/${path}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {boolean} isEditor
|
||||
*/
|
||||
function renderLoadingOptions(isEditor) {
|
||||
const name = isEditor ? 'editor' : 'plugins';
|
||||
const paths = isEditor ? corePaths : pluginPaths;
|
||||
const selectedPath = isEditor ? editorQueryValue : pluginsQueryValue;
|
||||
return (
|
||||
'<strong style="width:130px;display:inline-block;">' +
|
||||
name +
|
||||
'</strong>:   ' +
|
||||
Object.keys(paths)
|
||||
.map((path) => {
|
||||
if (path === selectedPath) {
|
||||
return '<strong>' + path + '</strong>';
|
||||
}
|
||||
return '<a href="' + generateUrlForLoadingOption(isEditor, path) + '">' + path + '</a>';
|
||||
})
|
||||
.join('   ')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {boolean} isEditor
|
||||
* @param {string} value
|
||||
*/
|
||||
function generateUrlForLoadingOption(isEditor, value) {
|
||||
/** @type {{[name:string]: string;}} */
|
||||
const newQueryOptions = {};
|
||||
const newEditorQueryValue = isEditor ? value : editorQueryValue;
|
||||
const newPluginsQueryValue = isEditor ? pluginsQueryValue : value;
|
||||
if (newEditorQueryValue !== defaultEditorQueryValue) {
|
||||
newQueryOptions[editorQueryName] = newEditorQueryValue;
|
||||
}
|
||||
if (newPluginsQueryValue !== defaultPluginsQueryValue) {
|
||||
newQueryOptions[pluginsQueryName] = newPluginsQueryValue;
|
||||
}
|
||||
|
||||
let search = Object.keys(newQueryOptions)
|
||||
.map((key) => `${key}=${newQueryOptions[key]}`)
|
||||
.join('&');
|
||||
|
||||
if (search.length > 0) {
|
||||
search = '?' + search;
|
||||
}
|
||||
return toHREF(search);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} search
|
||||
*/
|
||||
function toHREF(search) {
|
||||
let port = window.location.port;
|
||||
if (port.length > 0) {
|
||||
@@ -55,202 +207,12 @@
|
||||
);
|
||||
}
|
||||
|
||||
function Component(name, modulePrefix, paths, rootPath, contrib) {
|
||||
this.name = name;
|
||||
this.modulePrefix = modulePrefix;
|
||||
this.paths = paths;
|
||||
this.rootPath = rootPath;
|
||||
this.contrib = contrib;
|
||||
this.selectedPath = LOADER_OPTS[name];
|
||||
}
|
||||
Component.prototype.isRelease = function () {
|
||||
return /release/.test(this.selectedPath);
|
||||
};
|
||||
Component.prototype.getResolvedPath = function (PATH_PREFIX) {
|
||||
let resolvedPath = this.paths[this.selectedPath];
|
||||
if (/\.\//.test(resolvedPath)) {
|
||||
// starts with ./ => treat as relative to the root path
|
||||
if (IS_FILE_PROTOCOL) {
|
||||
resolvedPath = DIRNAME + '/../../' + this.rootPath + '/' + resolvedPath;
|
||||
} else {
|
||||
resolvedPath = PATH_PREFIX + '/monaco-editor/' + this.rootPath + '/' + resolvedPath;
|
||||
}
|
||||
} else if (
|
||||
this.selectedPath === 'npm/dev' ||
|
||||
this.selectedPath === 'npm/min' ||
|
||||
this.isRelease()
|
||||
) {
|
||||
if (IS_FILE_PROTOCOL) {
|
||||
resolvedPath = DIRNAME + '/../../' + resolvedPath;
|
||||
} else {
|
||||
resolvedPath = PATH_PREFIX + '/monaco-editor/' + resolvedPath;
|
||||
}
|
||||
} else {
|
||||
if (IS_FILE_PROTOCOL) {
|
||||
resolvedPath = DIRNAME + '/../../../' + resolvedPath;
|
||||
} else {
|
||||
resolvedPath = PATH_PREFIX + resolvedPath;
|
||||
}
|
||||
}
|
||||
return resolvedPath;
|
||||
};
|
||||
Component.prototype.generateLoaderConfig = function (dest, PATH_PREFIX) {
|
||||
dest[this.modulePrefix] = this.getResolvedPath(PATH_PREFIX);
|
||||
};
|
||||
Component.prototype.generateUrlForPath = function (pathName) {
|
||||
let NEW_LOADER_OPTS = {};
|
||||
Object.keys(LOADER_OPTS).forEach(function (key) {
|
||||
NEW_LOADER_OPTS[key] = LOADER_OPTS[key] === 'npm/dev' ? undefined : LOADER_OPTS[key];
|
||||
});
|
||||
NEW_LOADER_OPTS[this.name] = pathName === 'npm/dev' ? undefined : pathName;
|
||||
|
||||
let search = Object.keys(NEW_LOADER_OPTS)
|
||||
.map(function (key) {
|
||||
let value = NEW_LOADER_OPTS[key];
|
||||
if (value) {
|
||||
return key + '=' + value;
|
||||
}
|
||||
return '';
|
||||
})
|
||||
.filter(function (assignment) {
|
||||
return !!assignment;
|
||||
})
|
||||
.join('&');
|
||||
if (search.length > 0) {
|
||||
search = '?' + search;
|
||||
}
|
||||
return toHREF(search);
|
||||
};
|
||||
Component.prototype.renderLoadingOptions = function () {
|
||||
return (
|
||||
'<strong style="width:130px;display:inline-block;">' +
|
||||
this.name +
|
||||
'</strong>:   ' +
|
||||
Object.keys(this.paths)
|
||||
.map(
|
||||
function (pathName) {
|
||||
if (pathName === this.selectedPath) {
|
||||
return '<strong>' + pathName + '</strong>';
|
||||
}
|
||||
return '<a href="' + this.generateUrlForPath(pathName) + '">' + pathName + '</a>';
|
||||
}.bind(this)
|
||||
)
|
||||
.join('   ')
|
||||
);
|
||||
};
|
||||
|
||||
let RESOLVED_CORE = new Component('editor', 'vs', METADATA.CORE.paths);
|
||||
self.RESOLVED_CORE_PATH = RESOLVED_CORE.getResolvedPath('');
|
||||
let RESOLVED_PLUGINS = METADATA.PLUGINS.map(function (plugin) {
|
||||
return new Component(
|
||||
plugin.name,
|
||||
plugin.modulePrefix,
|
||||
plugin.paths,
|
||||
plugin.rootPath,
|
||||
plugin.contrib
|
||||
);
|
||||
});
|
||||
METADATA = null;
|
||||
|
||||
function loadScript(path, callback) {
|
||||
let script = document.createElement('script');
|
||||
const script = document.createElement('script');
|
||||
script.onload = callback;
|
||||
script.async = true;
|
||||
script.type = 'text/javascript';
|
||||
script.src = path;
|
||||
document.head.appendChild(script);
|
||||
}
|
||||
|
||||
(function () {
|
||||
let allComponents = [RESOLVED_CORE];
|
||||
if (!RESOLVED_CORE.isRelease()) {
|
||||
allComponents = allComponents.concat(RESOLVED_PLUGINS);
|
||||
}
|
||||
|
||||
let div = document.createElement('div');
|
||||
div.className = 'dev-setup-control';
|
||||
div.style.position = 'fixed';
|
||||
div.style.top = 0;
|
||||
div.style.right = 0;
|
||||
div.style.background = 'lightgray';
|
||||
div.style.padding = '5px 20px 5px 5px';
|
||||
div.style.zIndex = '1000';
|
||||
|
||||
div.innerHTML =
|
||||
'<ul><li>' +
|
||||
allComponents
|
||||
.map(function (component) {
|
||||
return component.renderLoadingOptions();
|
||||
})
|
||||
.join('</li><li>') +
|
||||
'</li></ul>';
|
||||
|
||||
document.body.appendChild(div);
|
||||
|
||||
let aElements = document.getElementsByTagName('a');
|
||||
for (let i = 0; i < aElements.length; i++) {
|
||||
let aElement = aElements[i];
|
||||
if (aElement.className === 'loading-opts') {
|
||||
aElement.href += window.location.search;
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
self.getCodiconPath = function (PATH_PREFIX) {
|
||||
PATH_PREFIX = PATH_PREFIX || '';
|
||||
const result = RESOLVED_CORE.getResolvedPath(PATH_PREFIX);
|
||||
return result + '/base/browser/ui/codicons/codicon/codicon.ttf';
|
||||
};
|
||||
|
||||
self.loadEditor = function (callback, PATH_PREFIX) {
|
||||
PATH_PREFIX = PATH_PREFIX || '';
|
||||
|
||||
loadScript(RESOLVED_CORE.getResolvedPath(PATH_PREFIX) + '/loader.js', function () {
|
||||
let loaderPathsConfig = {};
|
||||
window.AMD = true;
|
||||
if (IS_FILE_PROTOCOL) {
|
||||
loaderPathsConfig['vs/language/fillers/monaco-editor-core'] =
|
||||
DIRNAME + '/../.././out/amd/fillers/monaco-editor-core-amd';
|
||||
loaderPathsConfig['vs/fillers/monaco-editor-core'] =
|
||||
DIRNAME + '/../.././out/amd/fillers/monaco-editor-core-amd';
|
||||
} else {
|
||||
loaderPathsConfig['vs/language/fillers/monaco-editor-core'] =
|
||||
PATH_PREFIX + '/monaco-editor/./out/amd/fillers/monaco-editor-core-amd';
|
||||
loaderPathsConfig['vs/fillers/monaco-editor-core'] =
|
||||
PATH_PREFIX + '/monaco-editor/./out/amd/fillers/monaco-editor-core-amd';
|
||||
}
|
||||
if (!RESOLVED_CORE.isRelease()) {
|
||||
RESOLVED_PLUGINS.forEach(function (plugin) {
|
||||
plugin.generateLoaderConfig(loaderPathsConfig, PATH_PREFIX);
|
||||
});
|
||||
}
|
||||
RESOLVED_CORE.generateLoaderConfig(loaderPathsConfig, PATH_PREFIX);
|
||||
|
||||
console.log('LOADER CONFIG: ');
|
||||
console.log(JSON.stringify(loaderPathsConfig, null, '\t'));
|
||||
|
||||
require.config({
|
||||
paths: loaderPathsConfig
|
||||
// 'vs/nls' : {
|
||||
// availableLanguages: {
|
||||
// '*': 'de'
|
||||
// }
|
||||
// }
|
||||
});
|
||||
|
||||
require(['vs/editor/editor.main'], function () {
|
||||
if (!RESOLVED_CORE.isRelease()) {
|
||||
// At this point we've loaded the monaco-editor-core
|
||||
require(RESOLVED_PLUGINS.map(function (plugin) {
|
||||
return plugin.contrib;
|
||||
}), function () {
|
||||
// At this point we've loaded all the plugins
|
||||
callback();
|
||||
});
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
})();
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
></div>
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<script src="../../metadata.js"></script>
|
||||
<script src="dev-setup.js"></script>
|
||||
<script>
|
||||
loadEditor(function () {
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
</head>
|
||||
<body style="height: 100%">
|
||||
<div
|
||||
style="
|
||||
position: absolute;
|
||||
left: 10px;
|
||||
top: 10px;
|
||||
width: 400px;
|
||||
height: 200px;
|
||||
border: 1px solid silver;
|
||||
"
|
||||
id="editor"
|
||||
></div>
|
||||
|
||||
<script src="dev-setup.js"></script>
|
||||
<script>
|
||||
loadEditor(function () {
|
||||
monaco.editor.create(document.getElementById('editor'), {
|
||||
value: `function hello()\n{\treturn 5;\n}`,
|
||||
language: 'javascript'
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,23 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
</head>
|
||||
<body>
|
||||
<h2>Monaco Editor in iframe</h2>
|
||||
|
||||
<input type="text" style="position: absolute; top: 60px; left: 20px" />
|
||||
|
||||
<iframe
|
||||
src="./iframe-inner.html"
|
||||
style="
|
||||
position: absolute;
|
||||
left: 20px;
|
||||
top: 100px;
|
||||
width: calc(100% - 40px);
|
||||
height: 300px;
|
||||
border: 1px solid silver;
|
||||
"
|
||||
></iframe>
|
||||
</body>
|
||||
</html>
|
||||
@@ -11,6 +11,8 @@
|
||||
<a class="loading-opts" href="./diff.html">[Diff]</a>  | 
|
||||
<a class="loading-opts" href="./typescript/index.html">[TypeScript]</a>  | 
|
||||
<a class="loading-opts" href="./typescript/custom-worker.html">[TS Worker]</a>
|
||||
 | 
|
||||
<a class="loading-opts" href="./iframe.html">[iframe]</a>
|
||||
<br /> | 
|
||||
<a class="loading-opts" href="./cross-origin.html">[cross origin]</a>  | 
|
||||
<a class="loading-opts" href="./mouse-fixed.html">[fixed element]</a>  | 
|
||||
@@ -32,7 +34,6 @@
|
||||
></div>
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<script src="../../metadata.js"></script>
|
||||
<script src="dev-setup.js"></script>
|
||||
<script>
|
||||
loadEditor(function () {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/// <reference path="../../release/monaco.d.ts" />
|
||||
define(['require', './samples'], function (require, SAMPLES) {
|
||||
var domutils = require('vs/base/browser/dom');
|
||||
const domutils = require('vs/base/browser/dom');
|
||||
|
||||
var model = monaco.editor.createModel('', 'plaintext');
|
||||
let model = monaco.editor.createModel('', 'plaintext');
|
||||
|
||||
monaco.languages.typescript.typescriptDefaults.setInlayHintsOptions({
|
||||
includeInlayParameterNameHints: 'all',
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
id="Editor"
|
||||
></div>
|
||||
|
||||
<script src="../../metadata.js"></script>
|
||||
<script src="dev-setup.js"></script>
|
||||
<script>
|
||||
loadEditor(function () {
|
||||
|
||||
@@ -273,7 +273,6 @@
|
||||
non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
</p>
|
||||
|
||||
<script src="../../metadata.js"></script>
|
||||
<script src="dev-setup.js"></script>
|
||||
<script>
|
||||
loadEditor(function () {
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<script src="../../metadata.js"></script>
|
||||
<script src="dev-setup.js"></script>
|
||||
<script>
|
||||
loadEditor(function () {
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
|
||||
"use strict";
|
||||
function Person(age) {
|
||||
if (age) {
|
||||
this.age = age;
|
||||
}
|
||||
}
|
||||
Person.prototype.getAge = function () {
|
||||
return this.age;
|
||||
};
|
||||
|
||||
function Student(age, grade) {
|
||||
Person.call(this, age);
|
||||
this.grade = grade;
|
||||
}
|
||||
Student.prototype = new Person();
|
||||
Student.prototype.getGrade = function () {
|
||||
return this.grade;
|
||||
};
|
||||
|
||||
var s = new Student(24, 5.75);
|
||||
//var age = s.
|
||||
|
||||
//delete s.age;
|
||||
//s.getAge = function() { return {foo:"bar"}; };
|
||||
//s.
|
||||
//s.getAge().
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
"use strict";
|
||||
function Person(age) {
|
||||
if (age) {
|
||||
this.age = age;
|
||||
}
|
||||
}
|
||||
Person.prototype.getAge = function () {
|
||||
return this.age;
|
||||
};
|
||||
|
||||
function Student(age, grade) {
|
||||
Person.call(this, age);
|
||||
this.grade = grade;
|
||||
}
|
||||
Student.prototype = new Person();
|
||||
Student.prototype.getGrade = function () {
|
||||
return this.grade;
|
||||
};
|
||||
|
||||
var s = new Student(24, 5.75);
|
||||
//var age = s.
|
||||
|
||||
//delete s.age;
|
||||
//s.getAge = function() { return {foo:"bar"}; };
|
||||
//s.
|
||||
//s.getAge().
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
|
||||
전문
|
||||
유구한 역사와 전통에 빛나는 우리 대한 국민은 3·1 운동으로 건립된 대한민국 임시 정부의 법통과 불의에 항거한 4·19 민주 이념을 계승하고, 조국의 민주 개혁과 평화적 통일의 사명에 입각하여 정의·인도와 동포애로써 민족의 단결을 공고히 하고, 모든 사회적 폐습과 불의를 타파하며, 자율과 조화를 바탕으로 자유 민주적 기본 질서를 더욱 확고히 하여 정치·경제·사회·문화의 모든 영역에 있어서 각인의 기회를 균등히 하고, 능력을 최고도로 발휘하게 하며, 자유와 권리에 따르는 책임과 의무를 완수하게 하여, 안으로는 국민 생활의 균등한 향상을 기하고 밖으로는 항구적인 세계 평화와 인류 공영에 이바지함으로써 우리들과 우리들의 자손의 안전과 자유와 행복을 영원히 확보할 것을 다짐하면서 1948년 7월 12일에 제정되고 8차에 걸쳐 개정된 헌법을 이제 국회의 의결을 거쳐 국민 투표에 의하여 개정한다.
|
||||
1987년 10월 29일
|
||||
前文
|
||||
悠久한 歷史와 傳統에 빛나는 우리 大韓國民은 3·1 運動으로 建立된 大韓民國臨時政府의 法統과 不義에 抗拒한 4·19 民主理念을 繼承하고, 祖國의 民主改革과 平和的統一의 使命에 立脚하여 正義·人道와 同胞愛로써 民族의 團結을 鞏固히 하고, 모든 社會的弊習과 不義를 打破하며, 自律과 調和를 바탕으로 自由民主的基本秩序를 더욱 確固히 하여 政治·經濟·社會·文化의 모든 領域에 있어서 各人의 機會를 均等히 하고, 能力을 最高度로 發揮하게 하며, 自由와 權利에 따르는 責任과 義務를 完遂하게 하여, 안으로는 國民生活의 均等한 向上을 基하고 밖으로는 恒久的인 世界平和와 人類共榮에 이바지함으로써 우리들과 우리들의 子孫의 安全과 自由와 幸福을 永遠히 確保할 것을 다짐하면서 1948年 7月 12日에 制定되고 8次에 걸쳐 改正된 憲法을 이제 國會의 議決을 거쳐 國民投票에 依하여 改正한다.
|
||||
1987年 10月 29日
|
||||
|
||||
/*
|
||||
|
||||
전문
|
||||
유구한 역사와 전통에 빛나는 우리 대한 국민은 3·1 운동으로 건립된 대한민국 임시 정부의 법통과 불의에 항거한 4·19 민주 이념을 계승하고, 조국의 민주 개혁과 평화적 통일의 사명에 입각하여 정의·인도와 동포애로써 민족의 단결을 공고히 하고, 모든 사회적 폐습과 불의를 타파하며, 자율과 조화를 바탕으로 자유 민주적 기본 질서를 더욱 확고히 하여 정치·경제·사회·문화의 모든 영역에 있어서 각인의 기회를 균등히 하고, 능력을 최고도로 발휘하게 하며, 자유와 권리에 따르는 책임과 의무를 완수하게 하여, 안으로는 국민 생활의 균등한 향상을 기하고 밖으로는 항구적인 세계 평화와 인류 공영에 이바지함으로써 우리들과 우리들의 자손의 안전과 자유와 행복을 영원히 확보할 것을 다짐하면서 1948년 7월 12일에 제정되고 8차에 걸쳐 개정된 헌법을 이제 국회의 의결을 거쳐 국민 투표에 의하여 개정한다.
|
||||
1987년 10월 29일
|
||||
前文
|
||||
悠久한 歷史와 傳統에 빛나는 우리 大韓國民은 3·1 運動으로 建立된 大韓民國臨時政府의 法統과 不義에 抗拒한 4·19 民主理念을 繼承하고, 祖國의 民主改革과 平和的統一의 使命에 立脚하여 正義·人道와 同胞愛로써 民族의 團結을 鞏固히 하고, 모든 社會的弊習과 不義를 打破하며, 自律과 調和를 바탕으로 自由民主的基本秩序를 더욱 確固히 하여 政治·經濟·社會·文化의 모든 領域에 있어서 各人의 機會를 均等히 하고, 能力을 最高度로 發揮하게 하며, 自由와 權利에 따르는 責任과 義務를 完遂하게 하여, 안으로는 國民生活의 均等한 向上을 基하고 밖으로는 恒久的인 世界平和와 人類共榮에 이바지함으로써 우리들과 우리들의 子孫의 安全과 自由와 幸福을 永遠히 確保할 것을 다짐하면서 1948年 7月 12日에 制定되고 8次에 걸쳐 改正된 憲法을 이제 國會의 議決을 거쳐 國民投票에 依하여 改正한다.
|
||||
1987年 10月 29日
|
||||
|
||||
*/
|
||||
@@ -1,493 +1,493 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Http;
|
||||
using System.Security.Claims;
|
||||
using System.Security.Cryptography;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
using System.Web.Http;
|
||||
using System.Web.Http.ModelBinding;
|
||||
using Microsoft.AspNet.Identity;
|
||||
using Microsoft.AspNet.Identity.EntityFramework;
|
||||
using Microsoft.AspNet.Identity.Owin;
|
||||
using Microsoft.Owin.Security;
|
||||
using Microsoft.Owin.Security.Cookies;
|
||||
using Microsoft.Owin.Security.OAuth;
|
||||
using WebApplication.Models;
|
||||
using WebApplication.Providers;
|
||||
using WebApplication.Results;
|
||||
|
||||
namespace WebApplication.Controllers
|
||||
{
|
||||
[Authorize]
|
||||
[RoutePrefix("api/Account")]
|
||||
public class AccountController : ApiController
|
||||
{
|
||||
private const string LocalLoginProvider = "Local";
|
||||
private ApplicationUserManager _userManager;
|
||||
|
||||
public AccountController()
|
||||
{
|
||||
}
|
||||
|
||||
public AccountController(ApplicationUserManager userManager,
|
||||
ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
|
||||
{
|
||||
UserManager = userManager;
|
||||
AccessTokenFormat = accessTokenFormat;
|
||||
}
|
||||
|
||||
public ApplicationUserManager UserManager
|
||||
{
|
||||
get
|
||||
{
|
||||
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
|
||||
}
|
||||
private set
|
||||
{
|
||||
_userManager = value;
|
||||
}
|
||||
}
|
||||
|
||||
public ISecureDataFormat<AuthenticationTicket> AccessTokenFormat { get; private set; }
|
||||
|
||||
// GET api/Account/UserInfo
|
||||
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
|
||||
[Route("UserInfo")]
|
||||
public UserInfoViewModel GetUserInfo()
|
||||
{
|
||||
ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
|
||||
|
||||
return new UserInfoViewModel
|
||||
{
|
||||
Email = User.Identity.GetUserName(),
|
||||
HasRegistered = externalLogin == null,
|
||||
LoginProvider = externalLogin != null ? externalLogin.LoginProvider : null
|
||||
};
|
||||
}
|
||||
|
||||
// POST api/Account/Logout
|
||||
[Route("Logout")]
|
||||
public IHttpActionResult Logout()
|
||||
{
|
||||
Authentication.SignOut(CookieAuthenticationDefaults.AuthenticationType);
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// GET api/Account/ManageInfo?returnUrl=%2F&generateState=true
|
||||
[Route("ManageInfo")]
|
||||
public async Task<ManageInfoViewModel> GetManageInfo(string returnUrl, bool generateState = false)
|
||||
{
|
||||
IdentityUser user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
|
||||
|
||||
if (user == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
List<UserLoginInfoViewModel> logins = new List<UserLoginInfoViewModel>();
|
||||
|
||||
foreach (IdentityUserLogin linkedAccount in user.Logins)
|
||||
{
|
||||
logins.Add(new UserLoginInfoViewModel
|
||||
{
|
||||
LoginProvider = linkedAccount.LoginProvider,
|
||||
ProviderKey = linkedAccount.ProviderKey
|
||||
});
|
||||
}
|
||||
|
||||
if (user.PasswordHash != null)
|
||||
{
|
||||
logins.Add(new UserLoginInfoViewModel
|
||||
{
|
||||
LoginProvider = LocalLoginProvider,
|
||||
ProviderKey = user.UserName,
|
||||
});
|
||||
}
|
||||
|
||||
return new ManageInfoViewModel
|
||||
{
|
||||
LocalLoginProvider = LocalLoginProvider,
|
||||
Email = user.UserName,
|
||||
Logins = logins,
|
||||
ExternalLoginProviders = GetExternalLogins(returnUrl, generateState)
|
||||
};
|
||||
}
|
||||
|
||||
// POST api/Account/ChangePassword
|
||||
[Route("ChangePassword")]
|
||||
public async Task<IHttpActionResult> ChangePassword(ChangePasswordBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
IdentityResult result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword,
|
||||
model.NewPassword);
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// POST api/Account/SetPassword
|
||||
[Route("SetPassword")]
|
||||
public async Task<IHttpActionResult> SetPassword(SetPasswordBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
IdentityResult result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword);
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// POST api/Account/AddExternalLogin
|
||||
[Route("AddExternalLogin")]
|
||||
public async Task<IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
|
||||
|
||||
AuthenticationTicket ticket = AccessTokenFormat.Unprotect(model.ExternalAccessToken);
|
||||
|
||||
if (ticket == null || ticket.Identity == null || (ticket.Properties != null
|
||||
&& ticket.Properties.ExpiresUtc.HasValue
|
||||
&& ticket.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow))
|
||||
{
|
||||
return BadRequest("External login failure.");
|
||||
}
|
||||
|
||||
ExternalLoginData externalData = ExternalLoginData.FromIdentity(ticket.Identity);
|
||||
|
||||
if (externalData == null)
|
||||
{
|
||||
return BadRequest("The external login is already associated with an account.");
|
||||
}
|
||||
|
||||
IdentityResult result = await UserManager.AddLoginAsync(User.Identity.GetUserId(),
|
||||
new UserLoginInfo(externalData.LoginProvider, externalData.ProviderKey));
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// POST api/Account/RemoveLogin
|
||||
[Route("RemoveLogin")]
|
||||
public async Task<IHttpActionResult> RemoveLogin(RemoveLoginBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
IdentityResult result;
|
||||
|
||||
if (model.LoginProvider == LocalLoginProvider)
|
||||
{
|
||||
result = await UserManager.RemovePasswordAsync(User.Identity.GetUserId());
|
||||
}
|
||||
else
|
||||
{
|
||||
result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(),
|
||||
new UserLoginInfo(model.LoginProvider, model.ProviderKey));
|
||||
}
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// GET api/Account/ExternalLogin
|
||||
[OverrideAuthentication]
|
||||
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
|
||||
[AllowAnonymous]
|
||||
[Route("ExternalLogin", Name = "ExternalLogin")]
|
||||
public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null)
|
||||
{
|
||||
if (error != null)
|
||||
{
|
||||
return Redirect(Url.Content("~/") + "#error=" + Uri.EscapeDataString(error));
|
||||
}
|
||||
|
||||
if (!User.Identity.IsAuthenticated)
|
||||
{
|
||||
return new ChallengeResult(provider, this);
|
||||
}
|
||||
|
||||
ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
|
||||
|
||||
if (externalLogin == null)
|
||||
{
|
||||
return InternalServerError();
|
||||
}
|
||||
|
||||
if (externalLogin.LoginProvider != provider)
|
||||
{
|
||||
Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
|
||||
return new ChallengeResult(provider, this);
|
||||
}
|
||||
|
||||
ApplicationUser user = await UserManager.FindAsync(new UserLoginInfo(externalLogin.LoginProvider,
|
||||
externalLogin.ProviderKey));
|
||||
|
||||
bool hasRegistered = user != null;
|
||||
|
||||
if (hasRegistered)
|
||||
{
|
||||
Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
|
||||
|
||||
ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(UserManager,
|
||||
OAuthDefaults.AuthenticationType);
|
||||
ClaimsIdentity cookieIdentity = await user.GenerateUserIdentityAsync(UserManager,
|
||||
CookieAuthenticationDefaults.AuthenticationType);
|
||||
|
||||
AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user.UserName);
|
||||
Authentication.SignIn(properties, oAuthIdentity, cookieIdentity);
|
||||
}
|
||||
else
|
||||
{
|
||||
IEnumerable<Claim> claims = externalLogin.GetClaims();
|
||||
ClaimsIdentity identity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType);
|
||||
Authentication.SignIn(identity);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// GET api/Account/ExternalLogins?returnUrl=%2F&generateState=true
|
||||
[AllowAnonymous]
|
||||
[Route("ExternalLogins")]
|
||||
public IEnumerable<ExternalLoginViewModel> GetExternalLogins(string returnUrl, bool generateState = false)
|
||||
{
|
||||
IEnumerable<AuthenticationDescription> descriptions = Authentication.GetExternalAuthenticationTypes();
|
||||
List<ExternalLoginViewModel> logins = new List<ExternalLoginViewModel>();
|
||||
|
||||
string state;
|
||||
|
||||
if (generateState)
|
||||
{
|
||||
const int strengthInBits = 256;
|
||||
state = RandomOAuthStateGenerator.Generate(strengthInBits);
|
||||
}
|
||||
else
|
||||
{
|
||||
state = null;
|
||||
}
|
||||
|
||||
foreach (AuthenticationDescription description in descriptions)
|
||||
{
|
||||
ExternalLoginViewModel login = new ExternalLoginViewModel
|
||||
{
|
||||
Name = description.Caption,
|
||||
Url = Url.Route("ExternalLogin", new
|
||||
{
|
||||
provider = description.AuthenticationType,
|
||||
response_type = "token",
|
||||
client_id = Startup.PublicClientId,
|
||||
redirect_uri = new Uri(Request.RequestUri, returnUrl).AbsoluteUri,
|
||||
state = state
|
||||
}),
|
||||
State = state
|
||||
};
|
||||
logins.Add(login);
|
||||
}
|
||||
|
||||
return logins;
|
||||
}
|
||||
|
||||
// POST api/Account/Register
|
||||
[AllowAnonymous]
|
||||
[Route("Register")]
|
||||
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
|
||||
|
||||
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// POST api/Account/RegisterExternal
|
||||
[OverrideAuthentication]
|
||||
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
|
||||
[Route("RegisterExternal")]
|
||||
public async Task<IHttpActionResult> RegisterExternal(RegisterExternalBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
var info = await Authentication.GetExternalLoginInfoAsync();
|
||||
if (info == null)
|
||||
{
|
||||
return InternalServerError();
|
||||
}
|
||||
|
||||
var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
|
||||
|
||||
IdentityResult result = await UserManager.CreateAsync(user);
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
result = await UserManager.AddLoginAsync(user.Id, info.Login);
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
return Ok();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
UserManager.Dispose();
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Helpers
|
||||
|
||||
private IAuthenticationManager Authentication
|
||||
{
|
||||
get { return Request.GetOwinContext().Authentication; }
|
||||
}
|
||||
|
||||
private IHttpActionResult GetErrorResult(IdentityResult result)
|
||||
{
|
||||
if (result == null)
|
||||
{
|
||||
return InternalServerError();
|
||||
}
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
if (result.Errors != null)
|
||||
{
|
||||
foreach (string error in result.Errors)
|
||||
{
|
||||
ModelState.AddModelError("", error);
|
||||
}
|
||||
}
|
||||
|
||||
if (ModelState.IsValid)
|
||||
{
|
||||
// No ModelState errors are available to send, so just return an empty BadRequest.
|
||||
return BadRequest();
|
||||
}
|
||||
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private class ExternalLoginData
|
||||
{
|
||||
public string LoginProvider { get; set; }
|
||||
public string ProviderKey { get; set; }
|
||||
public string UserName { get; set; }
|
||||
|
||||
public IList<Claim> GetClaims()
|
||||
{
|
||||
IList<Claim> claims = new List<Claim>();
|
||||
claims.Add(new Claim(ClaimTypes.NameIdentifier, ProviderKey, null, LoginProvider));
|
||||
|
||||
if (UserName != null)
|
||||
{
|
||||
claims.Add(new Claim(ClaimTypes.Name, UserName, null, LoginProvider));
|
||||
}
|
||||
|
||||
return claims;
|
||||
}
|
||||
|
||||
public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
|
||||
{
|
||||
if (identity == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
|
||||
|
||||
if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer)
|
||||
|| String.IsNullOrEmpty(providerKeyClaim.Value))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return new ExternalLoginData
|
||||
{
|
||||
LoginProvider = providerKeyClaim.Issuer,
|
||||
ProviderKey = providerKeyClaim.Value,
|
||||
UserName = identity.FindFirstValue(ClaimTypes.Name)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private static class RandomOAuthStateGenerator
|
||||
{
|
||||
private static RandomNumberGenerator _random = new RNGCryptoServiceProvider();
|
||||
|
||||
public static string Generate(int strengthInBits)
|
||||
{
|
||||
const int bitsPerByte = 8;
|
||||
|
||||
if (strengthInBits % bitsPerByte != 0)
|
||||
{
|
||||
throw new ArgumentException("strengthInBits must be evenly divisible by 8.", "strengthInBits");
|
||||
}
|
||||
|
||||
int strengthInBytes = strengthInBits / bitsPerByte;
|
||||
|
||||
byte[] data = new byte[strengthInBytes];
|
||||
_random.GetBytes(data);
|
||||
return HttpServerUtility.UrlTokenEncode(data);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Http;
|
||||
using System.Security.Claims;
|
||||
using System.Security.Cryptography;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
using System.Web.Http;
|
||||
using System.Web.Http.ModelBinding;
|
||||
using Microsoft.AspNet.Identity;
|
||||
using Microsoft.AspNet.Identity.EntityFramework;
|
||||
using Microsoft.AspNet.Identity.Owin;
|
||||
using Microsoft.Owin.Security;
|
||||
using Microsoft.Owin.Security.Cookies;
|
||||
using Microsoft.Owin.Security.OAuth;
|
||||
using WebApplication.Models;
|
||||
using WebApplication.Providers;
|
||||
using WebApplication.Results;
|
||||
|
||||
namespace WebApplication.Controllers
|
||||
{
|
||||
[Authorize]
|
||||
[RoutePrefix("api/Account")]
|
||||
public class AccountController : ApiController
|
||||
{
|
||||
private const string LocalLoginProvider = "Local";
|
||||
private ApplicationUserManager _userManager;
|
||||
|
||||
public AccountController()
|
||||
{
|
||||
}
|
||||
|
||||
public AccountController(ApplicationUserManager userManager,
|
||||
ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
|
||||
{
|
||||
UserManager = userManager;
|
||||
AccessTokenFormat = accessTokenFormat;
|
||||
}
|
||||
|
||||
public ApplicationUserManager UserManager
|
||||
{
|
||||
get
|
||||
{
|
||||
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
|
||||
}
|
||||
private set
|
||||
{
|
||||
_userManager = value;
|
||||
}
|
||||
}
|
||||
|
||||
public ISecureDataFormat<AuthenticationTicket> AccessTokenFormat { get; private set; }
|
||||
|
||||
// GET api/Account/UserInfo
|
||||
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
|
||||
[Route("UserInfo")]
|
||||
public UserInfoViewModel GetUserInfo()
|
||||
{
|
||||
ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
|
||||
|
||||
return new UserInfoViewModel
|
||||
{
|
||||
Email = User.Identity.GetUserName(),
|
||||
HasRegistered = externalLogin == null,
|
||||
LoginProvider = externalLogin != null ? externalLogin.LoginProvider : null
|
||||
};
|
||||
}
|
||||
|
||||
// POST api/Account/Logout
|
||||
[Route("Logout")]
|
||||
public IHttpActionResult Logout()
|
||||
{
|
||||
Authentication.SignOut(CookieAuthenticationDefaults.AuthenticationType);
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// GET api/Account/ManageInfo?returnUrl=%2F&generateState=true
|
||||
[Route("ManageInfo")]
|
||||
public async Task<ManageInfoViewModel> GetManageInfo(string returnUrl, bool generateState = false)
|
||||
{
|
||||
IdentityUser user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
|
||||
|
||||
if (user == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
List<UserLoginInfoViewModel> logins = new List<UserLoginInfoViewModel>();
|
||||
|
||||
foreach (IdentityUserLogin linkedAccount in user.Logins)
|
||||
{
|
||||
logins.Add(new UserLoginInfoViewModel
|
||||
{
|
||||
LoginProvider = linkedAccount.LoginProvider,
|
||||
ProviderKey = linkedAccount.ProviderKey
|
||||
});
|
||||
}
|
||||
|
||||
if (user.PasswordHash != null)
|
||||
{
|
||||
logins.Add(new UserLoginInfoViewModel
|
||||
{
|
||||
LoginProvider = LocalLoginProvider,
|
||||
ProviderKey = user.UserName,
|
||||
});
|
||||
}
|
||||
|
||||
return new ManageInfoViewModel
|
||||
{
|
||||
LocalLoginProvider = LocalLoginProvider,
|
||||
Email = user.UserName,
|
||||
Logins = logins,
|
||||
ExternalLoginProviders = GetExternalLogins(returnUrl, generateState)
|
||||
};
|
||||
}
|
||||
|
||||
// POST api/Account/ChangePassword
|
||||
[Route("ChangePassword")]
|
||||
public async Task<IHttpActionResult> ChangePassword(ChangePasswordBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
IdentityResult result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword,
|
||||
model.NewPassword);
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// POST api/Account/SetPassword
|
||||
[Route("SetPassword")]
|
||||
public async Task<IHttpActionResult> SetPassword(SetPasswordBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
IdentityResult result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword);
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// POST api/Account/AddExternalLogin
|
||||
[Route("AddExternalLogin")]
|
||||
public async Task<IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
|
||||
|
||||
AuthenticationTicket ticket = AccessTokenFormat.Unprotect(model.ExternalAccessToken);
|
||||
|
||||
if (ticket == null || ticket.Identity == null || (ticket.Properties != null
|
||||
&& ticket.Properties.ExpiresUtc.HasValue
|
||||
&& ticket.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow))
|
||||
{
|
||||
return BadRequest("External login failure.");
|
||||
}
|
||||
|
||||
ExternalLoginData externalData = ExternalLoginData.FromIdentity(ticket.Identity);
|
||||
|
||||
if (externalData == null)
|
||||
{
|
||||
return BadRequest("The external login is already associated with an account.");
|
||||
}
|
||||
|
||||
IdentityResult result = await UserManager.AddLoginAsync(User.Identity.GetUserId(),
|
||||
new UserLoginInfo(externalData.LoginProvider, externalData.ProviderKey));
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// POST api/Account/RemoveLogin
|
||||
[Route("RemoveLogin")]
|
||||
public async Task<IHttpActionResult> RemoveLogin(RemoveLoginBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
IdentityResult result;
|
||||
|
||||
if (model.LoginProvider == LocalLoginProvider)
|
||||
{
|
||||
result = await UserManager.RemovePasswordAsync(User.Identity.GetUserId());
|
||||
}
|
||||
else
|
||||
{
|
||||
result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(),
|
||||
new UserLoginInfo(model.LoginProvider, model.ProviderKey));
|
||||
}
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// GET api/Account/ExternalLogin
|
||||
[OverrideAuthentication]
|
||||
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
|
||||
[AllowAnonymous]
|
||||
[Route("ExternalLogin", Name = "ExternalLogin")]
|
||||
public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null)
|
||||
{
|
||||
if (error != null)
|
||||
{
|
||||
return Redirect(Url.Content("~/") + "#error=" + Uri.EscapeDataString(error));
|
||||
}
|
||||
|
||||
if (!User.Identity.IsAuthenticated)
|
||||
{
|
||||
return new ChallengeResult(provider, this);
|
||||
}
|
||||
|
||||
ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
|
||||
|
||||
if (externalLogin == null)
|
||||
{
|
||||
return InternalServerError();
|
||||
}
|
||||
|
||||
if (externalLogin.LoginProvider != provider)
|
||||
{
|
||||
Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
|
||||
return new ChallengeResult(provider, this);
|
||||
}
|
||||
|
||||
ApplicationUser user = await UserManager.FindAsync(new UserLoginInfo(externalLogin.LoginProvider,
|
||||
externalLogin.ProviderKey));
|
||||
|
||||
bool hasRegistered = user != null;
|
||||
|
||||
if (hasRegistered)
|
||||
{
|
||||
Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
|
||||
|
||||
ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(UserManager,
|
||||
OAuthDefaults.AuthenticationType);
|
||||
ClaimsIdentity cookieIdentity = await user.GenerateUserIdentityAsync(UserManager,
|
||||
CookieAuthenticationDefaults.AuthenticationType);
|
||||
|
||||
AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user.UserName);
|
||||
Authentication.SignIn(properties, oAuthIdentity, cookieIdentity);
|
||||
}
|
||||
else
|
||||
{
|
||||
IEnumerable<Claim> claims = externalLogin.GetClaims();
|
||||
ClaimsIdentity identity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType);
|
||||
Authentication.SignIn(identity);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// GET api/Account/ExternalLogins?returnUrl=%2F&generateState=true
|
||||
[AllowAnonymous]
|
||||
[Route("ExternalLogins")]
|
||||
public IEnumerable<ExternalLoginViewModel> GetExternalLogins(string returnUrl, bool generateState = false)
|
||||
{
|
||||
IEnumerable<AuthenticationDescription> descriptions = Authentication.GetExternalAuthenticationTypes();
|
||||
List<ExternalLoginViewModel> logins = new List<ExternalLoginViewModel>();
|
||||
|
||||
string state;
|
||||
|
||||
if (generateState)
|
||||
{
|
||||
const int strengthInBits = 256;
|
||||
state = RandomOAuthStateGenerator.Generate(strengthInBits);
|
||||
}
|
||||
else
|
||||
{
|
||||
state = null;
|
||||
}
|
||||
|
||||
foreach (AuthenticationDescription description in descriptions)
|
||||
{
|
||||
ExternalLoginViewModel login = new ExternalLoginViewModel
|
||||
{
|
||||
Name = description.Caption,
|
||||
Url = Url.Route("ExternalLogin", new
|
||||
{
|
||||
provider = description.AuthenticationType,
|
||||
response_type = "token",
|
||||
client_id = Startup.PublicClientId,
|
||||
redirect_uri = new Uri(Request.RequestUri, returnUrl).AbsoluteUri,
|
||||
state = state
|
||||
}),
|
||||
State = state
|
||||
};
|
||||
logins.Add(login);
|
||||
}
|
||||
|
||||
return logins;
|
||||
}
|
||||
|
||||
// POST api/Account/Register
|
||||
[AllowAnonymous]
|
||||
[Route("Register")]
|
||||
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
|
||||
|
||||
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
// POST api/Account/RegisterExternal
|
||||
[OverrideAuthentication]
|
||||
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
|
||||
[Route("RegisterExternal")]
|
||||
public async Task<IHttpActionResult> RegisterExternal(RegisterExternalBindingModel model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
var info = await Authentication.GetExternalLoginInfoAsync();
|
||||
if (info == null)
|
||||
{
|
||||
return InternalServerError();
|
||||
}
|
||||
|
||||
var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
|
||||
|
||||
IdentityResult result = await UserManager.CreateAsync(user);
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
|
||||
result = await UserManager.AddLoginAsync(user.Id, info.Login);
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return GetErrorResult(result);
|
||||
}
|
||||
return Ok();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
UserManager.Dispose();
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Helpers
|
||||
|
||||
private IAuthenticationManager Authentication
|
||||
{
|
||||
get { return Request.GetOwinContext().Authentication; }
|
||||
}
|
||||
|
||||
private IHttpActionResult GetErrorResult(IdentityResult result)
|
||||
{
|
||||
if (result == null)
|
||||
{
|
||||
return InternalServerError();
|
||||
}
|
||||
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
if (result.Errors != null)
|
||||
{
|
||||
foreach (string error in result.Errors)
|
||||
{
|
||||
ModelState.AddModelError("", error);
|
||||
}
|
||||
}
|
||||
|
||||
if (ModelState.IsValid)
|
||||
{
|
||||
// No ModelState errors are available to send, so just return an empty BadRequest.
|
||||
return BadRequest();
|
||||
}
|
||||
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private class ExternalLoginData
|
||||
{
|
||||
public string LoginProvider { get; set; }
|
||||
public string ProviderKey { get; set; }
|
||||
public string UserName { get; set; }
|
||||
|
||||
public IList<Claim> GetClaims()
|
||||
{
|
||||
IList<Claim> claims = new List<Claim>();
|
||||
claims.Add(new Claim(ClaimTypes.NameIdentifier, ProviderKey, null, LoginProvider));
|
||||
|
||||
if (UserName != null)
|
||||
{
|
||||
claims.Add(new Claim(ClaimTypes.Name, UserName, null, LoginProvider));
|
||||
}
|
||||
|
||||
return claims;
|
||||
}
|
||||
|
||||
public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
|
||||
{
|
||||
if (identity == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
|
||||
|
||||
if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer)
|
||||
|| String.IsNullOrEmpty(providerKeyClaim.Value))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return new ExternalLoginData
|
||||
{
|
||||
LoginProvider = providerKeyClaim.Issuer,
|
||||
ProviderKey = providerKeyClaim.Value,
|
||||
UserName = identity.FindFirstValue(ClaimTypes.Name)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private static class RandomOAuthStateGenerator
|
||||
{
|
||||
private static RandomNumberGenerator _random = new RNGCryptoServiceProvider();
|
||||
|
||||
public static string Generate(int strengthInBits)
|
||||
{
|
||||
const int bitsPerByte = 8;
|
||||
|
||||
if (strengthInBits % bitsPerByte != 0)
|
||||
{
|
||||
throw new ArgumentException("strengthInBits must be evenly divisible by 8.", "strengthInBits");
|
||||
}
|
||||
|
||||
int strengthInBytes = strengthInBits / bitsPerByte;
|
||||
|
||||
byte[] data = new byte[strengthInBytes];
|
||||
_random.GetBytes(data);
|
||||
return HttpServerUtility.UrlTokenEncode(data);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,50 +1,50 @@
|
||||
[Sun Mar 7 16:02:00 2004] [notice] Apache/1.3.29 (Unix) configured -- resuming normal operations
|
||||
[Sun Mar 7 16:02:00 2004] [info] Server built: Feb 27 2004 13:56:37
|
||||
[Sun Mar 7 16:02:00 2004] [notice] Accept mutex: sysvsem (Default: sysvsem)
|
||||
[Sun Mar 7 16:05:49 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 16:45:56 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 17:13:50 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 17:21:44 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 17:23:53 2004] statistics: Use of uninitialized value in concatenation (.) or string at /home/httpd/twiki/lib/TWiki.pm line 528.
|
||||
[Sun Mar 7 17:23:53 2004] statistics: Can't create file /home/httpd/twiki/data/Main/WebStatistics.txt - Permission denied
|
||||
[Sun Mar 7 17:27:37 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 17:31:39 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 17:58:00 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:00:09 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:10:09 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:19:01 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:42:29 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:52:30 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:58:52 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 19:03:58 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 19:08:55 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:04:35 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:11:33 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:12:55 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:25:31 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:44:48 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:58:27 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 21:16:17 2004] [error] [client xx.xx.xx.xx] File does not exist: /home/httpd/twiki/view/Main/WebHome
|
||||
[Sun Mar 7 21:20:14 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 21:31:12 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 21:39:55 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 21:44:10 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 01:35:13 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 01:47:06 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 01:59:13 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 02:12:24 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 02:54:54 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 03:46:27 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 03:48:18 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 03:52:17 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 03:55:09 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 04:22:55 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 04:24:47 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 04:40:32 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 04:55:40 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 04:59:13 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 05:22:57 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 05:24:29 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 05:31:47 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
<11>httpd[31628]: [error] [client xx.xx.xx.xx] File does not exist: /usr/local/installed/apache/htdocs/squirrelmail/_vti_inf.html in 29-Mar 15:18:20.50 from xx.xx.xx.xx
|
||||
[Sun Mar 7 16:02:00 2004] [notice] Apache/1.3.29 (Unix) configured -- resuming normal operations
|
||||
[Sun Mar 7 16:02:00 2004] [info] Server built: Feb 27 2004 13:56:37
|
||||
[Sun Mar 7 16:02:00 2004] [notice] Accept mutex: sysvsem (Default: sysvsem)
|
||||
[Sun Mar 7 16:05:49 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 16:45:56 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 17:13:50 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 17:21:44 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 17:23:53 2004] statistics: Use of uninitialized value in concatenation (.) or string at /home/httpd/twiki/lib/TWiki.pm line 528.
|
||||
[Sun Mar 7 17:23:53 2004] statistics: Can't create file /home/httpd/twiki/data/Main/WebStatistics.txt - Permission denied
|
||||
[Sun Mar 7 17:27:37 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 17:31:39 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 17:58:00 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:00:09 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:10:09 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:19:01 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:42:29 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:52:30 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 18:58:52 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 19:03:58 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 19:08:55 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:04:35 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:11:33 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:12:55 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:25:31 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:44:48 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 20:58:27 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 21:16:17 2004] [error] [client xx.xx.xx.xx] File does not exist: /home/httpd/twiki/view/Main/WebHome
|
||||
[Sun Mar 7 21:20:14 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 21:31:12 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 21:39:55 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Sun Mar 7 21:44:10 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 01:35:13 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 01:47:06 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 01:59:13 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 02:12:24 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 02:54:54 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 03:46:27 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 03:48:18 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 03:52:17 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 03:55:09 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 04:22:55 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 04:24:47 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 04:40:32 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 04:55:40 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 04:59:13 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 05:22:57 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 05:24:29 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
[Mon Mar 8 05:31:47 2004] [info] [client xx.xx.xx.xx] (104)Connection reset by peer: client stopped connection before send body completed
|
||||
<11>httpd[31628]: [error] [client xx.xx.xx.xx] File does not exist: /usr/local/installed/apache/htdocs/squirrelmail/_vti_inf.html in 29-Mar 15:18:20.50 from xx.xx.xx.xx
|
||||
<11>httpd[25859]: [error] [client xx.xx.xx.xx] File does not exist: /usr/local/installed/apache/htdocs/squirrelmail/_vti_bin/shtml.exe/_vti_rpc in 29-Mar 15:18:20.54 from xx.xx.xx.xx
|
||||
+31764
-31764
File diff suppressed because it is too large
Load Diff
@@ -1,23 +1,23 @@
|
||||
<!DOCTYPE HTML>
|
||||
<!--
|
||||
Comments are overrated
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<title>HTML Sample</title>
|
||||
<style type="text/css">
|
||||
h1 {
|
||||
color: #CCA3A3;
|
||||
}
|
||||
body {
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
window.alert("I am a sample...");
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Heading No.1</h1>
|
||||
<input disabled type="button" value="Click me" />
|
||||
</body>
|
||||
</html>
|
||||
<!DOCTYPE HTML>
|
||||
<!--
|
||||
Comments are overrated
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<title>HTML Sample</title>
|
||||
<style type="text/css">
|
||||
h1 {
|
||||
color: #CCA3A3;
|
||||
}
|
||||
body {
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
window.alert("I am a sample...");
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Heading No.1</h1>
|
||||
<input disabled type="button" value="Click me" />
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,222 +1,222 @@
|
||||
/*
|
||||
© Microsoft. All rights reserved.
|
||||
|
||||
https://microsoft.com
|
||||
blablahttp://en.wikipedia.org/wiki/Timisoara bla bla
|
||||
blabla http://en.wikipedia.org/wiki/Timisoara bla bla
|
||||
|
||||
This library is supported for use in Windows Tailored Apps only.
|
||||
|
||||
Build: 6.2.8100.0
|
||||
Version: 0.5
|
||||
*/
|
||||
|
||||
var קודמות = "מיותר קודמות צ'ט של, אם לשון העברית שינויים ויש, אם";
|
||||
|
||||
'a string\
|
||||
on multiple lines';
|
||||
(function (global, undefined) {
|
||||
"use strict";
|
||||
undefinedVariable = {}; undefinedVariable.bar = 5;
|
||||
undefinedVariable.foo = 5; undefinedVariable.baz = 10;
|
||||
|
||||
function initializeProperties(target, members) {
|
||||
var keys = Object.keys(members);
|
||||
var properties;
|
||||
var i, len;
|
||||
for (i = 0, len = keys.length; i < len; i++) {
|
||||
var key = keys[i];
|
||||
var enumerable = key.charCodeAt(0) !== /*_*/95;
|
||||
var member = members[key];
|
||||
if (member && typeof member === 'object') {
|
||||
if (member.value !== undefined || typeof member.get === 'function' || typeof member.set === 'function') {
|
||||
if (member.enumerable === undefined) {
|
||||
member.enumerable = enumerable;
|
||||
}
|
||||
properties = properties || {};
|
||||
properties[key] = member;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (!enumerable) {
|
||||
properties = properties || {};
|
||||
properties[key] = { value: member, enumerable: enumerable, configurable: true, writable: true }
|
||||
continue;
|
||||
}
|
||||
target[key] = member;
|
||||
}
|
||||
if (properties) {
|
||||
Object.defineProperties(target, properties);
|
||||
}
|
||||
}
|
||||
|
||||
(function (rootNamespace) {
|
||||
|
||||
// Create the rootNamespace in the global namespace
|
||||
if (!global[rootNamespace]) {
|
||||
global[rootNamespace] = Object.create(Object.prototype);
|
||||
}
|
||||
|
||||
// Cache the rootNamespace we just created in a local variable
|
||||
var _rootNamespace = global[rootNamespace];
|
||||
if (!_rootNamespace.Namespace) {
|
||||
_rootNamespace.Namespace = Object.create(Object.prototype);
|
||||
}
|
||||
|
||||
function defineWithParent(parentNamespace, name, members) {
|
||||
/// <summary locid="1">
|
||||
/// Defines a new namespace with the specified name, under the specified parent namespace.
|
||||
/// </summary>
|
||||
/// <param name="parentNamespace" type="Object" locid="2">
|
||||
/// The parent namespace which will contain the new namespace.
|
||||
/// </param>
|
||||
/// <param name="name" type="String" locid="3">
|
||||
/// Name of the new namespace.
|
||||
/// </param>
|
||||
/// <param name="members" type="Object" locid="4">
|
||||
/// Members in the new namespace.
|
||||
/// </param>
|
||||
/// <returns locid="5">
|
||||
/// The newly defined namespace.
|
||||
/// </returns>
|
||||
var currentNamespace = parentNamespace,
|
||||
namespaceFragments = name.split(".");
|
||||
|
||||
for (var i = 0, len = namespaceFragments.length; i < len; i++) {
|
||||
var namespaceName = namespaceFragments[i];
|
||||
if (!currentNamespace[namespaceName]) {
|
||||
Object.defineProperty(currentNamespace, namespaceName,
|
||||
{ value: {}, writable: false, enumerable: true, configurable: true }
|
||||
);
|
||||
}
|
||||
currentNamespace = currentNamespace[namespaceName];
|
||||
}
|
||||
|
||||
if (members) {
|
||||
initializeProperties(currentNamespace, members);
|
||||
}
|
||||
|
||||
return currentNamespace;
|
||||
};
|
||||
|
||||
function define(name, members) {
|
||||
/// <summary locid="6">
|
||||
/// Defines a new namespace with the specified name.
|
||||
/// </summary>
|
||||
/// <param name="name" type="String" locid="7">
|
||||
/// Name of the namespace. This could be a dot-separated nested name.
|
||||
/// </param>
|
||||
/// <param name="members" type="Object" locid="4">
|
||||
/// Members in the new namespace.
|
||||
/// </param>
|
||||
/// <returns locid="5">
|
||||
/// The newly defined namespace.
|
||||
/// </returns>
|
||||
return defineWithParent(global, name, members);
|
||||
}
|
||||
|
||||
// Establish members of the "WinJS.Namespace" namespace
|
||||
Object.defineProperties(_rootNamespace.Namespace, {
|
||||
|
||||
defineWithParent: { value: defineWithParent, writable: true, enumerable: true },
|
||||
|
||||
define: { value: define, writable: true, enumerable: true }
|
||||
|
||||
});
|
||||
|
||||
})("WinJS");
|
||||
|
||||
(function (WinJS) {
|
||||
|
||||
function define(constructor, instanceMembers, staticMembers) {
|
||||
/// <summary locid="8">
|
||||
/// Defines a class using the given constructor and with the specified instance members.
|
||||
/// </summary>
|
||||
/// <param name="constructor" type="Function" locid="9">
|
||||
/// A constructor function that will be used to instantiate this class.
|
||||
/// </param>
|
||||
/// <param name="instanceMembers" type="Object" locid="10">
|
||||
/// The set of instance fields, properties and methods to be made available on the class.
|
||||
/// </param>
|
||||
/// <param name="staticMembers" type="Object" locid="11">
|
||||
/// The set of static fields, properties and methods to be made available on the class.
|
||||
/// </param>
|
||||
/// <returns type="Function" locid="12">
|
||||
/// The newly defined class.
|
||||
/// </returns>
|
||||
constructor = constructor || function () { };
|
||||
if (instanceMembers) {
|
||||
initializeProperties(constructor.prototype, instanceMembers);
|
||||
}
|
||||
if (staticMembers) {
|
||||
initializeProperties(constructor, staticMembers);
|
||||
}
|
||||
return constructor;
|
||||
}
|
||||
|
||||
function derive(baseClass, constructor, instanceMembers, staticMembers) {
|
||||
/// <summary locid="13">
|
||||
/// Uses prototypal inheritance to create a sub-class based on the supplied baseClass parameter.
|
||||
/// </summary>
|
||||
/// <param name="baseClass" type="Function" locid="14">
|
||||
/// The class to inherit from.
|
||||
/// </param>
|
||||
/// <param name="constructor" type="Function" locid="9">
|
||||
/// A constructor function that will be used to instantiate this class.
|
||||
/// </param>
|
||||
/// <param name="instanceMembers" type="Object" locid="10">
|
||||
/// The set of instance fields, properties and methods to be made available on the class.
|
||||
/// </param>
|
||||
/// <param name="staticMembers" type="Object" locid="11">
|
||||
/// The set of static fields, properties and methods to be made available on the class.
|
||||
/// </param>
|
||||
/// <returns type="Function" locid="12">
|
||||
/// The newly defined class.
|
||||
/// </returns>
|
||||
if (baseClass) {
|
||||
constructor = constructor || function () { };
|
||||
var basePrototype = baseClass.prototype;
|
||||
constructor.prototype = Object.create(basePrototype);
|
||||
Object.defineProperty(constructor.prototype, "_super", { value: basePrototype });
|
||||
Object.defineProperty(constructor.prototype, "constructor", { value: constructor });
|
||||
if (instanceMembers) {
|
||||
initializeProperties(constructor.prototype, instanceMembers);
|
||||
}
|
||||
if (staticMembers) {
|
||||
initializeProperties(constructor, staticMembers);
|
||||
}
|
||||
return constructor;
|
||||
} else {
|
||||
return define(constructor, instanceMembers, staticMembers);
|
||||
}
|
||||
}
|
||||
|
||||
function mix(constructor) {
|
||||
/// <summary locid="15">
|
||||
/// Defines a class using the given constructor and the union of the set of instance members
|
||||
/// specified by all the mixin objects. The mixin parameter list can be of variable length.
|
||||
/// </summary>
|
||||
/// <param name="constructor" locid="9">
|
||||
/// A constructor function that will be used to instantiate this class.
|
||||
/// </param>
|
||||
/// <returns locid="12">
|
||||
/// The newly defined class.
|
||||
/// </returns>
|
||||
constructor = constructor || function () { };
|
||||
var i, len;
|
||||
for (i = 0, len = arguments.length; i < len; i++) {
|
||||
initializeProperties(constructor.prototype, arguments[i]);
|
||||
}
|
||||
return constructor;
|
||||
}
|
||||
|
||||
// Establish members of "WinJS.Class" namespace
|
||||
WinJS.Namespace.define("WinJS.Class", {
|
||||
define: define,
|
||||
derive: derive,
|
||||
mix: mix
|
||||
});
|
||||
|
||||
})(WinJS);
|
||||
|
||||
/*
|
||||
© Microsoft. All rights reserved.
|
||||
|
||||
https://microsoft.com
|
||||
blablahttp://en.wikipedia.org/wiki/Timisoara bla bla
|
||||
blabla http://en.wikipedia.org/wiki/Timisoara bla bla
|
||||
|
||||
This library is supported for use in Windows Tailored Apps only.
|
||||
|
||||
Build: 6.2.8100.0
|
||||
Version: 0.5
|
||||
*/
|
||||
|
||||
var קודמות = "מיותר קודמות צ'ט של, אם לשון העברית שינויים ויש, אם";
|
||||
|
||||
'a string\
|
||||
on multiple lines';
|
||||
(function (global, undefined) {
|
||||
"use strict";
|
||||
undefinedVariable = {}; undefinedVariable.bar = 5;
|
||||
undefinedVariable.foo = 5; undefinedVariable.baz = 10;
|
||||
|
||||
function initializeProperties(target, members) {
|
||||
var keys = Object.keys(members);
|
||||
var properties;
|
||||
var i, len;
|
||||
for (i = 0, len = keys.length; i < len; i++) {
|
||||
var key = keys[i];
|
||||
var enumerable = key.charCodeAt(0) !== /*_*/95;
|
||||
var member = members[key];
|
||||
if (member && typeof member === 'object') {
|
||||
if (member.value !== undefined || typeof member.get === 'function' || typeof member.set === 'function') {
|
||||
if (member.enumerable === undefined) {
|
||||
member.enumerable = enumerable;
|
||||
}
|
||||
properties = properties || {};
|
||||
properties[key] = member;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (!enumerable) {
|
||||
properties = properties || {};
|
||||
properties[key] = { value: member, enumerable: enumerable, configurable: true, writable: true }
|
||||
continue;
|
||||
}
|
||||
target[key] = member;
|
||||
}
|
||||
if (properties) {
|
||||
Object.defineProperties(target, properties);
|
||||
}
|
||||
}
|
||||
|
||||
(function (rootNamespace) {
|
||||
|
||||
// Create the rootNamespace in the global namespace
|
||||
if (!global[rootNamespace]) {
|
||||
global[rootNamespace] = Object.create(Object.prototype);
|
||||
}
|
||||
|
||||
// Cache the rootNamespace we just created in a local variable
|
||||
var _rootNamespace = global[rootNamespace];
|
||||
if (!_rootNamespace.Namespace) {
|
||||
_rootNamespace.Namespace = Object.create(Object.prototype);
|
||||
}
|
||||
|
||||
function defineWithParent(parentNamespace, name, members) {
|
||||
/// <summary locid="1">
|
||||
/// Defines a new namespace with the specified name, under the specified parent namespace.
|
||||
/// </summary>
|
||||
/// <param name="parentNamespace" type="Object" locid="2">
|
||||
/// The parent namespace which will contain the new namespace.
|
||||
/// </param>
|
||||
/// <param name="name" type="String" locid="3">
|
||||
/// Name of the new namespace.
|
||||
/// </param>
|
||||
/// <param name="members" type="Object" locid="4">
|
||||
/// Members in the new namespace.
|
||||
/// </param>
|
||||
/// <returns locid="5">
|
||||
/// The newly defined namespace.
|
||||
/// </returns>
|
||||
var currentNamespace = parentNamespace,
|
||||
namespaceFragments = name.split(".");
|
||||
|
||||
for (var i = 0, len = namespaceFragments.length; i < len; i++) {
|
||||
var namespaceName = namespaceFragments[i];
|
||||
if (!currentNamespace[namespaceName]) {
|
||||
Object.defineProperty(currentNamespace, namespaceName,
|
||||
{ value: {}, writable: false, enumerable: true, configurable: true }
|
||||
);
|
||||
}
|
||||
currentNamespace = currentNamespace[namespaceName];
|
||||
}
|
||||
|
||||
if (members) {
|
||||
initializeProperties(currentNamespace, members);
|
||||
}
|
||||
|
||||
return currentNamespace;
|
||||
};
|
||||
|
||||
function define(name, members) {
|
||||
/// <summary locid="6">
|
||||
/// Defines a new namespace with the specified name.
|
||||
/// </summary>
|
||||
/// <param name="name" type="String" locid="7">
|
||||
/// Name of the namespace. This could be a dot-separated nested name.
|
||||
/// </param>
|
||||
/// <param name="members" type="Object" locid="4">
|
||||
/// Members in the new namespace.
|
||||
/// </param>
|
||||
/// <returns locid="5">
|
||||
/// The newly defined namespace.
|
||||
/// </returns>
|
||||
return defineWithParent(global, name, members);
|
||||
}
|
||||
|
||||
// Establish members of the "WinJS.Namespace" namespace
|
||||
Object.defineProperties(_rootNamespace.Namespace, {
|
||||
|
||||
defineWithParent: { value: defineWithParent, writable: true, enumerable: true },
|
||||
|
||||
define: { value: define, writable: true, enumerable: true }
|
||||
|
||||
});
|
||||
|
||||
})("WinJS");
|
||||
|
||||
(function (WinJS) {
|
||||
|
||||
function define(constructor, instanceMembers, staticMembers) {
|
||||
/// <summary locid="8">
|
||||
/// Defines a class using the given constructor and with the specified instance members.
|
||||
/// </summary>
|
||||
/// <param name="constructor" type="Function" locid="9">
|
||||
/// A constructor function that will be used to instantiate this class.
|
||||
/// </param>
|
||||
/// <param name="instanceMembers" type="Object" locid="10">
|
||||
/// The set of instance fields, properties and methods to be made available on the class.
|
||||
/// </param>
|
||||
/// <param name="staticMembers" type="Object" locid="11">
|
||||
/// The set of static fields, properties and methods to be made available on the class.
|
||||
/// </param>
|
||||
/// <returns type="Function" locid="12">
|
||||
/// The newly defined class.
|
||||
/// </returns>
|
||||
constructor = constructor || function () { };
|
||||
if (instanceMembers) {
|
||||
initializeProperties(constructor.prototype, instanceMembers);
|
||||
}
|
||||
if (staticMembers) {
|
||||
initializeProperties(constructor, staticMembers);
|
||||
}
|
||||
return constructor;
|
||||
}
|
||||
|
||||
function derive(baseClass, constructor, instanceMembers, staticMembers) {
|
||||
/// <summary locid="13">
|
||||
/// Uses prototypal inheritance to create a sub-class based on the supplied baseClass parameter.
|
||||
/// </summary>
|
||||
/// <param name="baseClass" type="Function" locid="14">
|
||||
/// The class to inherit from.
|
||||
/// </param>
|
||||
/// <param name="constructor" type="Function" locid="9">
|
||||
/// A constructor function that will be used to instantiate this class.
|
||||
/// </param>
|
||||
/// <param name="instanceMembers" type="Object" locid="10">
|
||||
/// The set of instance fields, properties and methods to be made available on the class.
|
||||
/// </param>
|
||||
/// <param name="staticMembers" type="Object" locid="11">
|
||||
/// The set of static fields, properties and methods to be made available on the class.
|
||||
/// </param>
|
||||
/// <returns type="Function" locid="12">
|
||||
/// The newly defined class.
|
||||
/// </returns>
|
||||
if (baseClass) {
|
||||
constructor = constructor || function () { };
|
||||
var basePrototype = baseClass.prototype;
|
||||
constructor.prototype = Object.create(basePrototype);
|
||||
Object.defineProperty(constructor.prototype, "_super", { value: basePrototype });
|
||||
Object.defineProperty(constructor.prototype, "constructor", { value: constructor });
|
||||
if (instanceMembers) {
|
||||
initializeProperties(constructor.prototype, instanceMembers);
|
||||
}
|
||||
if (staticMembers) {
|
||||
initializeProperties(constructor, staticMembers);
|
||||
}
|
||||
return constructor;
|
||||
} else {
|
||||
return define(constructor, instanceMembers, staticMembers);
|
||||
}
|
||||
}
|
||||
|
||||
function mix(constructor) {
|
||||
/// <summary locid="15">
|
||||
/// Defines a class using the given constructor and the union of the set of instance members
|
||||
/// specified by all the mixin objects. The mixin parameter list can be of variable length.
|
||||
/// </summary>
|
||||
/// <param name="constructor" locid="9">
|
||||
/// A constructor function that will be used to instantiate this class.
|
||||
/// </param>
|
||||
/// <returns locid="12">
|
||||
/// The newly defined class.
|
||||
/// </returns>
|
||||
constructor = constructor || function () { };
|
||||
var i, len;
|
||||
for (i = 0, len = arguments.length; i < len; i++) {
|
||||
initializeProperties(constructor.prototype, arguments[i]);
|
||||
}
|
||||
return constructor;
|
||||
}
|
||||
|
||||
// Establish members of "WinJS.Class" namespace
|
||||
WinJS.Namespace.define("WinJS.Class", {
|
||||
define: define,
|
||||
derive: derive,
|
||||
mix: mix
|
||||
});
|
||||
|
||||
})(WinJS);
|
||||
|
||||
})(this);
|
||||
@@ -13,7 +13,6 @@
|
||||
></div>
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<script src="../../metadata.js"></script>
|
||||
<script src="dev-setup.js"></script>
|
||||
<script>
|
||||
const container = document.getElementById('container');
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
<body style="transform: scale(0.75)">
|
||||
<div id="editor"></div>
|
||||
|
||||
<script src="../../metadata.js"></script>
|
||||
<script src="dev-setup.js"></script>
|
||||
<script>
|
||||
loadEditor(function () {
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
<button id="logDTS">Log DTS</button>
|
||||
<button id="getAST">Print AST to console</button>
|
||||
|
||||
<script src="../../../metadata.js"></script>
|
||||
<script src="../dev-setup.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
<textarea style="font-family: monospace" id="compilerOpts" cols="60" rows="30"></textarea><br />
|
||||
<button id="updateCompilerSettingsBtn">Update compiler settings</button>
|
||||
|
||||
<script src="../../../metadata.js"></script>
|
||||
<script src="../dev-setup.js"></script>
|
||||
<script>
|
||||
function getDefaultCode() {
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="editor-container" style="position: absolute; width: 500px; height: 400px"></div>
|
||||
<script type="text/javascript" src="out/index.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as monaco from '../../../release/esm/vs/editor/editor.main.js';
|
||||
|
||||
self.MonacoEnvironment = {
|
||||
getWorkerUrl: function (moduleId, label) {
|
||||
if (label === 'json') {
|
||||
return './out/vs/language/json/json.worker.js';
|
||||
}
|
||||
if (label === 'css' || label === 'scss' || label === 'less') {
|
||||
return './out/vs/language/css/css.worker.js';
|
||||
}
|
||||
if (label === 'html' || label === 'handlebars' || label === 'razor') {
|
||||
return './out/vs/language/html/html.worker.js';
|
||||
}
|
||||
if (label === 'typescript' || label === 'javascript') {
|
||||
return './out/vs/language/typescript/ts.worker.js';
|
||||
}
|
||||
return './out/vs/editor/editor.worker.js';
|
||||
}
|
||||
};
|
||||
|
||||
window.monacoAPI = monaco;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user