main files

This commit is contained in:
Noah Pombas
2025-04-28 21:28:33 +02:00
parent 918e8afc3c
commit 0a8c8c960e
15437 changed files with 1829929 additions and 0 deletions

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<Metadata>
<Identity Language="en-US" Id="vscode-sqlite" Version="0.14.1" Publisher="alexcvzz" />
<DisplayName>SQLite</DisplayName>
<Description xml:space="preserve">Explore and query SQLite databases.</Description>
<Tags>keybindings,sqlite,SQLite,SQLite3,__ext_sql,__ext_sql3,db,Database,__ext_db,__ext_db3,__ext_sdb,__ext_s3db,__ext_sqlite,__ext_sqlite3,sql</Tags>
<Categories>Other</Categories>
<GalleryFlags>Public</GalleryFlags>
<Properties>
<Property Id="Microsoft.VisualStudio.Code.Engine" Value="^1.61.0" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionDependencies" Value="" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionPack" Value="" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionKind" Value="workspace" />
<Property Id="Microsoft.VisualStudio.Code.LocalizedLanguages" Value="" />
<Property Id="Microsoft.VisualStudio.Services.Links.Source" Value="https://github.com/AlexCovizzi/vscode-sqlite.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.Getstarted" Value="https://github.com/AlexCovizzi/vscode-sqlite.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.GitHub" Value="https://github.com/AlexCovizzi/vscode-sqlite.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.Support" Value="https://github.com/AlexCovizzi/vscode-sqlite/issues" />
<Property Id="Microsoft.VisualStudio.Services.Links.Learn" Value="https://github.com/AlexCovizzi/vscode-sqlite#readme" />
<Property Id="Microsoft.VisualStudio.Services.GitHubFlavoredMarkdown" Value="true" />
</Properties>
<License>extension/LICENSE.txt</License>
<Icon>extension/resources/icon/icon_128x128.png</Icon>
</Metadata>
<Installation>
<InstallationTarget Id="Microsoft.VisualStudio.Code"/>
</Installation>
<Dependencies/>
<Assets>
<Asset Type="Microsoft.VisualStudio.Code.Manifest" Path="extension/package.json" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Content.Details" Path="extension/README.md" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Content.Changelog" Path="extension/CHANGELOG.md" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Content.License" Path="extension/LICENSE.txt" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Icons.Default" Path="extension/resources/icon/icon_128x128.png" Addressable="true" />
</Assets>
</PackageManifest>

View File

@@ -0,0 +1,360 @@
# Change Log
## 0.14.1 (04 Jun 2022)
Fixed
1. Fixed bug in the SQL parser that caused queries with `CREATE TRIGGER` to be parsed incorrectely ([#211](https://github.com/AlexCovizzi/vscode-sqlite/issues/211))
## 0.14.0 (06 Nov 2021)
Added
1. Added support for the new `PRAGMA` command `table_xinfo` ([mandel59](https://github.com/mandel59) \[[PR#193](https://github.com/AlexCovizzi/vscode-sqlite/pull/193)\])
2. Added new keywords to support newer SQLite versions ([mandel59](https://github.com/mandel59) \[[PR#191](https://github.com/AlexCovizzi/vscode-sqlite/pull/191)\])
Fixed
1. Fix bug that caused the table view to not be shown on the new VSCode version (1.61) ([mandel59](https://github.com/mandel59) \[[PR#197](https://github.com/AlexCovizzi/vscode-sqlite/pull/197)\])
Changed
1. Increased minimum supported VSCode version to 1.61.0 ([mandel59](https://github.com/mandel59) \[[PR#197](https://github.com/AlexCovizzi/vscode-sqlite/pull/197)\])
## 0.13.0 (13 Jun 2021)
Added
1. New setting `"sqlite.databaseExtensions"`, that allows running custom queries whenever a database is opened.
2. Added support for dot commands (like `.tables`, `.schema` ecc).
Fixed
1. Fix bug when running a query with a comment inside ([#167](https://github.com/AlexCovizzi/vscode-sqlite/issues/167))
## 0.12.0 (12 Apr 2021)
Changed
1. Disable `sqlite.sqlite3` setting for untrusted workspaces.
Added
1. Command `SQLite: Change Workspace Trust` to change the trust of the current workspace.
## 0.11.1 (31 Jan 2021)
Changed
1. The icon used on the sidebar view has been changed to the database icon ([MrCodingB](https://github.com/MrCodingB) \[[PR#153](https://github.com/AlexCovizzi/vscode-sqlite/pull/153)\])
2. The database picker now uses the relative path of the database instead of the name ([#117](https://github.com/AlexCovizzi/vscode-sqlite/issues/117))
Other
1. Improved error messages ([#143](https://github.com/AlexCovizzi/vscode-sqlite/issues/143))
## 0.10.1 (29 Nov 2020)
Fixed
1. Fixed table and column name escaping when creating queries ([mandel59](https://github.com/mandel59) \[[PR#138](https://github.com/AlexCovizzi/vscode-sqlite/pull/138)\])
## 0.10.0 (21 Nov 2020)
Fixed
1. The SQLite binaries provided with the extension are now executable ([#135](https://github.com/AlexCovizzi/vscode-sqlite/issues/135))
Added
1. The total number of records is now displayed in the result view header. ([#131](https://github.com/AlexCovizzi/vscode-sqlite/issues/131))
Changed
1. Changed font style of the result view to be the same as the editor font style.
## 0.9.0 (22 Aug 2020)
Fixed
1. Fixed bug that caused result view to not be displayed after opening it one time ([#120](https://github.com/AlexCovizzi/vscode-sqlite/issues/120), [#125](https://github.com/AlexCovizzi/vscode-sqlite/issues/125), [#127](https://github.com/AlexCovizzi/vscode-sqlite/issues/127))
Changed
1. In the result view, the sql statement is now hidden by default and can be displayed by clicking the **SQL** button
2. In the result view, the page section has been moved from below the table to the header above the table.
Other
1. Decreased extension size, removed useless files and sources are now bundled.
2. Changed result view frontend framework from preact to React.
3. Removed clipboardy dependency in favour of VSCode clipboard.
4. Increase minimum VSCode version from 1.23 to 1.30
## 0.8.2 (09 May 2020)
Fixed
1. Fixed bug that sometimes caused result view to not be displayed in a remote session ([#94](https://github.com/AlexCovizzi/vscode-sqlite/issues/94))
2. Fixed bug in the SELECT/INSERT sql generation for columns with spaces in the name ([#97](https://github.com/AlexCovizzi/vscode-sqlite/issues/97))
3. Fixed bug that prevented database with single quotes in the path to be opened correctly ([#106](https://github.com/AlexCovizzi/vscode-sqlite/issues/106))
Changed
1. Whenever an error is encountered retrieving a table or a view when opening a database, a warning is displayed in the SQLite output channel (previously the database failed to open completely) ([#99](https://github.com/AlexCovizzi/vscode-sqlite/issues/99))
## 0.8.1 (10 Dec 2019)
Fixed
1. Fixed bug that caused empty strings in the query to be parsed incorrectly ([#82](https://github.com/AlexCovizzi/vscode-sqlite/issues/82)).
## 0.8.0 (24 Jul 2019)
Added
1. Added command `Run Selected Query` to run only the query selected in the document.
Changed
1. The command `Run Query` now runs every query in the document (previously if there was a query selected it ran that query)
## 0.7.1 (20 Jun 2019)
Fixed
1. Fixed bug that caused SQLite binaries with version not supported to not throw an error when used.
2. Fixed bug that caused, in some OSs, SQLite binaries to not work as expected.
## 0.7.0 (6 Jun 2019)
Added
1. Added setting `"sqlite.databaseExtensions"`, to customize file extensions recognized as SQLite database.
Changed
1. Autocompletion now suggests only the name of the column (instead of `[table].[column]`)
2. The statement in the result panel is now collapsed in a single line and can be expanded clicking on it.
## 0.6.0 (13 Mar 2019)
Added
1. Added option in the sqlite explorer to copy database path.
2. Added option in the sqlite explorer to copy table/column name.
3. Added option in the sqlite explorer to create a new table query (Select/Insert).
4. Added option in the files explorer to create a new database query.
5. Added command in the command palette to refresh sqlite explorer databases.
6. Added support for `EXPLAIN QUERY PLAN`.
Fixed
1. Log level is now changed correctly.
2. Fixed bug that caused the last line of the result table to disappear after hiding and then showing the result table.
3. Fixed bug that prevented empty tables from showing in the sqlite explorer ([#63](https://github.com/AlexCovizzi/vscode-sqlite/issues/63))
Changed
1. Changed view table icon.
2. New lines are now rendered in the result table.
Other
1. Improved query performance.
2. Improved query logging.
## 0.5.3 (1 Mar 2019)
Fixed
1. Fixed bug that caused table field with HTML code to be rendered. ([#59](https://github.com/AlexCovizzi/vscode-sqlite/issues/59))
## 0.5.1 (20 Feb 2019)
Fixed
1. Fixed bug that caused intellisense to not work on `New Query` document ([#55](https://github.com/AlexCovizzi/vscode-sqlite/issues/55))
## 0.5.0 (3 Feb 2019)
Added
1. Added language `sqlite` (thanks to [mandel59](https://github.com/mandel59)).
Fixed
1. Fixed bug on Windows that prevented the result view from being show when the extension was not on the same disk as Visual Studio Code (thanks to [mandel59](https://github.com/mandel59))
2. Fixed bug on Windows that replaced unicode characters in the database path and in the query with question marks (thanks to [mandel59](https://github.com/mandel59))
3. Fixed bug that sometimes prevented the last line of the table in the result view from being shown.
4. The result view is now kept open when there is an error in the query.
5. Removed system tables (`sqlite_sequence` and `sqlite_stat1`) from the sqlite explorer.
6. Removed `:memory:` from the databases you can choose when adding a database to the explorer.
## 0.4.0 (18 Jan 2019)
Added
1. The sqlite explorer now supports views.
2. Added icons to distinguish between tables and views in the explorer.
3. Added support for :memory: database.
## 0.3.3 (24 Dec 2018)
Fixed
1. Fixed bug that prevented custom sqlite paths from being recognized as a command on Windows.
2. Fixed bug that sometimes truncated the error message.
Added
1. Added command: `SQLite: Show output`, to show the extension's output channel.
Other
1. Updated SQLite3 binaries to the version 3.26.0
## 0.3.2 (24 Nov 2018)
Fixed
1. Fixed bug that prevented the extension from recognizing executable paths set in the setting `sqlite.sqlite3`.
## 0.3.1 (5 Sep 2018)
Added
1. Added autocompletion for sqlite keywords, table names, column names.
2. Added `.db3`, `.sdb`, `.s3db` as recognized extensions for an sqlite3 database (thanks to [LokiSharp](https://github.com/LokiSharp))
3. Added support for binary data, now displayed as hex string
Fixed
1. Fixed bug that prevented the correct execution of queries on tables with the same name as sqlite keywords (e.g Order, Select, Table...)
## 0.3.0 (2 Sep 2018)
Added
1. Export result to `html`.
2. Export multiple results to `csv`, `html` or `json`.
3. Added option to open/use a database outside your workspace.
4. Keyboard shortcut `ctrl+shift+q` to execute document query
Removed
1. Setting: `sqlite.outputBuffer`.
2. Setting: `sqlite.autopick`, the option to choose a database outside the workspace removed the usefulness of autopick.
Fixed
1. Fixed an issue that prevented the correct execution of a query in multiple lines and without an ending semicolon.
Other
1. Improved performance and responsiveness.
## 0.2.3 (12 Jul 2018)
Added
1. Setting: `sqlite.outputBuffer`, query output buffer in bytes.
## 0.2.2 (12 Jul 2018)
Added
1. Pagination, tables are now displayed in pages, each page with a set number of records.
2. Setting: `sqlite.recordsPerPage`, to set the number of records per page.
Removed
1. Setting: `sqlite.showTableLimit`, now that pagination is supported this setting is useless.
Fixed
1. Fixed a bug that prevented the export button from working correctely.
2. Fixed a bug that prevented the correct execution on Windows of queries composed of multiple statements.
## 0.2.1 (11 Jul 2018)
Fixed
1. Fixed bug that prevented the query result from showing on Windows.
## 0.2.0 (11 Jul 2018)
Added
1. Export query result to Json.
2. Export query result to Csv.
3. Show/Hide query result.
Changed
1. Improved query result graphic.
Fixed
1. Explorer: Show Table can now display more records.
## 0.1.2 (5 Jul 2018)
Fixed
1. Fixed bug that prevented the database from showing in the explorer if it was previously closed.
## 0.1.1 (5 Jul 2018)
Added
1. New setting: `sqlite3.logLevel`, to set the logging level of the output channel.
2. New setting: `sqlite3.showTableLimit`, to limit the records displayed when showing a table using Show Table (in SQLite Explorer).
Changed
1. `sql` document database can now be changed from the status bar.
2. SQLite output channel now displays time and log level.
## 0.1.0 (29 Jun 2018)
Added
1. Added new command: Quick Query, execute a query directly without creating a new sql document.
2. Tables in the explorer are now ordered alphabetically.
3. Explorer: new icons for primary key, not null and nullable fields.
4. Explorer: added default value in the columns' tooltip when default value is not NULL
Fixed
1. Composite primary keys are now all recognized as primary keys.
2. Comments inside a comment in an sql document are now parsed correctely.
## 0.0.4 (26 Jun 2018)
Fixed
1. unicode characters are now shown correctely
## 0.0.3 (26 Jun 2018)
Fixed
1. fixed a bug that prevented the correct parsing of the query result when it contained an escaped quote
2. fixed a bug that crashed the extension when the query result contained a unicode character inside the string
Other
1. improved quality of the icon
## 0.0.2 (25 Jun 2018)
Fixed
1. fixed a bug that showed unicode characters as octets.
## 0.0.1 (23 Jun 2018)
Initial release

View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -0,0 +1,73 @@
# vscode-sqlite
VSCode extension to explore and query SQLite databases.
![static/sqlite_workflow_1](https://raw.githubusercontent.com/AlexCovizzi/vscode-sqlite/master/static/sqlite_workflow_1.gif "SQLite Workflow")
## Requirements
**Windows**, **MacOS**: No requirement.
**Linux**: If the extension is not working out-of-the-box, it may be necessary to install sqlite3 in your system (on Ubuntu: `sudo apt install sqlite3`)
**Note**: The extension includes precompiled binaries for the SQLite CLI (used to execute queries), in case the included binaries do not work (or if you want to use your own binaries) you need to provide the path/command to the sqlite3 CLI executable in the setting `sqlite.sqlite3`.
## Features
* **Query** SQLite databases and view results in a table (also supports dot commands like `.tables`, `.schema`, ecc).
* **Export** query results to `json`, `csv` and `html`.
* **Sidebar explorer**: list databases, tables, views and columns.
* **Autocompletion** for SQLite keywords, table and views names, column names (autocompletion is available for an SQL document once its bound to a database, to bind an sql document to a database use the command `SQLite: Use Database`)
* **Grammar** support for SQLite keywords. This is available for documents with language `sqlite`. You can mark a document as an `sqlite` document adding `-- sqlite` in the first line.
## Commands
* **SQLite: New Query** &nbsp; Create a new untitled `sqlite` file.
* **SQLite: Run Query** &nbsp; Execute query script in the editor.
* **SQLite: Quick Query** &nbsp; Choose a database and execute a query without creating a new document.
* **SQLite: Use Database** &nbsp; Bind current `sql` document to the selected database.
* **SQLite: Open Database** &nbsp; Open the selected database in the sqlite explorer.
* **SQLite: Close Database** &nbsp; Remove the selected database from the sqlite explorer.
* **SQLite: Refresh Databases** &nbsp; Refresh databases open in the sqlite explorer.
* **SQLite: Show output** &nbsp; Show the extension's output channel.
* **SQLite: Change Workspace Trust** &nbsp; Change the trust of this workspace. By default every workspace is untrusted for security reasons.
## Settings
* `"sqlite.sqlite3": string` &nbsp; sqlite3 command or CLI executable path (this setting is disabled for untrusted workspaces)
* `"sqlite.logLevel": string` &nbsp; Set output channel log level (DEBUG, INFO, WARN, ERROR).
* `"sqlite.recordsPerPage": number` &nbsp; Number of records to show per page. (-1 to show all records).
* `"sqlite.databaseExtensions": string[]` &nbsp; The file extensions recognized as SQLite database.
* `"sqlite.setupDatabase": { [path]: { sql: string[] } }` &nbsp; Custom query to run when opening a database.
In each entry the key is the path of the database and the value is an object with the SQL queries to run (in order).
For example:
```{ "./users.db": { "sql": ["PRAGMA foreign_keys = ON;"] } }```
Means that every time the database `users.db` is opened, the SQL query `PRAGMA foreign_keys = ON;` is executed.
## Thanks to the [Contributors](https://github.com/AlexCovizzi/vscode-sqlite/graphs/contributors)!
[mandel59 (Ryusei YAMAGUCHI)](https://github.com/mandel59), [LokiSharp (LokiSharp)](https://github.com/LokiSharp), [MrCodingB(MrCodingB)](https://github.com/MrCodingB)

View File

@@ -0,0 +1,5 @@
# Security Policy
## Reporting a Vulnerability
To report a security issue, please email alexcovizzi+github@gmail.com

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,6 @@
{
"comments": {
"lineComment": "--",
"blockComment": ["/*", "*/"]
}
}

View File

@@ -0,0 +1,472 @@
{
"name": "vscode-sqlite",
"icon": "resources/icon/icon_128x128.png",
"displayName": "SQLite",
"description": "Explore and query SQLite databases.",
"version": "0.14.1",
"publisher": "alexcvzz",
"repository": {
"url": "https://github.com/AlexCovizzi/vscode-sqlite",
"type": "git"
},
"engines": {
"vscode": "^1.61.0"
},
"categories": [
"Other"
],
"activationEvents": [
"onLanguage:sql",
"onLanguage:sqlite",
"onLanguage:db",
"onCommand:sqlite.showOutputChannel",
"onCommand:sqlite.explorer.add",
"onCommand:sqlite.explorer.remove",
"onCommand:sqlite.newQuery",
"onCommand:sqlite.quickQuery",
"onCommand:sqlite.useDatabase",
"onCommand:sqlite.runDocumentQuery"
],
"main": "./dist/extension",
"contributes": {
"commands": [
{
"command": "sqlite.changeWorkspaceTrust",
"title": "Change Workspace Trust",
"category": "SQLite"
},
{
"command": "sqlite.showOutputChannel",
"title": "Show Output",
"category": "SQLite"
},
{
"command": "sqlite.explorer.add",
"title": "Open Database",
"category": "SQLite"
},
{
"command": "sqlite.explorer.remove",
"title": "Close Database",
"category": "SQLite"
},
{
"command": "sqlite.explorer.refresh",
"title": "Refresh Databases",
"category": "SQLite",
"icon": {
"light": "resources/light/refresh.svg",
"dark": "resources/dark/refresh.svg"
}
},
{
"command": "sqlite.explorer.copyName",
"title": "Copy Name",
"category": "SQLite"
},
{
"command": "sqlite.explorer.copyPath",
"title": "Copy Path",
"category": "SQLite"
},
{
"command": "sqlite.explorer.copyRelativePath",
"title": "Copy Relative Path",
"category": "SQLite"
},
{
"command": "sqlite.useDatabase",
"title": "Use Database",
"category": "SQLite"
},
{
"command": "sqlite.newQuery",
"title": "New Query",
"category": "SQLite",
"icon": {
"light": "resources/light/newquery.svg",
"dark": "resources/dark/newquery.svg"
}
},
{
"command": "sqlite.newQuerySelect",
"title": "New Query [Select]",
"category": "SQLite",
"icon": {
"light": "resources/light/newquery.svg",
"dark": "resources/dark/newquery.svg"
}
},
{
"command": "sqlite.newQueryInsert",
"title": "New Query [Insert]",
"category": "SQLite"
},
{
"command": "sqlite.quickQuery",
"title": "Quick Query",
"category": "SQLite"
},
{
"command": "sqlite.runDocumentQuery",
"title": "Run Query",
"category": "SQLite"
},
{
"command": "sqlite.runSelectedQuery",
"title": "Run Selected Query",
"category": "SQLite"
},
{
"command": "sqlite.runTableQuery",
"title": "Show Table",
"category": "SQLite",
"icon": {
"light": "resources/light/runquery.svg",
"dark": "resources/dark/runquery.svg"
}
},
{
"command": "sqlite.runSqliteMasterQuery",
"title": "Show Table 'sqlite_master'",
"category": "SQLite",
"icon": {
"light": "resources/light/runquery.svg",
"dark": "resources/dark/runquery.svg"
}
}
],
"keybindings": [
{
"command": "sqlite.runDocumentQuery",
"key": "ctrl+shift+q",
"mac": "cmd+shift+q",
"when": "editorLangId =~ /(sql|sqlite)/"
}
],
"views": {
"explorer": [
{
"id": "sqlite.explorer",
"name": "SQLite Explorer",
"when": "sqlite.explorer.show",
"icon": "resources/dark/database.svg"
}
]
},
"menus": {
"commandPalette": [
{
"command": "sqlite.showOutputChannel",
"group": "sqlite"
},
{
"command": "sqlite.explorer.add",
"group": "sqlite"
},
{
"command": "sqlite.explorer.remove",
"group": "sqlite",
"when": "sqlite.explorer.show"
},
{
"command": "sqlite.explorer.refresh",
"group": "sqlite",
"when": "sqlite.explorer.show"
},
{
"command": "sqlite.newQuery",
"group": "sqlite"
},
{
"command": "sqlite.quickQuery",
"group": "sqlite"
},
{
"command": "sqlite.runDocumentQuery",
"when": "editorLangId =~ /(sql|sqlite)/",
"group": "sqlite"
},
{
"command": "sqlite.runSelectedQuery",
"when": "editorLangId =~ /(sql|sqlite)/",
"group": "sqlite"
},
{
"command": "sqlite.useDatabase",
"when": "editorLangId =~ /(sql|sqlite)/",
"group": "sqlite"
},
{
"command": "sqlite.runSqliteMasterQuery",
"when": "false"
},
{
"command": "sqlite.runTableQuery",
"when": "false"
},
{
"command": "sqlite.explorer.copyName",
"group": "sqlite",
"when": "false"
},
{
"command": "sqlite.explorer.copyPath",
"group": "sqlite",
"when": "false"
},
{
"command": "sqlite.explorer.copyRelativePath",
"group": "sqlite",
"when": "false"
},
{
"command": "sqlite.newQuerySelect",
"group": "sqlite",
"when": "false"
},
{
"command": "sqlite.newQueryInsert",
"group": "sqlite",
"when": "false"
}
],
"explorer/context": [
{
"command": "sqlite.explorer.add",
"when": "resourceLangId == db && !explorerResourceIsFolder",
"group": "navigation@1"
},
{
"command": "sqlite.newQuery",
"when": "resourceLangId == db",
"group": "0_sqlite@1"
}
],
"editor/context": [
{
"when": "editorTextFocus && editorLangId =~ /(sql|sqlite)/",
"command": "sqlite.runDocumentQuery",
"group": "9.1_sqlite@1"
},
{
"when": "editorTextFocus && editorLangId =~ /(sql|sqlite)/",
"command": "sqlite.runSelectedQuery",
"group": "9.1_sqlite@2"
},
{
"when": "editorTextFocus && editorLangId =~ /(sql|sqlite)/",
"command": "sqlite.useDatabase",
"group": "9.1_sqlite@3"
}
],
"view/title": [
{
"command": "sqlite.newQuery",
"when": "view == sqlite.explorer",
"group": "navigation@1"
},
{
"command": "sqlite.explorer.refresh",
"when": "view == sqlite.explorer",
"group": "navigation@2"
}
],
"view/item/context": [
{
"command": "sqlite.newQuery",
"when": "view == sqlite.explorer && viewItem == sqlite.databaseItem",
"group": "inline@1"
},
{
"command": "sqlite.runSqliteMasterQuery",
"when": "view == sqlite.explorer && viewItem == sqlite.databaseItem",
"group": "1_query@1"
},
{
"command": "sqlite.newQuery",
"when": "view == sqlite.explorer && viewItem == sqlite.databaseItem",
"group": "2_sql@1"
},
{
"command": "sqlite.explorer.copyPath",
"when": "view == sqlite.explorer && viewItem == sqlite.databaseItem",
"group": "3_copy@1"
},
{
"command": "sqlite.explorer.copyRelativePath",
"when": "view == sqlite.explorer && viewItem == sqlite.databaseItem",
"group": "3_copy@2"
},
{
"command": "sqlite.explorer.remove",
"when": "view == sqlite.explorer && viewItem == sqlite.databaseItem",
"group": "4_utils@1"
},
{
"command": "sqlite.runTableQuery",
"when": "view == sqlite.explorer && viewItem == sqlite.tableItem",
"group": "inline@1"
},
{
"command": "sqlite.runTableQuery",
"when": "view == sqlite.explorer && viewItem == sqlite.tableItem",
"group": "1_query@1"
},
{
"command": "sqlite.newQuerySelect",
"when": "view == sqlite.explorer && viewItem == sqlite.tableItem",
"group": "2_sql@1"
},
{
"command": "sqlite.newQueryInsert",
"when": "view == sqlite.explorer && viewItem == sqlite.tableItem",
"group": "2_sql@2"
},
{
"command": "sqlite.explorer.copyName",
"when": "view == sqlite.explorer && viewItem == sqlite.tableItem",
"group": "3_copy@1"
},
{
"command": "sqlite.explorer.copyName",
"when": "view == sqlite.explorer && viewItem == sqlite.columnItem",
"group": "3_copy@1"
}
]
},
"languages": [
{
"id": "sqlite",
"aliases": [
"SQLite",
"SQLite3"
],
"firstLine": "\\s*--\\s*(sql|SQL)ite",
"extensions": [
".sql",
".sql3"
],
"configuration": "./language-configuration.json"
},
{
"id": "db",
"aliases": [
"Database"
],
"extensions": [
".db",
".db3",
".sdb",
".s3db",
".sqlite",
".sqlite3"
]
}
],
"grammars": [
{
"language": "sqlite",
"scopeName": "source.sql.sqlite",
"path": "./syntaxes/sqlite.tmLanguage.json"
}
],
"configuration": {
"type": "object",
"title": "SQLite Configuration",
"properties": {
"sqlite.sqlite3": {
"type": "string",
"default": "sqlite3",
"description": "SQLite3 command or executable path."
},
"sqlite.logLevel": {
"type": "string",
"enum": [
"DEBUG",
"INFO",
"WARN",
"ERROR"
],
"default": "INFO",
"description": "Logging level in the output channel (DEBUG, INFO, WARN, ERROR)"
},
"sqlite.recordsPerPage": {
"type": "number",
"default": 50,
"minimum": -1,
"description": "Number of records to show per page. (-1 to show all records)"
},
"sqlite.databaseExtensions": {
"type": "array",
"items": {
"type": "string"
},
"default": [
"db",
"db3",
"sdb",
"s3db",
"sqlite",
"sqlite3"
],
"description": "The file extensions recognized as SQLite database."
},
"sqlite.setupDatabase": {
"type": "object",
"patternProperties": {
".*": {
"type": "object",
"properties": {
"sql": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"default": {},
"description": "SQL query to execute every time a database is opened."
}
}
}
},
"scripts": {
"vscode:prepublish": "webpack --mode production && npm run prepublish-html",
"compile": "webpack --mode development",
"watch": "webpack --mode development --watch",
"test": "jest --silent --config jest.config.js",
"install-html": "cd ./src/resultview/html && npm install",
"prepublish-html": "cd ./src/resultview/html && npm run prepublish",
"build-html": "cd ./src/resultview/html && npm run build",
"test-html": "cd ./src/resultview/html && npm run test",
"watch-html": "cd ./src/resultview/html && npm run watch",
"package": "vsce package"
},
"devDependencies": {
"@types/jest": "^26.0.0",
"@types/node": "^7.10.14",
"@types/sqlite3": "^3.1.7",
"@types/vscode": "^1.61.0",
"jest": "^26.0.0",
"sqlite3": "^4.2.0",
"ts-jest": "^26.0.0",
"ts-loader": "^7.0.5",
"tslint": "^6.1.3",
"typescript": "^3.9.9",
"vsce": "^1.93.0",
"webpack": "^4.46.0",
"webpack-cli": "^3.3.12"
},
"dependencies": {
"csv-parser": "~2.3.5",
"csv-stringify": "~5.6.2"
},
"__metadata": {
"installedTimestamp": 1744117629300,
"targetPlatform": "undefined",
"size": 5404349
}
}

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="column.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="715"
id="namedview6"
showgrid="false"
inkscape:zoom="16"
inkscape:cx="7.6738321"
inkscape:cy="6.7454004"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<rect
x="8.3240614"
y="-4.4821873"
width="6.4031243"
height="6.4031243"
transform="matrix(0.62469504,0.78086882,-0.62469504,0.78086882,0,0)"
id="rect4"
style="fill:#c5c5c5" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="col_nullable.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="715"
id="namedview6"
showgrid="false"
inkscape:zoom="33.1875"
inkscape:cx="8"
inkscape:cy="8"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<rect
x="8.9107676"
y="-3.8862312"
width="5.2417922"
height="5.2417922"
transform="matrix(0.62644467,0.77946589,-0.62644467,0.77946589,0,0)"
id="rect4"
style="fill:none;stroke:#c5c5c5;stroke-width:1.16996598;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
class="octicon octicon-key"
viewBox="0 0 0.875 1"
version="1.1"
aria-hidden="true"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="col_pk.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="715"
id="namedview6"
showgrid="false"
inkscape:zoom="14.75"
inkscape:cx="10.20339"
inkscape:cy="8.4856653"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
d="m 0.72379508,0.24375027 c -0.0368304,-0.0360581 -0.0829911,-0.0548073 -0.13897319,-0.0562504 -0.0554911,0.001445 -0.10214287,0.0201922 -0.13897322,0.0562504 -0.0368304,0.0360581 -0.0554911,0.0812502 -0.0569643,0.13605759 0,0.0144231 0.001473,0.0283653 0.004419,0.0427884 L 0.09375,0.7163462 l 0,0.0480769 0.04910715,0.0480769 0.0982143,0 0.0491071,-0.0480769 0,-0.0480769 0.0491072,0 0,-0.048077 0.0491071,0 0,-0.0480769 0.0982143,0 0.0535267,-0.0533654 c 0.0147321,0.003846 0.0289733,0.005288 0.0446875,0.005288 0.0559821,-0.001442 0.10214282,-0.0201923 0.13897318,-0.05625 C 0.760625,0.47980745 0.77977673,0.43461527 0.78125,0.37980756 0.77977692,0.32499992 0.760625,0.27980766 0.72379461,0.24374996 Z m -0.0898661,0.1543268 c -0.0378125,0 -0.0677679,-0.0293269 -0.0677679,-0.0663461 0,-0.0370192 0.0299554,-0.0663464 0.0677679,-0.0663464 0.0378125,0 0.0677677,0.0293273 0.0677677,0.0663464 0,0.0370192 -0.0299554,0.0663461 -0.0677677,0.0663461 z"
id="path4"
style="fill:#c5c5c5;fill-opacity:1;fill-rule:evenodd"
inkscape:connector-curvature="0" />
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,2 @@
<!-- https://github.com/Microsoft/vscode-mssql/blob/master/src/views/htmlcontent/src/images/ResultToCSV_16x_vscode_inverse.svg -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-bg{fill:#c5c5c5}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M14 4.552V13c-.028.825-.593 2-2.035 2h-8C3.012 15 2 14.299 2 13V8H.586l2-2H0V2h2.586l-2-2h4.828l1 1h3.608L14 4.552z" id="outline" style="display: none;"/><path class="icon-vs-fg" d="M9 3.586L8.414 3H9v.586zM12 6h-2v7h2V6zm-6 7V7.414L5.414 8H4v5h2zm1 0h2V4.414l-1 1V6h-.586L7 6.414V13z" id="iconFg" style="display: none;"/><path class="icon-vs-bg" d="M8 5.414V6h-.586L8 5.414zM13 5v8s-.035 1-1.035 1h-8S3 14 3 13V8h1v5h2V7.414l1-1V13h2V4.414L9.414 4 9 3.586V3h-.586l-1-1h2.227L13 5zm-1 1h-2v7h2V6z" id="iconBg"/><path class="icon-vs-action-blue" d="M8 4L5 7H3l2-2H1V3h4L3 1h2l3 3z" id="colorAction"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0" y="0" viewBox="0 0 24 24" xml:space="preserve">
<path fill="#C5C5C5" d="M12,3C7.58,3 4,4.79 4,7C4,9.21 7.58,11 12,11C16.42,11 20,9.21 20,7C20,4.79 16.42,3 12,3M4,9V12C4,14.21 7.58,16 12,16C16.42,16 20,14.21 20,12V9C20,11.21 16.42,13 12,13C7.58,13 4,11.21 4,9M4,14V17C4,19.21 7.58,21 12,21C16.42,21 20,19.21 20,17V14C20,16.21 16.42,18 12,18C7.58,18 4,16.21 4,14Z" /></svg>

After

Width:  |  Height:  |  Size: 515 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-eye" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">
<path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z" fill="#C5C5C5">
</path>
</svg>

After

Width:  |  Height:  |  Size: 421 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 16 16"><g transform="matrix(4.1791045,0,0,4.3076924,-0.04477611,-0.07692331)"><path d="M 1.3627119,2.0050847 1,2.4 1.6,3.1 1.4,3.5 0.4,2.4 0.76440678,2.0033898 Z M 2.6,1.3 3.6,2.4 2.6,3.5 2.4,3.1 3,2.4 2.4,1.7 Z" style="fill:#c5c5c5;fill-opacity:1" /><path d="M 2,1 1.25,1.75 h -0.5 l 0.5,-0.5 h -1 V 0.75000004 h 1 l -0.5,-0.5 h 0.5 z" style="fill:#75beff;fill-opacity:1;" /></g></svg>

After

Width:  |  Height:  |  Size: 453 B

View File

@@ -0,0 +1,2 @@
<!-- https://github.com/Microsoft/vscode-mssql/blob/master/src/views/htmlcontent/src/images/ResultToJSON_16x_vscode_inverse.svg -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-bg{fill:#c5c5c5}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 8.38v2.258s-.992-.001-.997-.003c-.012.052-.003.14-.003.281v1.579c0 1.271-.37 2.185-1.054 2.746-.638.522-1.576.759-2.822.759H10v-3.247s1.014-.001 1.037-.003c.004-.046-.037-.117-.037-.214V11.08c0-.943.222-1.606.539-2.072C11.223 8.527 11 7.843 11 6.869V5.468c0-.087.102-.286.094-.325-.02-.002.063-.143.03-.143H10V2h1.124c1.251 0 2.193.265 2.832.81C14.633 3.387 15 4.3 15 5.522V7h.919L16 8.38zM9.414 4l-4-4H.586l2 2H0v4h2v.586L1.586 7H1v.586L.586 8H1v1.638L1.329 11H2v1.536c0 1.247.495 2.149 1.19 2.711.641.517 1.697.753 2.937.753H7v-3.247s-1.011-.001-1.033-.003c-.008-.053.033-.127.033-.228v-1.401c0-.962-.224-1.637-.542-2.111.256-.378.444-.89.511-1.564L9.414 4z" id="outline" style="display: none;"/><path class="icon-vs-bg" d="M15 8.38v1.258c-.697 0-1.046.426-1.046 1.278v1.579c0 .961-.223 1.625-.666 1.989-.445.364-1.166.547-2.164.547v-1.278c.383 0 .661-.092.834-.277s.26-.498.26-.94V11.08c0-1.089.349-1.771 1.046-2.044v-.027c-.697-.287-1.046-1-1.046-2.14V5.468c0-.793-.364-1.189-1.094-1.189V3c.993 0 1.714.19 2.16.571s.67 1.031.67 1.952v1.565c0 .861.349 1.292 1.046 1.292zm-9.967 4.142v-1.401c0-1.117-.351-1.816-1.053-2.099v-.027c.429-.175.71-.519.877-.995H3.049c-.173.247-.436.38-.805.38v1.258c.692 0 1.039.419 1.039 1.258v1.641c0 .934.226 1.584.677 1.948s1.174.547 2.167.547v-1.278c-.388 0-.666-.093-.838-.28-.17-.188-.256-.505-.256-.952z" id="iconBg"/><path class="icon-vs-action-blue" d="M8 4L5 7H3l2-2H1V3h4L3 1h2l3 3z" id="colorAction"/></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16'>
<path fill='#C5C5C5' d='M12 3H8v1h3v3h3v7H6V8H5v7h10V6z' />
<path fill='#89D185' d='M7 3.018H5V1H3.019v2.018H1V5h2.019v2H5V5h2V3.018z'/>
</svg>

After

Width:  |  Height:  |  Size: 255 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
<path d="M13.451 5.609l-.579-.939-1.068.812-.076.094c-.335.415-.927 1.341-1.124 2.876l-.021.165.033.163.071.345c0 1.654-1.346 3-3 3-.795 0-1.545-.311-2.107-.868-.563-.567-.873-1.317-.873-2.111 0-1.431 1.007-2.632 2.351-2.929v2.926s2.528-2.087 2.984-2.461h.012l3.061-2.582-4.919-4.1h-1.137v2.404c-3.429.318-6.121 3.211-6.121 6.721 0 1.809.707 3.508 1.986 4.782 1.277 1.282 2.976 1.988 4.784 1.988 3.722 0 6.75-3.028 6.75-6.75 0-1.245-.349-2.468-1.007-3.536z" fill="#2D2D30"/>
<path d="M12.6 6.134l-.094.071c-.269.333-.746 1.096-.91 2.375.057.277.092.495.092.545 0 2.206-1.794 4-4 4-1.098 0-2.093-.445-2.817-1.164-.718-.724-1.163-1.718-1.163-2.815 0-2.206 1.794-4 4-4l.351.025v1.85s1.626-1.342 1.631-1.339l1.869-1.577-3.5-2.917v2.218l-.371-.03c-3.176 0-5.75 2.574-5.75 5.75 0 1.593.648 3.034 1.695 4.076 1.042 1.046 2.482 1.694 4.076 1.694 3.176 0 5.75-2.574 5.75-5.75-.001-1.106-.318-2.135-.859-3.012z" fill="#C5C5C5"/>
</svg>

After

Width:  |  Height:  |  Size: 989 B

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg4"
version="1.1"
viewBox="0 0 6 16"
height="16"
width="16">
<defs
id="defs8" />
<path
style="fill:#c5c5c5;fill-opacity:1;fill-rule:evenodd;stroke-width:1.20185041"
id="path2"
d="M -1,14.5 7,8 -1,1.5 Z" />
</svg>

After

Width:  |  Height:  |  Size: 549 B

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg853"
version="1.1"
viewBox="0 0 4.2333332 4.2333332"
height="16"
width="16">
<defs
id="defs847" />
<metadata
id="metadata850">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-292.76667)"
id="layer1">
<a
transform="translate(0,3.2655e-4)"
id="a4566">
<g
id="g854">
<path
d="M 0.52916665,295.14759 H 3.4395834 v 0.26459 H 0.52916665 Z m 1.32291665,-0.79375 h 0.2645833 v 1.85209 H 1.8520833 Z m -1.32291665,0 v 1.85209 H 3.4395831 l 2e-7,-1.85209 z M 0.26458333,293.29551 H 3.7041666 v 3.175 H 0.26458333 Z"
style="fill:#c5c5c5;fill-opacity:1;stroke:none;stroke-width:0.24090588"
id="rect848" />
</g>
</a>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16.000001 16"
height="16"
width="16"
id="svg6337"
version="1.1">
<metadata
id="metadata6343">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6341" />
<path
id="path6892-1"
d="m 11.854407,13.782417 c -0.03749,-0.01146 -0.109893,-0.04206 -0.160888,-0.06829 -0.05098,-0.02624 -0.782459,-0.734594 -1.625473,-1.574169 L 8.5352919,10.613463 8.350834,10.73426 C 7.7454219,11.130753 6.9936489,11.384688 6.2113014,11.456959 5.2370124,11.546965 4.1372306,11.265599 3.3012718,10.712464 2.0273128,9.8695157 1.1935402,8.3374771 1.1935402,6.8395585 c 0,-0.267199 0.06772,-0.8200098 0.1349943,-1.1019513 C 1.6777937,4.2738516 2.8187888,3.0094714 4.2801399,2.4668232 5.4324495,2.0389324 6.775715,2.1175619 7.9091102,2.6792487 8.4119536,2.9284473 8.9161248,3.3032644 9.2765416,3.6958417 10.669884,5.2135149 10.887695,7.6258835 9.781881,9.2927641 9.7078981,9.4042868 9.6452725,9.5037117 9.6427151,9.5137087 c -0.00257,0.010161 0.6385829,0.6608733 1.4247559,1.4463943 1.356979,1.355848 1.648387,1.667957 1.711573,1.833165 0.01508,0.03943 0.02741,0.14194 0.02741,0.227823 0,0.468538 -0.526904,0.889881 -0.952055,0.761324 z M 6.2250666,10.442607 C 6.9963688,10.352438 7.530461,10.13162 8.1162083,9.660664 8.7732435,9.1323941 9.2381982,8.3713404 9.4228245,7.5219472 9.4790393,7.263347 9.4884874,6.5444002 9.4395719,6.2492124 9.2987655,5.3996036 8.8245519,4.5862528 8.1435261,4.0262944 7.2325714,3.2772817 6.1023405,3.0198957 4.971179,3.3038629 4.5173558,3.4177911 4.2686831,3.5242541 3.899596,3.762634 2.6607488,4.5627589 1.9972167,6.0920307 2.2771235,7.5020151 c 0.1545488,0.7785185 0.4822929,1.3772895 1.0529381,1.9236637 0.619095,0.5927622 1.3815401,0.9515112 2.1877282,1.0293822 0.3150763,0.03044 0.3448663,0.02992 0.7072768,-0.01242 z"
style="fill:#c5c5c5;fill-opacity:1;stroke:#c5c5c5;stroke-width:0.38708037;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="column.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="715"
id="namedview6"
showgrid="false"
inkscape:zoom="16"
inkscape:cx="7.6738321"
inkscape:cy="6.7454004"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<rect
x="8.3240614"
y="-4.4821873"
width="6.4031243"
height="6.4031243"
transform="matrix(0.62469504,0.78086882,-0.62469504,0.78086882,0,0)"
id="rect4"
style="fill:#656565" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="col_nullable.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="715"
id="namedview6"
showgrid="false"
inkscape:zoom="33.1875"
inkscape:cx="3.5254237"
inkscape:cy="7.9397363"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<rect
x="8.9107676"
y="-3.8862312"
width="5.2417922"
height="5.2417922"
transform="matrix(0.62644467,0.77946589,-0.62644467,0.77946589,0,0)"
id="rect4"
style="fill:none;stroke:#656565;stroke-width:1.16996598;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
class="octicon octicon-key"
viewBox="0 0 0.875 1"
version="1.1"
aria-hidden="true"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="col_pk.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="715"
id="namedview6"
showgrid="false"
inkscape:zoom="14.75"
inkscape:cx="10.20339"
inkscape:cy="8.4856653"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
d="m 0.72379508,0.24375027 c -0.0368304,-0.0360581 -0.0829911,-0.0548073 -0.13897319,-0.0562504 -0.0554911,0.001445 -0.10214287,0.0201922 -0.13897322,0.0562504 -0.0368304,0.0360581 -0.0554911,0.0812502 -0.0569643,0.13605759 0,0.0144231 0.001473,0.0283653 0.004419,0.0427884 L 0.09375,0.7163462 l 0,0.0480769 0.04910715,0.0480769 0.0982143,0 0.0491071,-0.0480769 0,-0.0480769 0.0491072,0 0,-0.048077 0.0491071,0 0,-0.0480769 0.0982143,0 0.0535267,-0.0533654 c 0.0147321,0.003846 0.0289733,0.005288 0.0446875,0.005288 0.0559821,-0.001442 0.10214282,-0.0201923 0.13897318,-0.05625 C 0.760625,0.47980745 0.77977673,0.43461527 0.78125,0.37980756 0.77977692,0.32499992 0.760625,0.27980766 0.72379461,0.24374996 Z m -0.0898661,0.1543268 c -0.0378125,0 -0.0677679,-0.0293269 -0.0677679,-0.0663461 0,-0.0370192 0.0299554,-0.0663464 0.0677679,-0.0663464 0.0378125,0 0.0677677,0.0293273 0.0677677,0.0663464 0,0.0370192 -0.0299554,0.0663461 -0.0677677,0.0663461 z"
id="path4"
style="fill:#656565;fill-opacity:1;fill-rule:evenodd"
inkscape:connector-curvature="0" />
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,2 @@
<!-- https://github.com/Microsoft/vscode-mssql/blob/master/src/views/htmlcontent/src/images/ResultToCSV_16x_vscode.svg -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M14 4.552V13c-.028.825-.593 2-2.035 2h-8C3.012 15 2 14.299 2 13V8H.586l2-2H0V2h2.586l-2-2h4.828l1 1h3.608L14 4.552z" id="outline" style="display: none;"/><path class="icon-vs-fg" d="M9 3.586L8.414 3H9v.586zM12 6h-2v7h2V6zm-6 7V7.414L5.414 8H4v5h2zm1 0h2V4.414l-1 1V6h-.586L7 6.414V13z" id="iconFg" style="display: none;"/><path class="icon-vs-bg" d="M8 5.414V6h-.586L8 5.414zM13 5v8s-.035 1-1.035 1h-8S3 14 3 13V8h1v5h2V7.414l1-1V13h2V4.414L9.414 4 9 3.586V3h-.586l-1-1h2.227L13 5zm-1 1h-2v7h2V6z" id="iconBg"/><path class="icon-vs-action-blue" d="M8 4L5 7H3l2-2H1V3h4L3 1h2l3 3z" id="colorAction"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0" y="0" viewBox="0 0 24 24" xml:space="preserve">
<path fill="#656565" d="M12,3C7.58,3 4,4.79 4,7C4,9.21 7.58,11 12,11C16.42,11 20,9.21 20,7C20,4.79 16.42,3 12,3M4,9V12C4,14.21 7.58,16 12,16C16.42,16 20,14.21 20,12V9C20,11.21 16.42,13 12,13C7.58,13 4,11.21 4,9M4,14V17C4,19.21 7.58,21 12,21C16.42,21 20,19.21 20,17V14C20,16.21 16.42,18 12,18C7.58,18 4,16.21 4,14Z" /></svg>

After

Width:  |  Height:  |  Size: 515 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-eye" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z" fill="#656565"></path></svg>

After

Width:  |  Height:  |  Size: 411 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 16 16"> <g transform="matrix(4.1791045,0,0,4.3076924,-0.04477611,-0.07692331)"> <path d="M 1.3627119,2.0050847 1,2.4 1.6,3.1 1.4,3.5 0.4,2.4 0.76440678,2.0033898 Z M 2.6,1.3 3.6,2.4 2.6,3.5 2.4,3.1 3,2.4 2.4,1.7 Z" style="fill:#424242;fill-opacity:1" /> <path d="M 2,1 1.25,1.75 h -0.5 l 0.5,-0.5 h -1 V 0.75000004 h 1 l -0.5,-0.5 h 0.5 z" style="fill:#00539c;fill-opacity:1;" /> </g> </svg>

After

Width:  |  Height:  |  Size: 459 B

View File

@@ -0,0 +1,2 @@
<!-- https://github.com/Microsoft/vscode-mssql/blob/master/src/views/htmlcontent/src/images/ResultToJSON_16x_vscode.svg -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 8.38v2.258s-.992-.001-.997-.003c-.012.052-.003.14-.003.281v1.579c0 1.271-.37 2.185-1.054 2.746-.638.522-1.576.759-2.822.759H10v-3.247s1.014-.001 1.037-.003c.004-.046-.037-.117-.037-.214V11.08c0-.943.222-1.606.539-2.072C11.223 8.527 11 7.843 11 6.869V5.468c0-.087.102-.286.094-.325-.02-.002.063-.143.03-.143H10V2h1.124c1.251 0 2.193.265 2.832.81C14.633 3.387 15 4.3 15 5.522V7h.919L16 8.38zM9.414 4l-4-4H.586l2 2H0v4h2v.586L1.586 7H1v.586L.586 8H1v1.638L1.329 11H2v1.536c0 1.247.495 2.149 1.19 2.711.641.517 1.697.753 2.937.753H7v-3.247s-1.011-.001-1.033-.003c-.008-.053.033-.127.033-.228v-1.401c0-.962-.224-1.637-.542-2.111.256-.378.444-.89.511-1.564L9.414 4z" id="outline" style="display: none;"/><path class="icon-vs-bg" d="M15 8.38v1.258c-.697 0-1.046.426-1.046 1.278v1.579c0 .961-.223 1.625-.666 1.989-.445.364-1.166.547-2.164.547v-1.278c.383 0 .661-.092.834-.277s.26-.498.26-.94V11.08c0-1.089.349-1.771 1.046-2.044v-.027c-.697-.287-1.046-1-1.046-2.14V5.468c0-.793-.364-1.189-1.094-1.189V3c.993 0 1.714.19 2.16.571s.67 1.031.67 1.952v1.565c0 .861.349 1.292 1.046 1.292zm-9.967 4.142v-1.401c0-1.117-.351-1.816-1.053-2.099v-.027c.429-.175.71-.519.877-.995H3.049c-.173.247-.436.38-.805.38v1.258c.692 0 1.039.419 1.039 1.258v1.641c0 .934.226 1.584.677 1.948s1.174.547 2.167.547v-1.278c-.388 0-.666-.093-.838-.28-.17-.188-.256-.505-.256-.952z" id="iconBg"/><path class="icon-vs-action-blue" d="M8 4L5 7H3l2-2H1V3h4L3 1h2l3 3z" id="colorAction"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16'>
<path fill='#F6F6F6' d='M13 2H6V0H2v2H0v4h2v2h2v8h12V5z'/>
<path fill='#424242' d='M12 3H8v1h3v3h3v7H6V8H5v7h10V6z'/>
<path d='M7 3.018H5V1H3.019v2.018H1V5h2.019v2H5V5h2V3.018z' fill='#388A34'/>
<path fill='#F0EFF1' d='M11 7V4H8v2H6v8h8V7z'/>
</svg>

After

Width:  |  Height:  |  Size: 368 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.451 5.609l-.579-.939-1.068.812-.076.094c-.335.415-.927 1.341-1.124 2.876l-.021.165.033.163.071.345c0 1.654-1.346 3-3 3-.795 0-1.545-.311-2.107-.868-.563-.567-.873-1.317-.873-2.111 0-1.431 1.007-2.632 2.351-2.929v2.926s2.528-2.087 2.984-2.461h.012l3.061-2.582-4.919-4.1h-1.137v2.404c-3.429.318-6.121 3.211-6.121 6.721 0 1.809.707 3.508 1.986 4.782 1.277 1.282 2.976 1.988 4.784 1.988 3.722 0 6.75-3.028 6.75-6.75 0-1.245-.349-2.468-1.007-3.536z" fill="#F6F6F6"/><path d="M12.6 6.134l-.094.071c-.269.333-.746 1.096-.91 2.375.057.277.092.495.092.545 0 2.206-1.794 4-4 4-1.098 0-2.093-.445-2.817-1.164-.718-.724-1.163-1.718-1.163-2.815 0-2.206 1.794-4 4-4l.351.025v1.85s1.626-1.342 1.631-1.339l1.869-1.577-3.5-2.917v2.218l-.371-.03c-3.176 0-5.75 2.574-5.75 5.75 0 1.593.648 3.034 1.695 4.076 1.042 1.046 2.482 1.694 4.076 1.694 3.176 0 5.75-2.574 5.75-5.75-.001-1.106-.318-2.135-.859-3.012z" fill="#424242"/></svg>

After

Width:  |  Height:  |  Size: 986 B

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg4"
version="1.1"
viewBox="0 0 6 16"
height="16"
width="16">
<defs
id="defs8" />
<path
style="fill:#656565;fill-opacity:1;fill-rule:evenodd;stroke-width:1.20185041"
id="path2"
d="M -1,14.5 7,8 -1,1.5 Z" />
</svg>

After

Width:  |  Height:  |  Size: 549 B

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg853"
version="1.1"
viewBox="0 0 4.2333332 4.2333332"
height="16"
width="16">
<defs
id="defs847" />
<metadata
id="metadata850">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-292.76667)"
id="layer1">
<a
transform="translate(0,3.2655e-4)"
id="a4566">
<g
id="g854">
<path
d="M 0.52916665,295.14759 H 3.4395834 v 0.26459 H 0.52916665 Z m 1.32291665,-0.79375 h 0.2645833 v 1.85209 H 1.8520833 Z m -1.32291665,0 v 1.85209 H 3.4395831 l 2e-7,-1.85209 z M 0.26458333,293.29551 H 3.7041666 v 3.175 H 0.26458333 Z"
style="fill:#656565;fill-opacity:1;stroke:none;stroke-width:0.24090588"
id="rect848" />
</g>
</a>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16.000001 16"
height="16"
width="16"
id="svg6337"
version="1.1">
<metadata
id="metadata6343">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6341" />
<path
id="path6892-1"
d="m 11.854407,13.782417 c -0.03749,-0.01146 -0.109893,-0.04206 -0.160888,-0.06829 -0.05098,-0.02624 -0.782459,-0.734594 -1.625473,-1.574169 L 8.5352919,10.613463 8.350834,10.73426 C 7.7454219,11.130753 6.9936489,11.384688 6.2113014,11.456959 5.2370124,11.546965 4.1372306,11.265599 3.3012718,10.712464 2.0273128,9.8695157 1.1935402,8.3374771 1.1935402,6.8395585 c 0,-0.267199 0.06772,-0.8200098 0.1349943,-1.1019513 C 1.6777937,4.2738516 2.8187888,3.0094714 4.2801399,2.4668232 5.4324495,2.0389324 6.775715,2.1175619 7.9091102,2.6792487 8.4119536,2.9284473 8.9161248,3.3032644 9.2765416,3.6958417 10.669884,5.2135149 10.887695,7.6258835 9.781881,9.2927641 9.7078981,9.4042868 9.6452725,9.5037117 9.6427151,9.5137087 c -0.00257,0.010161 0.6385829,0.6608733 1.4247559,1.4463943 1.356979,1.355848 1.648387,1.667957 1.711573,1.833165 0.01508,0.03943 0.02741,0.14194 0.02741,0.227823 0,0.468538 -0.526904,0.889881 -0.952055,0.761324 z M 6.2250666,10.442607 C 6.9963688,10.352438 7.530461,10.13162 8.1162083,9.660664 8.7732435,9.1323941 9.2381982,8.3713404 9.4228245,7.5219472 9.4790393,7.263347 9.4884874,6.5444002 9.4395719,6.2492124 9.2987655,5.3996036 8.8245519,4.5862528 8.1435261,4.0262944 7.2325714,3.2772817 6.1023405,3.0198957 4.971179,3.3038629 4.5173558,3.4177911 4.2686831,3.5242541 3.899596,3.762634 2.6607488,4.5627589 1.9972167,6.0920307 2.2771235,7.5020151 c 0.1545488,0.7785185 0.4822929,1.3772895 1.0529381,1.9236637 0.619095,0.5927622 1.3815401,0.9515112 2.1877282,1.0293822 0.3150763,0.03044 0.3448663,0.02992 0.7072768,-0.01242 z"
style="fill:#656565;fill-opacity:1;stroke:#656565;stroke-width:0.38708037;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,357 @@
{
"scopeName": "source.sql.sqlite",
"patterns": [{
"include": "#cli-instruction"
}, {
"include": "#comment"
}, {
"include": "#sql-stmt-explain"
}, {
"include": "#sql-stmt"
}, {
"include": "#other-stmt"
}],
"repository": {
"sql-stmt-explain": {
"begin": "(?i)\\b(explain)(?:\\s+(query\\s+plan))?\\b\\s*",
"end": "(?=;)",
"name": "meta.statement.explain",
"beginCaptures": {
"1": {
"name": "keyword.other.sql.sqlite"
},
"2": {
"name": "keyword.other.sql.sqlite"
}
},
"patterns": [{
"include": "#sql-stmt"
}]
},
"sql-stmt": {
"patterns": [{
"include": "#sql-stmt-with"
}, {
"include": "#select-stmt"
}]
},
"select-stmt": {
"patterns": [{
"include": "#select-stmt-select"
}, {
"include": "#select-stmt-values"
}]
},
"select-stmt-subquery": {
"patterns": [{
"include": "#select-stmt-with-subquery"
}, {
"include": "#select-stmt-select-subquery"
}, {
"include": "#select-stmt-values-subquery"
}]
},
"sql-stmt-with": {
"begin": "(?i)\\b(with)(\\s+recursive)?\\b\\s*",
"end": "(?=;)",
"name": "meta.statement.with.sql.sqlite",
"beginCaptures": {
"1": {
"name": "keyword.other.DML.sql.sqlite"
},
"2": {
"name": "keyword.other.DML.sql.sqlite"
}
},
"patterns": [{
"include": "#common-table-expression"
}, {
"include": "#select-stmt"
}]
},
"select-stmt-with-subquery": {
"begin": "(?i)\\b(with)(\\s+recursive)?\\b\\s*",
"end": "(?=\\))",
"name": "meta.statement.with.sql.sqlite",
"beginCaptures": {
"1": {
"name": "keyword.other.DML.sql.sqlite"
},
"2": {
"name": "keyword.other.DML.sql.sqlite"
}
},
"patterns": [{
"include": "#select-stmt-subquery"
}, {
"include": "#common-table-expression"
}]
},
"with-clause-as": {
"begin": "(?i)\\b(as)\\b\\s*",
"end": "(?<=\\))",
"name": "meta.other.cte-as.sql.sqlite",
"beginCaptures": {
"1": {
"name": "keyword.other.sql.sqlite"
}
},
"endCaptures": {},
"patterns": [{
"begin": "\\(",
"end": "\\)",
"name": "meta.cte-select-stmt.sql.sqlite",
"beginCaptures": {},
"endCaptures": {},
"patterns": [{
"include": "#select-stmt-subquery"
}]
}]
},
"common-table-expression": {
"patterns": [{
"include": "#with-clause-as"
}, {
"include": "#name"
}, {
"begin": "\\(",
"end": "\\)",
"beginCaptures": {},
"endCaptures": {},
"patterns": [{
"include": "#name"
}]
}]
},
"select-stmt-select": {
"begin": "(?i)\\b(select)\\b\\s*",
"end": "(?=;)",
"name": "meta.statement.select.sql.sqlite",
"beginCaptures": {
"1": {
"name": "keyword.other.DML.sql.sqlite"
}
},
"patterns": [{
"include": "#expr"
}]
},
"select-stmt-select-subquery": {
"begin": "(?i)\\b(select)\\b\\s*",
"end": "(?=\\))",
"name": "meta.statement.select.subquery.sql.sqlite",
"beginCaptures": {
"1": {
"name": "keyword.other.DML.sql.sqlite"
}
},
"patterns": [{
"include": "#expr"
}]
},
"select-stmt-values": {
"begin": "(?i)\\b(values)\\s*",
"end": "(?=;)",
"name": "meta.statement.values.sql.sqlite",
"beginCaptures": {
"1": {
"name": "keyword.other.DML.sql.sqlite"
}
},
"patterns": [{
"include": "#rowvalue"
}]
},
"select-stmt-values-subquery": {
"begin": "(?i)\\b(values)\\s*",
"end": "(?=\\))",
"name": "meta.statement.values.subquery.sql.sqlite",
"beginCaptures": {
"1": {
"name": "keyword.other.DML.sql.sqlite"
}
},
"patterns": [{
"include": "#rowvalue"
}]
},
"rowvalue": {
"begin": "\\(",
"end": "\\)",
"beginCaptures": {
"0": {
"name": "punctuation.section.rowvalue.values.begin"
}
},
"endCaptures": {
"0": {
"name": "punctuation.section.rowvalue.values.end"
}
},
"name": "meta.rowvalue.sql.sqlite",
"patterns": [{
"include": "#expr"
}, {
"match": ",",
"name": "punctuation.separator.rowvalue"
}]
},
"expr": {
"patterns": [{
"include": "#comment"
}, {
"include": "#keyword"
}, {
"include": "#expr-parens"
}, {
"include": "#function"
}, {
"include": "#literal-value"
}, {
"include": "#name"
}]
},
"expr-parens": {
"begin": "\\(",
"end": "\\)",
"name": "meta.parens",
"patterns": [{
"include": "#select-stmt-subquery"
}, {
"include": "#keyword"
}, {
"include": "#expr-parens"
}, {
"include": "#function"
}, {
"include": "#literal-value"
}, {
"include": "#name"
}]
},
"literal-value": {
"patterns": [{
"match": "(?i)\\b(null|true|false|current_time|current_date|current_timestamp)\\b",
"name": "constant.language.sql.sqlite"
}, {
"include": "#numeric-literal"
}, {
"include": "#blob-literal"
}, {
"include": "#string-literal"
}]
},
"function": {
"begin": "\\b([A-Za-z]\\w+)\\b\\s*(\\()",
"end": "\\)",
"name": "meta.function-call.sql.sqlite",
"beginCaptures": {
"1": {
"name": "entity.name.function.sql.sqlite"
}
},
"patterns": [{
"include": "#expr"
}]
},
"keyword": {
"match": "(?i)\\b(abort|action|add|after|all|alter|always|analyze|and|as|asc|attach|autoincrement|before|begin|between|by|cascade|case|cast|check|collate|column|commit|conflict|constraint|create|cross|current|current_date|current_time|current_timestamp|database|default|deferrable|deferred|delete|desc|detach|distinct|do|drop|each|else|end|escape|except|exclude|exclusive|exists|explain|fail|filter|first|following|for|foreign|from|full|generated|glob|group|groups|having|if|ignore|immediate|in|index|indexed|initially|inner|insert|instead|intersect|into|is|isnull|join|key|last|left|like|limit|match|materialized|natural|no|not|nothing|notnull|null|nulls|of|offset|on|or|order|others|outer|over|partition|plan|pragma|preceding|primary|query|raise|range|recursive|references|regexp|reindex|release|rename|replace|restrict|returning|right|rollback|row|rows|savepoint|select|set|table|temp|temporary|then|ties|to|transaction|trigger|unbounded|union|unique|update|using|vacuum|values|view|virtual|when|where|window|with|without)\\b",
"name": "keyword.other.sql.sqlite"
},
"name": {
"patterns": [{
"include": "#doublequoted-name"
}, {
"include": "#backquoted-name"
}, {
"include": "#bare-name"
}]
},
"bare-name": {
"match": "\\b(?i)(?!abort\\b|action\\b|add\\b|after\\b|all\\b|alter\\b|analyze\\b|and\\b|as\\b|asc\\b|attach\\b|autoincrement\\b|before\\b|begin\\b|between\\b|by\\b|cascade\\b|case\\b|cast\\b|check\\b|collate\\b|column\\b|commit\\b|conflict\\b|constraint\\b|create\\b|cross\\b|current\\b|current_date\\b|current_time\\b|current_timestamp\\b|database\\b|default\\b|deferrable\\b|deferred\\b|delete\\b|desc\\b|detach\\b|distinct\\b|do\\b|drop\\b|each\\b|else\\b|end\\b|escape\\b|except\\b|exclusive\\b|exists\\b|explain\\b|fail\\b|filter\\b|following\\b|for\\b|foreign\\b|from\\b|full\\b|glob\\b|group\\b|having\\b|if\\b|ignore\\b|immediate\\b|in\\b|index\\b|indexed\\b|initially\\b|inner\\b|insert\\b|instead\\b|intersect\\b|into\\b|is\\b|isnull\\b|join\\b|key\\b|left\\b|like\\b|limit\\b|match\\b|natural\\b|no\\b|not\\b|nothing\\b|notnull\\b|null\\b|of\\b|offset\\b|on\\b|or\\b|order\\b|outer\\b|over\\b|partition\\b|plan\\b|pragma\\b|preceding\\b|primary\\b|query\\b|raise\\b|range\\b|recursive\\b|references\\b|regexp\\b|reindex\\b|release\\b|rename\\b|replace\\b|restrict\\b|right\\b|rollback\\b|row\\b|rows\\b|savepoint\\b|select\\b|set\\b|table\\b|temp\\b|temporary\\b|then\\b|to\\b|transaction\\b|trigger\\b|unbounded\\b|union\\b|unique\\b|update\\b|using\\b|vacuum\\b|values\\b|view\\b|virtual\\b|when\\b|where\\b|window\\b|with\\b|without)\\w+\\b",
"name": "variable.other.bare"
},
"doublequoted-name": {
"begin": "\"",
"end": "\"(?!\")",
"name": "variable.other.quoted.double",
"patterns": [{
"match": "\"\"",
"name": "constant.character.escape.doublequote.sql.sqlite"
}]
},
"backquoted-name": {
"begin": "`",
"end": "`(?!`)",
"name": "variable.other.quoted.other",
"patterns": [{
"match": "``",
"name": "constant.character.escape.backquote.sql.sqlite"
}]
},
"bracketed-name": {
"begin": "[",
"end": "]",
"name": "variable.other.bracketed"
},
"numeric-literal": {
"match": "(?i)(?<![\\w\\.])((\\d+(\\.\\d*)?|\\.\\d+)(e[-+]?\\d+)?|0x[\\da-f]+)\\b",
"name": "constant.numeric.sql.sqlite"
},
"string-literal": {
"begin": "'",
"end": "'(?!')",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.sql.sqlite"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.sql.sqlite"
}
},
"name": "string.quoted.single.sql.sqlite",
"patterns": [{
"match": "''",
"name": "constant.character.escape.singlequote.sql.sqlite"
}]
},
"blob-literal": {
"begin": "\\b(?i)x'",
"end": "'",
"name": "string.quoted.other.blob.sql.sqlite"
},
"cli-instruction": {
"match": "^\\.(?:(auth|backup|bail|binary|cd|changes|check|clone|databases|dbconfig|dbinfo|dump|echo|eqp|excel|exit|expert|fullschema|headers|help|import|imposter|indexes|limit|lint|load|log|mode|nullvalue|once|open|output|print|prompt|quit|read|restore|save|scanstats|schema|selftest|separator|sha3sum|shell|show|stats|system|tables|testcase|timeout|timer|trace|vfsinfo|vfslist|vfsname|width)|\\w+)\\b.*$",
"captures": {
"1": {
"name": "keyword.other.cli-instruction.sql.sqlite"
}
}
},
"comment": {
"patterns": [{
"match": "--.*",
"name": "comment.line.double-dash.sql.sqlite"
}, {
"begin": "/\\*",
"end": "\\*/",
"name": "comment.block.sql.sqlite"
}]
},
"other-stmt": {
"begin": "(?i)\\b(alter|analyze|attach|begin|commit|create|delete|detach|drop|end|insert|pragma|reindex|release|replace|rollback|savepoint|update|vacuum)\\b\\s*",
"end": "(?=;)",
"name": "meta.statement.with.sql.sqlite",
"beginCaptures": {
"1": {
"name": "keyword.other.sql.sqlite"
}
},
"patterns": [{
"include": "#expr"
}]
}
}
}

View File

@@ -0,0 +1,25 @@
on:
push:
branches:
- master
pull_request:
branches: [master]
jobs:
build:
strategy:
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install Node.js
uses: actions/setup-node@v2.5.0
with:
node-version: 16.x
- run: npm install
- run: xvfb-run -a npm test
if: runner.os == 'Linux'
- run: npm test
if: runner.os != 'Linux'

View File

@@ -0,0 +1,121 @@
name: Release
on:
release:
types:
- published
workflow_dispatch:
inputs:
publishMS:
description: 'Publish to MS marketplace'
type: boolean
required: true
default: "true"
publishOVSX:
description: 'Publish to OpenVSX'
type: boolean
required: true
default: "true"
publishGH:
description: 'Publish to GitHub releases'
type: boolean
required: true
default: "true"
jobs:
package:
name: Package
runs-on: ubuntu-latest
outputs:
packageName: ${{ steps.setup.outputs.packageName }}
tag: ${{ steps.setup-tag.outputs.tag }}
version: ${{ steps.setup-tag.outputs.version }}
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 14
registry-url: https://registry.npmjs.org/
- name: Install dependencies
run: npm i
- name: Setup package path
id: setup
run: echo "::set-output name=packageName::$(node -e "console.log(require('./package.json').name + '-' + require('./package.json').version + '.vsix')")"
- name: Package
run: npx vsce package --out ${{ steps.setup.outputs.packageName }}
- uses: actions/upload-artifact@v2
with:
name: ${{ steps.setup.outputs.packageName }}
path: ${{ steps.setup.outputs.packageName }}
- name: Setup tag
id: setup-tag
run: |
$version = (Get-Content ./package.json -Raw | ConvertFrom-Json).version
Write-Host "tag: release/$version"
Write-Host "::set-output name=tag::release/$version"
Write-Host "::set-output name=version::$version"
shell: pwsh
publishMS:
name: Publish to MS marketplace
runs-on: ubuntu-latest
needs: package
if: github.event.inputs.publishMS == 'true'
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@v2
with:
name: ${{ needs.package.outputs.packageName }}
- name: Publish to MS marketplace
run: npx vsce publish --packagePath ./${{ needs.package.outputs.packageName }} -p ${{ secrets.VSCE_PAT }}
publishOVSX:
name: Publish to OpenVSX
runs-on: ubuntu-latest
needs: package
if: github.event.inputs.publishOVSX == 'true'
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@v2
with:
name: ${{ needs.package.outputs.packageName }}
- name: Publish to OpenVSX
run: npx ovsx publish ./${{ needs.package.outputs.packageName }} -p ${{ secrets.OVSX_PAT }}
publishGH:
name: Publish to GitHub releases
runs-on: ubuntu-latest
needs: package
if: github.event.inputs.publishGH == 'true'
steps:
- uses: actions/download-artifact@v2
with:
name: ${{ needs.package.outputs.packageName }}
- name: Commit tagger
uses: tvdias/github-tagger@v0.0.2
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ needs.package.outputs.tag }}
- name: Create Release
id: create-release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ needs.package.outputs.tag }}
release_name: Release ${{ needs.package.outputs.version }}
draft: false
prerelease: false
- name: Upload assets to a Release
uses: AButler/upload-release-assets@v2.0
with:
files: ${{ needs.package.outputs.packageName }}
release-tag: ${{ needs.package.outputs.tag }}
repo-token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -0,0 +1,11 @@
# This configuration file was automatically generated by Gitpod.
# Please adjust to your needs (see https://www.gitpod.io/docs/config-gitpod-file)
# and commit this file to your remote git repository to share the goodness with others.
tasks:
- init: npm install && npm run compile
command: npm run watch
vscode:
extensions:
- dbaeumer.vscode-eslint

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<Metadata>
<Identity Language="en-US" Id="npm-intellisense" Version="1.4.5" Publisher="christian-kohler" />
<DisplayName>npm Intellisense</DisplayName>
<Description xml:space="preserve">Visual Studio Code plugin that autocompletes npm modules in import statements</Description>
<Tags>typescript,javascript,javascriptreact,typescriptreact,node,__sponsor_extension</Tags>
<Categories>Other</Categories>
<GalleryFlags>Public</GalleryFlags>
<Properties>
<Property Id="Microsoft.VisualStudio.Code.Engine" Value="^1.0.0" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionDependencies" Value="" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionPack" Value="" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionKind" Value="workspace" />
<Property Id="Microsoft.VisualStudio.Code.LocalizedLanguages" Value="" />
<Property Id="Microsoft.VisualStudio.Code.SponsorLink" Value="https://github.com/sponsors/ChristianKohler" />
<Property Id="Microsoft.VisualStudio.Services.Links.Source" Value="https://github.com/ChristianKohler/NpmIntellisense.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.Getstarted" Value="https://github.com/ChristianKohler/NpmIntellisense.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.GitHub" Value="https://github.com/ChristianKohler/NpmIntellisense.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.Support" Value="https://github.com/ChristianKohler/NpmIntellisense/issues" />
<Property Id="Microsoft.VisualStudio.Services.Links.Learn" Value="https://github.com/ChristianKohler/NpmIntellisense" />
<Property Id="Microsoft.VisualStudio.Services.GitHubFlavoredMarkdown" Value="true" />
<Property Id="Microsoft.VisualStudio.Services.Content.Pricing" Value="Free"/>
</Properties>
<License>extension/LICENSE.txt</License>
<Icon>extension/images/icon.png</Icon>
</Metadata>
<Installation>
<InstallationTarget Id="Microsoft.VisualStudio.Code"/>
</Installation>
<Dependencies/>
<Assets>
<Asset Type="Microsoft.VisualStudio.Code.Manifest" Path="extension/package.json" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Content.Details" Path="extension/README.md" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Content.Changelog" Path="extension/CHANGELOG.md" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Content.License" Path="extension/LICENSE.txt" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Icons.Default" Path="extension/images/icon.png" Addressable="true" />
</Assets>
</PackageManifest>

View File

@@ -0,0 +1,29 @@
### v1.4.0
- Feature: Add support for workspace trust
### v1.2.1
- Documentation: Added missing documentation for showBuildInLibs
### v1.2.0
- Feature: Support for `import 'modulename'` syntax. Thank you [@elderfo](https://github.com/elderfo) [#25](https://github.com/ChristianKohler/NpmIntellisense/issues/25)
### v1.1.0
- Feature: Import command, thank you [@dgieselaar](https://github.com/dgieselaar)
- Feature: List build in node modules [#14](https://github.com/ChristianKohler/NpmIntellisense/issues/14)
### v1.0.0
- Feature: recursivePackageJsonLookup, thank you [@kasperekt](https://github.com/kasperekt)
- Feature: packageSubfoldersIntellisense (experimental), thank you [@dgieselaar](https://github.com/dgieselaar)
- Fixes dashes inside name, thank you [@kasperekt](https://github.com/kasperekt), [#10](https://github.com/ChristianKohler/NpmIntellisense/issues/10)
### v0.1.4
- Fixed [#13](https://github.com/ChristianKohler/NpmIntellisense/issues/13), [#16](https://github.com/ChristianKohler/NpmIntellisense/issues/16)
### v0.1.3
- Fixed conflict with PathIntellisense
### v0.1.1
- Fixed compatibility with VS Code 1.3
### v0.1.0
- Initial release

View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2016 Christian Kohler
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,90 @@
# Npm Intellisense
Visual Studio Code plugin that autocompletes npm modules in import statements.
![auto complete](https://github.com/ChristianKohler/NpmIntellisense/raw/HEAD/images/auto_complete.gif)
## Installation
In the command palette (cmd-shift-p) select Install Extension and choose npm Intellisense.
![install](https://github.com/ChristianKohler/NpmIntellisense/raw/HEAD/images/npm_install.gif)
## Contributing
Something missing? Found a bug? - Create a pull request or an issue.
[Github](https://github.com/ChristianKohler/NpmIntellisense)
## Features
### Import command
![import command](https://github.com/ChristianKohler/NpmIntellisense/raw/HEAD/images/importcommand.gif)
```javascript
{
"npm-intellisense.importES6": true,
"npm-intellisense.importQuotes": "'",
"npm-intellisense.importLinebreak": ";\r\n",
"npm-intellisense.importDeclarationType": "const",
}
```
### Import command (ES5)
![import command](https://github.com/ChristianKohler/NpmIntellisense/raw/HEAD/images/require_withname.gif)
```javascript
{
"npm-intellisense.importES6": false,
"npm-intellisense.importQuotes": "'",
"npm-intellisense.importLinebreak": ";\r\n",
"npm-intellisense.importDeclarationType": "const",
}
```
### Scan devDependencies
Npm intellisense scans only dependencies by default. Set scanDevDependencies to true to enable it for devDependencies too.
```javascript
{
"npm-intellisense.scanDevDependencies": true,
}
```
### Show build in (local) libs
Shows build in node modules like 'path' of 'fs'
```javascript
{
"npm-intellisense.showBuildInLibs": true,
}
```
### Lookup package.json recursive
Look for package.json inside nearest directory instead of workspace root. It's enabled by default.
```javascript
{
"npm-intellisense.recursivePackageJsonLookup": true,
}
```
### Experimental: Package Subfolder Intellisense
Open subfolders of a module.
This feature is work in progress and experimental.
```javascript
{
"npm-intellisense.packageSubfoldersIntellisense": false,
}
```
## License
This software is released under [MIT License](http://www.opensource.org/licenses/mit-license.php)

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 KiB

View File

@@ -0,0 +1,23 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NpmIntellisense = void 0;
const vscode_1 = require("vscode");
const path_1 = require("path");
const config_1 = require("./config");
const shouldProvide_1 = require("./shouldProvide");
const provide_1 = require("./provide");
const fs_functions_1 = require("./fs-functions");
class NpmIntellisense {
provideCompletionItems(document, position) {
const state = {
rootPath: vscode_1.workspace.rootPath,
filePath: (0, path_1.dirname)(document.fileName),
textCurrentLine: document.lineAt(position).text,
cursorPosition: position.character,
cursorLine: position.line
};
return (0, shouldProvide_1.shouldProvide)(state) ? (0, provide_1.provide)(state, (0, config_1.getConfig)(), fs_functions_1.fsf) : Promise.resolve([]);
}
}
exports.NpmIntellisense = NpmIntellisense;
//# sourceMappingURL=NpmIntellisense.js.map

View File

@@ -0,0 +1,18 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PackageCompletionItem = void 0;
const vscode_1 = require("vscode");
class PackageCompletionItem extends vscode_1.CompletionItem {
constructor(label, state) {
super(label);
this.kind = vscode_1.CompletionItemKind.Module;
this.textEdit = vscode_1.TextEdit.replace(this.importStringRange(state), label);
}
importStringRange({ textCurrentLine, cursorLine, cursorPosition }) {
const textToPosition = textCurrentLine.substring(0, cursorPosition);
const quotationPosition = Math.max(textToPosition.lastIndexOf('\"'), textToPosition.lastIndexOf('\''));
return new vscode_1.Range(cursorLine, quotationPosition + 1, cursorLine, cursorPosition);
}
}
exports.PackageCompletionItem = PackageCompletionItem;
//# sourceMappingURL=PackageCompletionItem.js.map

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=State.js.map

View File

@@ -0,0 +1,44 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.onImportCommand = void 0;
const vscode_1 = require("vscode");
const path_1 = require("path");
const provide_1 = require("./provide");
const fs_functions_1 = require("./fs-functions");
const config_1 = require("./config");
const util_1 = require("./util");
const quickPickOptions = {
matchOnDescription: true
};
function onImportCommand() {
const config = (0, config_1.getConfig)();
vscode_1.window.showQuickPick(getPackages(config), quickPickOptions)
.then(selection => addImportStatementToCurrentFile(selection, config));
}
exports.onImportCommand = onImportCommand;
function getPackages(config) {
const state = {
filePath: (0, path_1.dirname)(vscode_1.window.activeTextEditor.document.fileName),
rootPath: vscode_1.workspace.rootPath,
cursorLine: undefined,
cursorPosition: undefined,
textCurrentLine: undefined
};
return (0, provide_1.getNpmPackages)(state, config, fs_functions_1.fsf)
.then(npmPackages => npmPackages.map(moduleNameToQuickPickItem))
.catch(error => vscode_1.window.showErrorMessage(error));
}
function moduleNameToQuickPickItem(moduleName) {
return {
label: moduleName,
description: 'npm module'
};
}
function addImportStatementToCurrentFile(item, config) {
const statementES6 = `import {} from ${config.importQuotes}${item.label}${config.importQuotes}${config.importLinebreak}`;
const statementRequire = `${config.importDeclarationType} ${(0, util_1.guessVariableName)(item.label)} = require(${config.importQuotes}${item.label}${config.importQuotes})${config.importLinebreak}`;
const statement = config.importES6 ? statementES6 : statementRequire;
const insertLocation = vscode_1.window.activeTextEditor.selection.start;
vscode_1.window.activeTextEditor.edit(edit => edit.insert(insertLocation, statement));
}
//# sourceMappingURL=command-import.js.map

View File

@@ -0,0 +1,19 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getConfig = void 0;
const vscode_1 = require("vscode");
function getConfig() {
const configuration = vscode_1.workspace.getConfiguration('npm-intellisense');
return {
scanDevDependencies: configuration['scanDevDependencies'],
recursivePackageJsonLookup: configuration['recursivePackageJsonLookup'],
packageSubfoldersIntellisense: configuration['packageSubfoldersIntellisense'],
showBuildInLibs: configuration['showBuildInLibs'],
importES6: configuration['importES6'],
importQuotes: configuration['importQuotes'],
importLinebreak: configuration['importLinebreak'],
importDeclarationType: configuration['importDeclarationType']
};
}
exports.getConfig = getConfig;
//# sourceMappingURL=config.js.map

View File

@@ -0,0 +1,20 @@
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
exports.deactivate = exports.activate = void 0;
const vscode_1 = require("vscode");
const NpmIntellisense_1 = require("./NpmIntellisense");
const command_import_1 = require("./command-import");
function activate(context) {
if (vscode_1.workspace.rootPath) {
const provider = new NpmIntellisense_1.NpmIntellisense();
const triggers = ['"', '\'', '/'];
const selector = ['typescript', 'javascript', 'javascriptreact', 'typescriptreact'];
context.subscriptions.push(vscode_1.languages.registerCompletionItemProvider(selector, provider, ...triggers));
context.subscriptions.push(vscode_1.commands.registerCommand('npm-intellisense.import', command_import_1.onImportCommand));
}
}
exports.activate = activate;
function deactivate() {
}
exports.deactivate = deactivate;
//# sourceMappingURL=extension.js.map

View File

@@ -0,0 +1,28 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.fsf = void 0;
const fs_1 = require("fs");
exports.fsf = {
readJson,
isFile,
readDir
};
function readJson(file) {
return new Promise((resolve, reject) => {
(0, fs_1.readFile)(file, (err, data) => err ? reject(err) : resolve(JSON.parse(data.toString())));
});
}
function isFile(path) {
try {
return (0, fs_1.statSync)(path).isFile();
}
catch (err) {
return false;
}
}
function readDir(path) {
return new Promise((resolve, reject) => {
(0, fs_1.readdir)(path, (err, files) => err ? reject(err) : resolve(files));
});
}
//# sourceMappingURL=fs-functions.js.map

View File

@@ -0,0 +1,60 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getNpmPackages = exports.provide = void 0;
const path_1 = require("path");
const repl = require("repl");
const PackageCompletionItem_1 = require("./PackageCompletionItem");
function provide(state, config, fsf) {
return getNpmPackages(state, config, fsf)
.then(dependencies => {
return config.packageSubfoldersIntellisense ?
readModuleSubFolders(dependencies, state, fsf) : dependencies;
})
.then(dependencies => dependencies.map(d => toCompletionItem(d, state)));
}
exports.provide = provide;
function getNpmPackages(state, config, fsf) {
return fsf.readJson(getPackageJson(state, config, fsf))
.then(packageJson => [
...Object.keys(packageJson.dependencies || {}),
...Object.keys(config.scanDevDependencies ? packageJson.devDependencies || {} : {}),
...(config.showBuildInLibs ? getBuildInModules() : [])
])
.catch(() => []);
}
exports.getNpmPackages = getNpmPackages;
function getBuildInModules() {
return repl._builtinLibs;
}
function toCompletionItem(dependency, state) {
return new PackageCompletionItem_1.PackageCompletionItem(dependency, state);
}
function getPackageJson(state, config, fsf) {
return config.recursivePackageJsonLookup ?
nearestPackageJson(state.rootPath, state.filePath, fsf) :
(0, path_1.join)(state.rootPath, 'package.json');
}
function nearestPackageJson(rootPath, currentPath, fsf) {
const absoluteCurrentPath = (0, path_1.resolve)(currentPath);
const absoluteRootPath = (0, path_1.resolve)(rootPath);
const packageJsonFullPath = (0, path_1.join)(absoluteCurrentPath, 'package.json');
if (absoluteCurrentPath === absoluteRootPath || fsf.isFile(packageJsonFullPath)) {
return packageJsonFullPath;
}
return nearestPackageJson(absoluteRootPath, (0, path_1.resolve)(absoluteCurrentPath, '..'), fsf);
}
function readModuleSubFolders(dependencies, state, fsf) {
const fragments = state.textCurrentLine.split('from ');
const pkgFragment = fragments[fragments.length - 1].split(/['"]/)[1];
const pkgFragmentSplit = pkgFragment.split('/');
const packageName = pkgFragmentSplit[0];
if (dependencies.filter(dep => dep === packageName).length) {
const path = (0, path_1.join)(state.rootPath, 'node_modules', ...pkgFragmentSplit);
// Todo: make the replace function work with other filetypes as well
return fsf.readDir(path)
.then(files => files.map(file => pkgFragment + file.replace(/\.js$/, '')))
.catch(err => ['']);
}
return Promise.resolve(dependencies);
}
//# sourceMappingURL=provide.js.map

View File

@@ -0,0 +1,50 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.shouldProvide = void 0;
function shouldProvide(state) {
return isImportOrRequire(state.textCurrentLine, state.cursorPosition)
&& !startsWithADot(state.textCurrentLine, state.cursorPosition);
}
exports.shouldProvide = shouldProvide;
function isImportOrRequire(textCurrentLine, position) {
let isImport = textCurrentLine.substring(0, 6) === 'import';
let isRequire = textCurrentLine.indexOf('require(') != -1;
return (isImport && (isAfterFrom(textCurrentLine, position)
|| isImportWithoutFrom(textCurrentLine, position))) || isRequire;
}
function isAfterFrom(textCurrentLine, position) {
let fromPosition = stringMatches(textCurrentLine, [
' from \'', ' from "',
'}from \'', '}from "'
]);
return fromPosition != -1 && fromPosition < position;
}
function isImportWithoutFrom(textCurrentLine, postition) {
let modulePosition = stringMatches(textCurrentLine, [
' \'',
'\'',
'"',
' "'
], true);
return modulePosition != -1 && modulePosition < postition;
}
function stringMatches(textCurrentLine, strings, searchFromStart = false) {
return strings.reduce((position, str) => {
let textPosition = searchFromStart
? textCurrentLine.indexOf(str)
: textCurrentLine.lastIndexOf(str);
return Math.max(position, textPosition);
}, -1);
}
function startsWithADot(textCurrentLine, position) {
const textWithinString = getTextWithinString(textCurrentLine, position);
return textWithinString
&& textWithinString.length > 0
&& textWithinString[0] === '.';
}
function getTextWithinString(text, position) {
const textToPosition = text.substring(0, position);
const quoatationPosition = Math.max(textToPosition.lastIndexOf('\"'), textToPosition.lastIndexOf('\''));
return quoatationPosition != -1 ? textToPosition.substring(quoatationPosition + 1, textToPosition.length) : undefined;
}
//# sourceMappingURL=shouldProvide.js.map

View File

@@ -0,0 +1,96 @@
'use_strict';
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.guessVariableName = exports.getImportStatementFromFilepath = exports.getQuickPickItems = exports.readFilesFromPackage = exports.readFilesFromDir = exports.isDirectory = void 0;
const vscode_1 = require("vscode");
const fs_1 = require("fs");
const path_1 = require("path");
const isDirectory = (path) => {
return new Promise((resolve, reject) => {
(0, fs_1.stat)(path, (error, stats) => {
if (error) {
reject(error);
}
else {
resolve(stats.isDirectory());
}
});
});
};
exports.isDirectory = isDirectory;
const readFilesFromDir = (dir) => {
return new Promise((resolve, reject) => {
let paths = [];
(0, fs_1.readdir)(dir, (error, files) => {
Promise.all(files.map(file => {
const path = (0, path_1.join)(dir, file);
if (file === 'node_modules') {
return Promise.resolve([]);
}
return (0, exports.isDirectory)(path)
.then(isDir => isDir ? (0, exports.readFilesFromDir)(path) : Promise.resolve([path]));
}))
.then((filesPerDir) => {
resolve([].concat(...filesPerDir));
})
.catch(error => reject(error));
});
});
};
exports.readFilesFromDir = readFilesFromDir;
const readFilesFromPackage = (packageName) => {
return (0, exports.readFilesFromDir)((0, path_1.join)(vscode_1.workspace.rootPath, 'node_modules', packageName));
};
exports.readFilesFromPackage = readFilesFromPackage;
const getQuickPickItems = (packages) => {
const root = vscode_1.workspace.rootPath;
const nodeRegEx = new RegExp(`^node_modules\\${path_1.sep}`);
return Promise.all([(0, exports.readFilesFromDir)(root)].concat(packages.map(exports.readFilesFromPackage)))
.then((filesPerPackage) => {
let items = [].concat(...filesPerPackage)
.map((filePath) => {
const partialPath = filePath.replace(root + path_1.sep, '').replace(nodeRegEx, '');
const fragments = partialPath.split(path_1.sep);
const label = fragments[fragments.length - 1];
const description = fragments.join('/');
return { label, description, filePath };
});
return items;
});
};
exports.getQuickPickItems = getQuickPickItems;
const getImportStatementFromFilepath = (filePath) => {
let partialPath = !filePath.includes('node_modules') ?
(0, path_1.relative)(vscode_1.window.activeTextEditor.document.fileName, filePath)
: filePath.replace((0, path_1.join)(vscode_1.workspace.rootPath, 'node_modules') + path_1.sep, '');
let fragments = filePath.split(path_1.sep)
.map((fragment, index, arr) => {
return index === arr.length - 1 ?
fragment.replace(/\.js$/, '')
.replace(/^index$/, '')
: fragment;
})
.filter(fragment => !!fragment);
let moduleName = fragments[fragments.length - 1]
.replace(/[\-](.)/g, (substring, ...rest) => rest[0].toUpperCase());
moduleName = moduleName.replace(new RegExp(`${(0, path_1.extname)(moduleName)}$`), '')
.replace(/^[^a-z$]/i, '');
let packagePath = partialPath.split(path_1.sep).filter(fragment => fragment !== 'index.js').join('/') || '.';
let importES6 = vscode_1.workspace.getConfiguration('npm-intellisense')['importES6'];
let quoteType = vscode_1.workspace.getConfiguration('npm-intellisense')['importQuotes'];
let linebreak = vscode_1.workspace.getConfiguration('npm-intellisense')['importLinebreak'];
let declaration = vscode_1.workspace.getConfiguration('npm-intellisense')['importDeclarationType'];
let statement;
if (importES6) {
statement = `import ${moduleName} from ${quoteType}${packagePath}${quoteType}`;
}
else {
statement = `${declaration} ${moduleName} = require(${quoteType}${packagePath}${quoteType})`;
}
statement += `${linebreak}`;
return statement;
};
exports.getImportStatementFromFilepath = getImportStatementFromFilepath;
const guessVariableName = (packageName) => packageName.replace(/-\w/gm, (sub, args) => sub.replace('-', '').toUpperCase());
exports.guessVariableName = guessVariableName;
//# sourceMappingURL=util.js.map

View File

@@ -0,0 +1,109 @@
{
"name": "npm-intellisense",
"displayName": "npm Intellisense",
"description": "Visual Studio Code plugin that autocompletes npm modules in import statements",
"version": "1.4.5",
"publisher": "christian-kohler",
"engines": {
"vscode": "^1.0.0"
},
"homepage": "https://github.com/ChristianKohler/NpmIntellisense",
"sponsor": {
"url": "https://github.com/sponsors/ChristianKohler"
},
"repository": {
"type": "git",
"url": "https://github.com/ChristianKohler/NpmIntellisense.git"
},
"categories": [
"Other"
],
"activationEvents": [
"onLanguage:typescript",
"onLanguage:javascript",
"onLanguage:javascriptreact",
"onLanguage:typescriptreact",
"onCommand:npm-intellisense.import"
],
"capabilities": {
"untrustedWorkspaces": {
"supported": true
}
},
"contributes": {
"configuration": {
"type": "object",
"title": "npm-intellisense",
"properties": {
"npm-intellisense.scanDevDependencies": {
"type": "boolean",
"default": false,
"description": "Scans devDependencies as well"
},
"npm-intellisense.recursivePackageJsonLookup": {
"type": "boolean",
"default": true,
"description": "Look for package.json inside nearest directory instead of workspace root"
},
"npm-intellisense.packageSubfoldersIntellisense": {
"type": "boolean",
"default": false,
"description": "(experimental) Enables path intellisense in subfolders of modules"
},
"npm-intellisense.showBuildInLibs": {
"type": "boolean",
"default": false,
"description": "shows build in node modules like 'path' of 'fs'"
},
"npm-intellisense.importES6": {
"type": "boolean",
"default": true,
"description": "For import command. Use import statements instead of require()"
},
"npm-intellisense.importQuotes": {
"type": "string",
"default": "'",
"description": "For import command. The type of quotes to use in the snippet"
},
"npm-intellisense.importLinebreak": {
"type": "string",
"default": ";\r\n",
"description": "For import command. The linebreak used after the snippet"
},
"npm-intellisense.importDeclarationType": {
"type": "string",
"default": "const",
"description": "For import command. The declaration type used for require()"
}
}
},
"commands": [
{
"command": "npm-intellisense.import",
"title": "NPM Intellisense: Import module"
}
]
},
"icon": "images/icon.png",
"main": "./out/src/extension",
"scripts": {
"vscode:prepublish": "tsc",
"compile": "tsc -p ./",
"watch": "tsc -watch -p ./",
"pretest": "npm run compile",
"test": "node ./out/test/runTest.js"
},
"devDependencies": {
"@types/mocha": "^9.0.0",
"@types/node": "^14.17.34",
"@types/vscode": "^1.0.0",
"glob": "^7.2.0",
"mocha": "^9.1.3",
"typescript": "^4.5.2",
"vscode-test": "^1.6.1"
},
"__metadata": {
"installedTimestamp": 1739122836311,
"size": 1822169
}
}

View File

@@ -0,0 +1,30 @@
# This is a basic workflow to help you get started with Actions
name: CI
# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
push:
branches: [master]
jobs:
test:
name: Test
strategy:
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: 16
- name: Install dependencies
run: npm install
- name: Run headless test
uses: coactions/setup-xvfb@v1
with:
run: npm test

View File

@@ -0,0 +1,30 @@
# This is a basic workflow to help you get started with Actions
name: CI
# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
pull_request:
branches: [master]
jobs:
test:
name: Test
strategy:
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: 16
- name: Install dependencies
run: npm install
- name: Run headless test
uses: coactions/setup-xvfb@v1
with:
run: npm test

View File

@@ -0,0 +1,34 @@
# This is a basic workflow to help you get started with Actions
name: Release
# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
workflow_dispatch:
jobs:
publish:
name: Release and publish
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: 16
- name: Install dependencies
run: npm install
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN }}
run: npx semantic-release
- name: Publish
if: success()
run: npm run deploy
env:
VSCE_PAT: ${{ secrets.VSCE_PAT }}
- name: Publish to OpenVSX
if: success()
run: npx ovsx publish -p ${{ secrets.OVSX_PAT }}

View File

@@ -0,0 +1,2 @@
FROM gitpod/workspace-full
RUN sudo apt-get update && sudo apt-get install -y libgtk-3-0 libx11-xcb1 libnss3 libxss1 libasound2 libgbm-dev libdrm2 libxshmfence1 libglu1 xvfb

View File

@@ -0,0 +1,5 @@
image:
file: .gitpod.Dockerfile
tasks:
- init: npm install

View File

@@ -0,0 +1,34 @@
{
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
["@semantic-release/changelog", {
"changelogFile": "CHANGELOG.md",
}],
["@semantic-release/npm",{
"npmPublish":false,
"tarballDir": "dist"
}],
[
"@semantic-release/github",
{
"assets": [
{
"path": "*.vsix",
"label": "PathIntellisense.vsix"
}
]
}
],
[
"@semantic-release/git",
{
"assets": [
"package.json",
"CHANGELOG.md"
],
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
]
]
}

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<Metadata>
<Identity Language="en-US" Id="path-intellisense" Version="2.10.0" Publisher="christian-kohler" />
<DisplayName>Path Intellisense</DisplayName>
<Description xml:space="preserve">Visual Studio Code plugin that autocompletes filenames</Description>
<Tags>__web_extension</Tags>
<Categories>Other</Categories>
<GalleryFlags>Public</GalleryFlags>
<Badges></Badges>
<Properties>
<Property Id="Microsoft.VisualStudio.Code.Engine" Value="^1.43.0" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionDependencies" Value="" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionPack" Value="" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionKind" Value="workspace,web" />
<Property Id="Microsoft.VisualStudio.Code.LocalizedLanguages" Value="" />
<Property Id="Microsoft.VisualStudio.Services.Links.Source" Value="https://github.com/ChristianKohler/PathIntellisense.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.Getstarted" Value="https://github.com/ChristianKohler/PathIntellisense.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.GitHub" Value="https://github.com/ChristianKohler/PathIntellisense.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.Support" Value="https://github.com/ChristianKohler/PathIntellisense/issues" />
<Property Id="Microsoft.VisualStudio.Services.Links.Learn" Value="https://github.com/ChristianKohler/PathIntellisense" />
<Property Id="Microsoft.VisualStudio.Services.GitHubFlavoredMarkdown" Value="true" />
</Properties>
<License>extension/LICENSE.txt</License>
<Icon>extension/icon/path-intellisense.png</Icon>
</Metadata>
<Installation>
<InstallationTarget Id="Microsoft.VisualStudio.Code"/>
</Installation>
<Dependencies/>
<Assets>
<Asset Type="Microsoft.VisualStudio.Code.Manifest" Path="extension/package.json" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Content.Details" Path="extension/README.md" Addressable="true" /><Asset Type="Microsoft.VisualStudio.Services.Content.Changelog" Path="extension/CHANGELOG.md" Addressable="true" /><Asset Type="Microsoft.VisualStudio.Services.Content.License" Path="extension/LICENSE.txt" Addressable="true" /><Asset Type="Microsoft.VisualStudio.Services.Icons.Default" Path="extension/icon/path-intellisense.png" Addressable="true" />
</Assets>
</PackageManifest>

View File

@@ -0,0 +1,189 @@
# [2.10.0](https://github.com/ChristianKohler/PathIntellisense/compare/v2.9.0...v2.10.0) (2024-11-29)
### Features
* tsconfig path support ([33c6acc](https://github.com/ChristianKohler/PathIntellisense/commit/33c6accca9c2d54703028f02c5f2054ce7ba0007))
# [2.9.0](https://github.com/ChristianKohler/PathIntellisense/compare/v2.8.0...v2.9.0) (2024-06-01)
### Features
* added support for NixOS config files ([#229](https://github.com/ChristianKohler/PathIntellisense/issues/229)) ([6aa458c](https://github.com/ChristianKohler/PathIntellisense/commit/6aa458c49a7ed4cfa91b4d380fcbe42e31280526))
# [2.8.0](https://github.com/ChristianKohler/PathIntellisense/compare/v2.7.0...v2.8.0) (2022-02-11)
### Bug Fixes
* **test:** remove suite.only [skip ci] ([7e7fab8](https://github.com/ChristianKohler/PathIntellisense/commit/7e7fab8baf7c43755788e0d725aa2cbad13bf3ae))
* **tests:** add missing await ([1b84521](https://github.com/ChristianKohler/PathIntellisense/commit/1b845218c0f7afb914550ba707ae0de684291b6c))
* **tests:** add missing file ([52f137b](https://github.com/ChristianKohler/PathIntellisense/commit/52f137bd3797a479caf6a459691abf624e096e5e))
* **tests:** add tsconfig settings correctly [skip ci] ([2345cb6](https://github.com/ChristianKohler/PathIntellisense/commit/2345cb66dee832ed85258b8e3a6aa742954f9422))
* **tests:** make tests more robust ([d102c1b](https://github.com/ChristianKohler/PathIntellisense/commit/d102c1ba7532b3d0bd812f3f19265477130efb76))
* **tests:** make them work [skip ci] ([7b7fbb9](https://github.com/ChristianKohler/PathIntellisense/commit/7b7fbb9ea0db0de0c4d6e2a20667b930a0eb043e))
### Features
* **baseUrl:** add extended support ([a2307ad](https://github.com/ChristianKohler/PathIntellisense/commit/a2307ad75429ce20cdc20becd2016f8f8e5c1180)), closes [#196](https://github.com/ChristianKohler/PathIntellisense/issues/196)
# [2.7.0](https://github.com/ChristianKohler/PathIntellisense/compare/v2.6.1...v2.7.0) (2022-01-21)
### Features
* automatically trigger next suggestion ([#195](https://github.com/ChristianKohler/PathIntellisense/issues/195)) ([051d7c8](https://github.com/ChristianKohler/PathIntellisense/commit/051d7c8fe3a2b47afbbd317b9fd50f17dc53679a)), closes [#194](https://github.com/ChristianKohler/PathIntellisense/issues/194)
## [2.6.1](https://github.com/ChristianKohler/PathIntellisense/compare/v2.6.0...v2.6.1) (2022-01-14)
### Bug Fixes
* Improve absolute path handling (mostly-Windows fixes, some QOL) ([#193](https://github.com/ChristianKohler/PathIntellisense/issues/193)) ([c9d7471](https://github.com/ChristianKohler/PathIntellisense/commit/c9d7471fb2802abb0c41691ed44b10fe5cdaeb8c)), closes [#48](https://github.com/ChristianKohler/PathIntellisense/issues/48) [#157](https://github.com/ChristianKohler/PathIntellisense/issues/157) [#51](https://github.com/ChristianKohler/PathIntellisense/issues/51)
# [2.6.0](https://github.com/ChristianKohler/PathIntellisense/compare/v2.5.0...v2.6.0) (2021-11-29)
### Features
* enable virtual workspaces ([86a0426](https://github.com/ChristianKohler/PathIntellisense/commit/86a0426e01baffa29914bfd10daab9ce0c4bd7c5))
# [2.5.0](https://github.com/ChristianKohler/PathIntellisense/compare/v2.4.2...v2.5.0) (2021-11-22)
### Features
* **ignoreTsConfigBaseUrl:** implemented ([fb323d9](https://github.com/ChristianKohler/PathIntellisense/commit/fb323d94e26d6bb988ef86c5a36082e4fe13fc40)), closes [#161](https://github.com/ChristianKohler/PathIntellisense/issues/161)
## [2.4.2](https://github.com/ChristianKohler/PathIntellisense/compare/v2.4.1...v2.4.2) (2021-11-04)
### Bug Fixes
* **windows:** path parse issue ([285ab92](https://github.com/ChristianKohler/PathIntellisense/commit/285ab92f9ffd45fca3df0d037fdc028f108aa560))
* json test newline error ([465d22d](https://github.com/ChristianKohler/PathIntellisense/commit/465d22d2c99ded93f5a6c15ad7d5454bc9b5b615))
* replace deprecated textedit with inserttext ([9df6e6a](https://github.com/ChristianKohler/PathIntellisense/commit/9df6e6ae5250b11052a5007c0de648e0f09c54d8))
## [2.4.1](https://github.com/ChristianKohler/PathIntellisense/compare/v2.4.0...v2.4.1) (2021-10-29)
### Bug Fixes
* loop not awaiting result ([7cb5b70](https://github.com/ChristianKohler/PathIntellisense/commit/7cb5b70732483378648299eac2f556a223a0a04a))
* make sure that fileinfo has isFile set when called ([115e7f4](https://github.com/ChristianKohler/PathIntellisense/commit/115e7f4e835c6f3b34175ab83e12e2601396e5ea))
# [2.4.0](https://github.com/ChristianKohler/PathIntellisense/compare/v2.3.0...v2.4.0) (2021-07-19)
### Features
* add untrustedWorkspaces support ([cb71dc8](https://github.com/ChristianKohler/PathIntellisense/commit/cb71dc8aa5a2dd009ce4a2c0d8289f5c53c3656c))
# [2.3.0](https://github.com/ChristianKohler/PathIntellisense/compare/v2.2.1...v2.3.0) (2020-09-11)
### Bug Fixes
* duplicate function name ([b5f5238](https://github.com/ChristianKohler/PathIntellisense/commit/b5f523851aefed7ae92ff49bc914e261eb3aea77))
### Features
* **mapping:** add support for workspaceFolder placeholders ([b07960e](https://github.com/ChristianKohler/PathIntellisense/commit/b07960e38d70b94218fda76c2b54689593e1e905))
## [2.2.1](https://github.com/ChristianKohler/PathIntellisense/compare/v2.2.0...v2.2.1) (2020-06-12)
### Bug Fixes
* **bundle:** whitelist dependencies ([16c85ae](https://github.com/ChristianKohler/PathIntellisense/commit/16c85ae20bd953462c89bb844d8b876cdbd3114f))
# [2.2.0](https://github.com/ChristianKohler/PathIntellisense/compare/v2.1.6...v2.2.0) (2020-06-05)
### Features
* **build:** enable continous deploy ([335a253](https://github.com/ChristianKohler/PathIntellisense/commit/335a25384b5bace59354ef6683e5b76ab54e124c))
## [2.1.6](https://github.com/ChristianKohler/PathIntellisense/compare/v2.1.5...v2.1.6) (2020-06-05)
### Bug Fixes
- **build:** make sure changelog is updated ([c4da5e9](https://github.com/ChristianKohler/PathIntellisense/commit/c4da5e923890bb340d41aaa836bf1bc5f91050d0))
## v2.0.0
- [Changed] Refactored provider structure
- [Fixed] Multi root workspace support
## v1.4.2
- [Hotfix] Fixed broken intellisense on windows
## v1.4.1
- [Hotfix] Fresh rebuild
## v1.4.0
- [Feature] Added setting to define how to handle absolute paths Fixes [#45](https://github.com/ChristianKohler/PathIntellisense/issues/45), [#55](https://github.com/ChristianKohler/PathIntellisense/issues/55)
## v1.3.0
- [Feature] Files from "files.exclude" are now ignored as well
- [Feature] Basic ts config support
- [Bug] Fixed [#26](https://github.com/ChristianKohler/PathIntellisense/issues/26)
- [Bug] Fixed [#56](https://github.com/ChristianKohler/PathIntellisense/issues/56)
- [Bug] Fixed [#59](https://github.com/ChristianKohler/PathIntellisense/issues/59)
- Perf. improvements
## v1.2.0
- [Feature] Add Option to automatically add a slash after directory. Thank you @koelpinl [#41](https://github.com/ChristianKohler/PathIntellisense/issues/41)
- [Bug] Fixed autocompletion for names with dashes. Thank you @kasperekt [#36](https://github.com/ChristianKohler/PathIntellisense/issues/36)
## v1.1.0
- [Feature] Custom Mappings [#19](https://github.com/ChristianKohler/PathIntellisense/issues/19), [#5](https://github.com/ChristianKohler/PathIntellisense/issues/5)
- [Feature] Setting to enable display of hidden files [#12](https://github.com/ChristianKohler/PathIntellisense/issues/12)
- [Bug] Fixed [#11](https://github.com/ChristianKohler/PathIntellisense/issues/11)
## v1.0.2
- [Bug] Fixed [#15](https://github.com/ChristianKohler/PathIntellisense/issues/15)
- [Bug] Fixed [#16](https://github.com/ChristianKohler/PathIntellisense/issues/16)
## v1.0.1
- Fixed compatibility with VS Code 1.3
## v1.0.0
- [Feature] Added .. on top of each suggestion, Removed trailing slash
- [Bugs] Various bugs fixed
## v0.2.0
- [Feature] Remove file extension within imports (configurable)
## v0.1.0
- Added slash after folders, group by folder and files, file icon
## v0.0.5
- Fixed windows path issue
## v0.0.3
- Fixed unknown publisher issue
## v0.0.2
- Updated Readme.md
## v0.0.1
- Initial

View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2016 Christian Kohler
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,187 @@
# Path Intellisense
Visual Studio Code plugin that autocompletes filenames.
## Installation
In the command palette (cmd-shift-p) select Install Extension and choose Path Intellisense.
To use Path Intellisense instead of the default autocompletion, the following configuration option must be added to your settings:
```javascript
{ "typescript.suggest.paths": false }
{ "javascript.suggest.paths": false }
```
## Usage
![IDE](https://i.giphy.com/iaHeUiDeTUZuo.gif)
## Node packages intellisense
Use [npm intellisense](https://marketplace.visualstudio.com/items?itemName=christian-kohler.npm-intellisense)
## Contributing
Something missing? Found a bug? - Create a pull request or an issue.
[Github](https://github.com/ChristianKohler/PathIntellisense)
[Open in Gitpod](https://gitpod.io/#https://github.com/ChristianKohler/PathIntellisense)
## Are you a windows user?
There is an issue on windows with the period key. See Issue https://github.com/ChristianKohler/NpmIntellisense/issues/12
Add this to the keybinding:
```javascript
{ "key": ".", "command": "" }
```
## TsConfig support
### BaseUrl
Pathintellisense uses the ts.config.compilerOptions.baseUrl as a mapping. So no need to define it twice.
For example:
```markdown
# Folderstructure
src/
module-a
foo.ts
module-b
```
```javascript
// tsconfig
{
"baseUrl": "src",
}
```
would allow to type:
```javascript
{
import {} from "module-a/foo.ts";
}
```
You can disable this behaviour by setting it to true:
```javascript
{
"path-intellisense.ignoreTsConfigBaseUrl": true,
}
```
### Paths
Pathintellisense uses the ts.config.compilerOptions.paths as a mapping.
For example:
```json
{
"compilerOptions": {
"paths": {
"@/*": ["src/*"]
}
}
}
```
Note: Fallbacks are not supported.
## Settings
### File extension in import statements
Path Intellisense removes the file extension by default if the statement is a import statement. To enable file extensions set the following setting to true:
```javascript
{
"path-intellisense.extensionOnImport": true,
}
```
### Show hidden files
Per default, hidden files are not displayed. Set this to true to show hidden files.
```javascript
{
"path-intellisense.showHiddenFiles": true,
}
```
If set to false, PathIntellisense ignores the default "files.exclude" as well:
```javascript
{
"files.exclude": {
"**/*.map.js": true
}
}
```
### Auto slash when navigating to folder
Per default, the autocompletion does not add a slash after a directory.
```javascript
{
"path-intellisense.autoSlashAfterDirectory": false,
}
```
### Automatically trigger next suggestion
When a suggestion was selected, the next suggestion will automatically pop up.
This setting will override the `autoSlashAfterDirectory` setting.
```javascript
{
"path-intellisense.autoTriggerNextSuggestion": false,
}
```
### Absolute paths
Per default, absolute paths are resolved within the current workspace root path.
Set it to false to resolve absolute paths to the disk root path.
```javascript
{
"path-intellisense.absolutePathToWorkspace": true,
}
```
### Mappings
Define custom mappings which can be useful for using absolute paths or in combination with webpack resolve options.
```javascript
{
"path-intellisense.mappings": {
"/": "${workspaceFolder}",
"lib": "${workspaceFolder}/lib",
"global": "/Users/dummy/globalLibs"
},
}
```
Use \${workspaceFolder} when the path should be relative to the current root of the current project. V2.2.1 and lower used \${workspaceRoot}. Newer version support both placeholders.
## History
See changelog
## License
This software is released under [MIT License](https://www.opensource.org/licenses/mit-license.php)

View File

@@ -0,0 +1,60 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
//@ts-check
'use strict';
//@ts-check
/** @typedef {import('webpack').Configuration} WebpackConfig **/
const path = require('path');
const webpack = require('webpack');
module.exports = /** @type WebpackConfig */ {
context: path.dirname(__dirname),
mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production')
target: 'webworker', // extensions run in a webworker context
entry: {
'extension': './src/extension.ts'
},
resolve: {
mainFields: ['module', 'main'],
extensions: ['.ts', '.js'], // support ts-files and js-files
alias: {
},
fallback: {
'assert': require.resolve('assert'),
'path': require.resolve('path-browserify')
}
},
module: {
rules: [{
test: /\.ts$/,
exclude: /node_modules/,
use: [
{
loader: 'ts-loader'
}
]
}]
},
plugins: [
new webpack.ProvidePlugin({
process: 'process/browser',
}),
],
externals: {
'vscode': 'commonjs vscode', // ignored because it doesn't exist
},
performance: {
hints: false
},
output: {
filename: '[name].js',
path: path.join(__dirname, '../dist/web'),
libraryTarget: 'commonjs'
},
devtool: 'nosources-source-map'
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@@ -0,0 +1,2 @@
tidelift: "npm/balanced-match"
patreon: juliangruber

View File

@@ -0,0 +1,21 @@
(MIT)
Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,97 @@
# balanced-match
Match balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!
[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match)
[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match)
[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match)
## Example
Get the first matching pair of braces:
```js
var balanced = require('balanced-match');
console.log(balanced('{', '}', 'pre{in{nested}}post'));
console.log(balanced('{', '}', 'pre{first}between{second}post'));
console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post'));
```
The matches are:
```bash
$ node example.js
{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
{ start: 3,
end: 9,
pre: 'pre',
body: 'first',
post: 'between{second}post' }
{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
```
## API
### var m = balanced(a, b, str)
For the first non-nested matching pair of `a` and `b` in `str`, return an
object with those keys:
* **start** the index of the first match of `a`
* **end** the index of the matching `b`
* **pre** the preamble, `a` and `b` not included
* **body** the match, `a` and `b` not included
* **post** the postscript, `a` and `b` not included
If there's no match, `undefined` will be returned.
If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`.
### var r = balanced.range(a, b, str)
For the first non-nested matching pair of `a` and `b` in `str`, return an
array with indexes: `[ <a index>, <b index> ]`.
If there's no match, `undefined` will be returned.
If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`.
## Installation
With [npm](https://npmjs.org) do:
```bash
npm install balanced-match
```
## Security contact information
To report a security vulnerability, please use the
[Tidelift security contact](https://tidelift.com/security).
Tidelift will coordinate the fix and disclosure.
## License
(MIT)
Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,62 @@
'use strict';
module.exports = balanced;
function balanced(a, b, str) {
if (a instanceof RegExp) a = maybeMatch(a, str);
if (b instanceof RegExp) b = maybeMatch(b, str);
var r = range(a, b, str);
return r && {
start: r[0],
end: r[1],
pre: str.slice(0, r[0]),
body: str.slice(r[0] + a.length, r[1]),
post: str.slice(r[1] + b.length)
};
}
function maybeMatch(reg, str) {
var m = str.match(reg);
return m ? m[0] : null;
}
balanced.range = range;
function range(a, b, str) {
var begs, beg, left, right, result;
var ai = str.indexOf(a);
var bi = str.indexOf(b, ai + 1);
var i = ai;
if (ai >= 0 && bi > 0) {
if(a===b) {
return [ai, bi];
}
begs = [];
left = str.length;
while (i >= 0 && !result) {
if (i == ai) {
begs.push(i);
ai = str.indexOf(a, i + 1);
} else if (begs.length == 1) {
result = [ begs.pop(), bi ];
} else {
beg = begs.pop();
if (beg < left) {
left = beg;
right = bi;
}
bi = str.indexOf(b, i + 1);
}
i = ai < bi && ai >= 0 ? ai : bi;
}
if (begs.length) {
result = [ left, right ];
}
}
return result;
}

View File

@@ -0,0 +1,48 @@
{
"name": "balanced-match",
"description": "Match balanced character pairs, like \"{\" and \"}\"",
"version": "1.0.2",
"repository": {
"type": "git",
"url": "git://github.com/juliangruber/balanced-match.git"
},
"homepage": "https://github.com/juliangruber/balanced-match",
"main": "index.js",
"scripts": {
"test": "tape test/test.js",
"bench": "matcha test/bench.js"
},
"devDependencies": {
"matcha": "^0.7.0",
"tape": "^4.6.0"
},
"keywords": [
"match",
"regexp",
"test",
"balanced",
"parse"
],
"author": {
"name": "Julian Gruber",
"email": "mail@juliangruber.com",
"url": "http://juliangruber.com"
},
"license": "MIT",
"testling": {
"files": "test/*.js",
"browsers": [
"ie/8..latest",
"firefox/20..latest",
"firefox/nightly",
"chrome/25..latest",
"chrome/canary",
"opera/12..latest",
"opera/next",
"safari/5.1..latest",
"ipad/6.0..latest",
"iphone/6.0..latest",
"android-browser/4.2..latest"
]
}
}

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,129 @@
# brace-expansion
[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html),
as known from sh/bash, in JavaScript.
[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion)
[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)
[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/)
[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion)
## Example
```js
var expand = require('brace-expansion');
expand('file-{a,b,c}.jpg')
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
expand('-v{,,}')
// => ['-v', '-v', '-v']
expand('file{0..2}.jpg')
// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
expand('file-{a..c}.jpg')
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
expand('file{2..0}.jpg')
// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
expand('file{0..4..2}.jpg')
// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
expand('file-{a..e..2}.jpg')
// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
expand('file{00..10..5}.jpg')
// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
expand('{{A..C},{a..c}}')
// => ['A', 'B', 'C', 'a', 'b', 'c']
expand('ppp{,config,oe{,conf}}')
// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
```
## API
```js
var expand = require('brace-expansion');
```
### var expanded = expand(str)
Return an array of all possible and valid expansions of `str`. If none are
found, `[str]` is returned.
Valid expansions are:
```js
/^(.*,)+(.+)?$/
// {a,b,...}
```
A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
```js
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
// {x..y[..incr]}
```
A numeric sequence from `x` to `y` inclusive, with optional increment.
If `x` or `y` start with a leading `0`, all the numbers will be padded
to have equal length. Negative numbers and backwards iteration work too.
```js
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
// {x..y[..incr]}
```
An alphabetic sequence from `x` to `y` inclusive, with optional increment.
`x` and `y` must be exactly one character, and if given, `incr` must be a
number.
For compatibility reasons, the string `${` is not eligible for brace expansion.
## Installation
With [npm](https://npmjs.org) do:
```bash
npm install brace-expansion
```
## Contributors
- [Julian Gruber](https://github.com/juliangruber)
- [Isaac Z. Schlueter](https://github.com/isaacs)
## Sponsors
This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)!
Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)!
## License
(MIT)
Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,201 @@
var concatMap = require('concat-map');
var balanced = require('balanced-match');
module.exports = expandTop;
var escSlash = '\0SLASH'+Math.random()+'\0';
var escOpen = '\0OPEN'+Math.random()+'\0';
var escClose = '\0CLOSE'+Math.random()+'\0';
var escComma = '\0COMMA'+Math.random()+'\0';
var escPeriod = '\0PERIOD'+Math.random()+'\0';
function numeric(str) {
return parseInt(str, 10) == str
? parseInt(str, 10)
: str.charCodeAt(0);
}
function escapeBraces(str) {
return str.split('\\\\').join(escSlash)
.split('\\{').join(escOpen)
.split('\\}').join(escClose)
.split('\\,').join(escComma)
.split('\\.').join(escPeriod);
}
function unescapeBraces(str) {
return str.split(escSlash).join('\\')
.split(escOpen).join('{')
.split(escClose).join('}')
.split(escComma).join(',')
.split(escPeriod).join('.');
}
// Basically just str.split(","), but handling cases
// where we have nested braced sections, which should be
// treated as individual members, like {a,{b,c},d}
function parseCommaParts(str) {
if (!str)
return [''];
var parts = [];
var m = balanced('{', '}', str);
if (!m)
return str.split(',');
var pre = m.pre;
var body = m.body;
var post = m.post;
var p = pre.split(',');
p[p.length-1] += '{' + body + '}';
var postParts = parseCommaParts(post);
if (post.length) {
p[p.length-1] += postParts.shift();
p.push.apply(p, postParts);
}
parts.push.apply(parts, p);
return parts;
}
function expandTop(str) {
if (!str)
return [];
// I don't know why Bash 4.3 does this, but it does.
// Anything starting with {} will have the first two bytes preserved
// but *only* at the top level, so {},a}b will not expand to anything,
// but a{},b}c will be expanded to [a}c,abc].
// One could argue that this is a bug in Bash, but since the goal of
// this module is to match Bash's rules, we escape a leading {}
if (str.substr(0, 2) === '{}') {
str = '\\{\\}' + str.substr(2);
}
return expand(escapeBraces(str), true).map(unescapeBraces);
}
function identity(e) {
return e;
}
function embrace(str) {
return '{' + str + '}';
}
function isPadded(el) {
return /^-?0\d/.test(el);
}
function lte(i, y) {
return i <= y;
}
function gte(i, y) {
return i >= y;
}
function expand(str, isTop) {
var expansions = [];
var m = balanced('{', '}', str);
if (!m || /\$$/.test(m.pre)) return [str];
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
var isSequence = isNumericSequence || isAlphaSequence;
var isOptions = m.body.indexOf(',') >= 0;
if (!isSequence && !isOptions) {
// {a},b}
if (m.post.match(/,.*\}/)) {
str = m.pre + '{' + m.body + escClose + m.post;
return expand(str);
}
return [str];
}
var n;
if (isSequence) {
n = m.body.split(/\.\./);
} else {
n = parseCommaParts(m.body);
if (n.length === 1) {
// x{{a,b}}y ==> x{a}y x{b}y
n = expand(n[0], false).map(embrace);
if (n.length === 1) {
var post = m.post.length
? expand(m.post, false)
: [''];
return post.map(function(p) {
return m.pre + n[0] + p;
});
}
}
}
// at this point, n is the parts, and we know it's not a comma set
// with a single entry.
// no need to expand pre, since it is guaranteed to be free of brace-sets
var pre = m.pre;
var post = m.post.length
? expand(m.post, false)
: [''];
var N;
if (isSequence) {
var x = numeric(n[0]);
var y = numeric(n[1]);
var width = Math.max(n[0].length, n[1].length)
var incr = n.length == 3
? Math.abs(numeric(n[2]))
: 1;
var test = lte;
var reverse = y < x;
if (reverse) {
incr *= -1;
test = gte;
}
var pad = n.some(isPadded);
N = [];
for (var i = x; test(i, y); i += incr) {
var c;
if (isAlphaSequence) {
c = String.fromCharCode(i);
if (c === '\\')
c = '';
} else {
c = String(i);
if (pad) {
var need = width - c.length;
if (need > 0) {
var z = new Array(need + 1).join('0');
if (i < 0)
c = '-' + z + c.slice(1);
else
c = z + c;
}
}
}
N.push(c);
}
} else {
N = concatMap(n, function(el) { return expand(el, false) });
}
for (var j = 0; j < N.length; j++) {
for (var k = 0; k < post.length; k++) {
var expansion = pre + N[j] + post[k];
if (!isTop || isSequence || expansion)
expansions.push(expansion);
}
}
return expansions;
}

View File

@@ -0,0 +1,47 @@
{
"name": "brace-expansion",
"description": "Brace expansion as known from sh/bash",
"version": "1.1.11",
"repository": {
"type": "git",
"url": "git://github.com/juliangruber/brace-expansion.git"
},
"homepage": "https://github.com/juliangruber/brace-expansion",
"main": "index.js",
"scripts": {
"test": "tape test/*.js",
"gentest": "bash test/generate.sh",
"bench": "matcha test/perf/bench.js"
},
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
},
"devDependencies": {
"matcha": "^0.7.0",
"tape": "^4.6.0"
},
"keywords": [],
"author": {
"name": "Julian Gruber",
"email": "mail@juliangruber.com",
"url": "http://juliangruber.com"
},
"license": "MIT",
"testling": {
"files": "test/*.js",
"browsers": [
"ie/8..latest",
"firefox/20..latest",
"firefox/nightly",
"chrome/25..latest",
"chrome/canary",
"opera/12..latest",
"opera/next",
"safari/5.1..latest",
"ipad/6.0..latest",
"iphone/6.0..latest",
"android-browser/4.2..latest"
]
}
}

View File

@@ -0,0 +1,4 @@
language: node_js
node_js:
- 0.4
- 0.6

View File

@@ -0,0 +1,18 @@
This software is released under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,62 @@
concat-map
==========
Concatenative mapdashery.
[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)
[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)
example
=======
``` js
var concatMap = require('concat-map');
var xs = [ 1, 2, 3, 4, 5, 6 ];
var ys = concatMap(xs, function (x) {
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
});
console.dir(ys);
```
***
```
[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
```
methods
=======
``` js
var concatMap = require('concat-map')
```
concatMap(xs, fn)
-----------------
Return an array of concatenated elements by calling `fn(x, i)` for each element
`x` and each index `i` in the array `xs`.
When `fn(x, i)` returns an array, its result will be concatenated with the
result array. If `fn(x, i)` returns anything else, that value will be pushed
onto the end of the result array.
install
=======
With [npm](http://npmjs.org) do:
```
npm install concat-map
```
license
=======
MIT
notes
=====
This module was written while sitting high above the ground in a tree.

View File

@@ -0,0 +1,6 @@
var concatMap = require('../');
var xs = [ 1, 2, 3, 4, 5, 6 ];
var ys = concatMap(xs, function (x) {
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
});
console.dir(ys);

View File

@@ -0,0 +1,13 @@
module.exports = function (xs, fn) {
var res = [];
for (var i = 0; i < xs.length; i++) {
var x = fn(xs[i], i);
if (isArray(x)) res.push.apply(res, x);
else res.push(x);
}
return res;
};
var isArray = Array.isArray || function (xs) {
return Object.prototype.toString.call(xs) === '[object Array]';
};

View File

@@ -0,0 +1,43 @@
{
"name" : "concat-map",
"description" : "concatenative mapdashery",
"version" : "0.0.1",
"repository" : {
"type" : "git",
"url" : "git://github.com/substack/node-concat-map.git"
},
"main" : "index.js",
"keywords" : [
"concat",
"concatMap",
"map",
"functional",
"higher-order"
],
"directories" : {
"example" : "example",
"test" : "test"
},
"scripts" : {
"test" : "tape test/*.js"
},
"devDependencies" : {
"tape" : "~2.4.0"
},
"license" : "MIT",
"author" : {
"name" : "James Halliday",
"email" : "mail@substack.net",
"url" : "http://substack.net"
},
"testling" : {
"files" : "test/*.js",
"browsers" : {
"ie" : [ 6, 7, 8, 9 ],
"ff" : [ 3.5, 10, 15.0 ],
"chrome" : [ 10, 22 ],
"safari" : [ 5.1 ],
"opera" : [ 12 ]
}
}
}

View File

@@ -0,0 +1,39 @@
var concatMap = require('../');
var test = require('tape');
test('empty or not', function (t) {
var xs = [ 1, 2, 3, 4, 5, 6 ];
var ixes = [];
var ys = concatMap(xs, function (x, ix) {
ixes.push(ix);
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
});
t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]);
t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]);
t.end();
});
test('always something', function (t) {
var xs = [ 'a', 'b', 'c', 'd' ];
var ys = concatMap(xs, function (x) {
return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ];
});
t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
t.end();
});
test('scalars', function (t) {
var xs = [ 'a', 'b', 'c', 'd' ];
var ys = concatMap(xs, function (x) {
return x === 'b' ? [ 'B', 'B', 'B' ] : x;
});
t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
t.end();
});
test('undefs', function (t) {
var xs = [ 'a', 'b', 'c', 'd' ];
var ys = concatMap(xs, function () {});
t.same(ys, [ undefined, undefined, undefined, undefined ]);
t.end();
});

View File

@@ -0,0 +1,362 @@
### Unreleased [[code][c-unreleased], [diff][d-unreleased]]
[c-unreleased]: https://github.com/json5/json5/tree/master
[d-unreleased]: https://github.com/json5/json5/compare/v2.2.0...HEAD
### v2.2.0 [[code][c2.2.0], [diff][d2.2.0]]
[c2.2.0]: https://github.com/json5/json5/tree/v2.2.0
[d2.2.0]: https://github.com/json5/json5/compare/v2.1.3...v2.2.0
- New: Accurate and documented TypeScript declarations are now included. There
is no need to install `@types/json5`. ([#236], [#244])
### v2.1.3 [[code][c2.1.3], [diff][d2.1.3]]
[c2.1.3]: https://github.com/json5/json5/tree/v2.1.3
[d2.1.3]: https://github.com/json5/json5/compare/v2.1.2...v2.1.3
- Fix: An out of memory bug when parsing numbers has been fixed. ([#228],
[#229])
### v2.1.2 [[code][c2.1.2], [diff][d2.1.2]]
[c2.1.2]: https://github.com/json5/json5/tree/v2.1.2
[d2.1.2]: https://github.com/json5/json5/compare/v2.1.1...v2.1.2
- Fix: Bump `minimist` to `v1.2.5`. ([#222])
### v2.1.1 [[code][c2.1.1], [diff][d2.1.1]]
[c2.1.1]: https://github.com/json5/json5/tree/v2.1.1
[d2.1.1]: https://github.com/json5/json5/compare/v2.0.1...v2.1.1
- New: `package.json` and `package.json5` include a `module` property so
bundlers like webpack, rollup and parcel can take advantage of the ES Module
build. ([#208])
- Fix: `stringify` outputs `\0` as `\\x00` when followed by a digit. ([#210])
- Fix: Spelling mistakes have been fixed. ([#196])
### v2.1.0 [[code][c2.1.0], [diff][d2.1.0]]
[c2.1.0]: https://github.com/json5/json5/tree/v2.1.0
[d2.1.0]: https://github.com/json5/json5/compare/v2.0.1...v2.1.0
- New: The `index.mjs` and `index.min.mjs` browser builds in the `dist`
directory support ES6 modules. ([#187])
### v2.0.1 [[code][c2.0.1], [diff][d2.0.1]]
[c2.0.1]: https://github.com/json5/json5/tree/v2.0.1
[d2.0.1]: https://github.com/json5/json5/compare/v2.0.0...v2.0.1
- Fix: The browser builds in the `dist` directory support ES5. ([#182])
### v2.0.0 [[code][c2.0.0], [diff][d2.0.0]]
[c2.0.0]: https://github.com/json5/json5/tree/v2.0.0
[d2.0.0]: https://github.com/json5/json5/compare/v1.0.1...v2.0.0
- **Major**: JSON5 officially supports Node.js v6 and later. Support for Node.js
v4 has been dropped. Since Node.js v6 supports ES5 features, the code has been
rewritten in native ES5, and the dependence on Babel has been eliminated.
- New: Support for Unicode 10 has been added.
- New: The test framework has been migrated from Mocha to Tap.
- New: The browser build at `dist/index.js` is no longer minified by default. A
minified version is available at `dist/index.min.js`. ([#181])
- Fix: The warning has been made clearer when line and paragraph separators are
used in strings.
- Fix: `package.json5` has been restored, and it is automatically generated and
committed when the version is bumped. A new `build-package` NPM script has
been added to facilitate this.
### v1.0.1 [[code][c1.0.1], [diff][d1.0.1]]
[c1.0.1]: https://github.com/json5/json5/tree/v1.0.1
[d1.0.1]: https://github.com/json5/json5/compare/v1.0.0...v1.0.1
This release includes a bug fix and minor change.
- Fix: `parse` throws on unclosed objects and arrays.
- New: `package.json5` has been removed until an easier way to keep it in sync
with `package.json` is found.
### v1.0.0 [[code][c1.0.0], [diff][d1.0.0]]
[c1.0.0]: https://github.com/json5/json5/tree/v1.0.0
[d1.0.0]: https://github.com/json5/json5/compare/v0.5.1...v1.0.0
This release includes major internal changes and public API enhancements.
- **Major**: JSON5 officially supports Node.js v4 and later. Support for Node.js
v0.10 and v0.12 have been dropped.
- New: Unicode property names and Unicode escapes in property names are
supported. ([#1])
- New: `stringify` outputs trailing commas in objects and arrays when a `space`
option is provided. ([#66])
- New: JSON5 allows line and paragraph separator characters (U+2028 and U+2029)
in strings in order to be compatible with JSON. However, ES5 does not allow
these characters in strings, so JSON5 gives a warning when they are parsed and
escapes them when they are stringified. ([#70])
- New: `stringify` accepts an options object as its second argument. The
supported options are `replacer`, `space`, and a new `quote` option that
specifies the quote character used in strings. ([#71])
- New: The CLI supports STDIN and STDOUT and adds `--out-file`, `--space`, and
`--validate` options. See `json5 --help` for more information. ([#72], [#84],
and [#108])
- New: In addition to the white space characters space `\t`, `\v`, `\f`, `\n`,
`\r`, and `\xA0`, the additional white space characters `\u2028`, `\u2029`,
and all other characters in the Space Separator Unicode category are allowed.
- New: In addition to the character escapes `\'`, `\"`, `\\`, `\b`, `\f`, `\n`,
`\r`, and `\t`, the additional character escapes `\v` and `\0`, hexadecimal
escapes like `\x0F`, and unnecessary escapes like `\a` are allowed in string
values and string property names.
- New: `stringify` outputs strings with single quotes by default but
intelligently uses double quotes if there are more single quotes than double
quotes inside the string. (i.e. `stringify('Stay here.')` outputs
`'Stay here.'` while `stringify('Let\'s go.')` outputs `"Let's go."`)
- New: When a character is not allowed in a string, `stringify` outputs a
character escape like `\t` when available, a hexadecimal escape like `\x0F`
when the Unicode code point is less than 256, or a Unicode character escape
like `\u01FF`, in that order.
- New: `stringify` checks for a `toJSON5` method on objects and, if it exists,
stringifies its return value instead of the object. `toJSON5` overrides
`toJSON` if they both exist.
- New: To `require` or `import` JSON5 files, use `require('json5/lib/register')`
or `import 'json5/lib/register'`. Previous versions used `json5/lib/require`,
which still exists for backward compatibility but is deprecated and will give
a warning.
- New: To use JSON5 in browsers, use the file at `dist/index.js` or
`https://unpkg.com/json5@^1.0.0`.
- Fix: `stringify` properly outputs `Infinity` and `NaN`. ([#67])
- Fix: `isWord` no longer becomes a property of `JSON5` after calling
`stringify`. ([#68] and [#89])
- Fix: `stringify` no longer throws when an object does not have a `prototype`.
([#154])
- Fix: `stringify` properly handles the `key` argument of `toJSON(key)` methods.
`toJSON5(key)` follows this pattern.
- Fix: `stringify` accepts `Number` and `String` objects as its `space`
argument.
- Fix: In addition to a function, `stringify` also accepts an array of keys to
include in the output as its `replacer` argument. Numbers, `Number` objects,
and `String` objects will be converted to a string if they are given as array
values.
### v0.5.1 [[code][c0.5.1], [diff][d0.5.1]]
[c0.5.1]: https://github.com/json5/json5/tree/v0.5.1
[d0.5.1]: https://github.com/json5/json5/compare/v0.5.0...v0.5.1
This release includes a minor fix for indentations when stringifying empty
arrays.
- Fix: Indents no longer appear in empty arrays when stringified. ([#134])
### v0.5.0 [[code][c0.5.0], [diff][d0.5.0]]
[c0.5.0]: https://github.com/json5/json5/tree/v0.5.0
[d0.5.0]: https://github.com/json5/json5/compare/v0.4.0...v0.5.0
This release includes major internal changes and public API enhancements.
- **Major:** JSON5 officially supports Node.js v4 LTS and v5. Support for
Node.js v0.6 and v0.8 have been dropped, while support for v0.10 and v0.12
remain.
- Fix: YUI Compressor no longer fails when compressing json5.js. ([#97])
- New: `parse` and the CLI provide line and column numbers when displaying error
messages. ([#101]; awesome work by [@amb26].)
### v0.4.0 [[code][c0.4.0], [diff][d0.4.0]]
[c0.4.0]: https://github.com/json5/json5/tree/v0.4.0
[d0.4.0]: https://github.com/json5/json5/compare/v0.2.0...v0.4.0
Note that v0.3.0 was tagged, but never published to npm, so this v0.4.0
changelog entry includes v0.3.0 features.
This is a massive release that adds `stringify` support, among other things.
- **Major:** `JSON5.stringify()` now exists!
This method is analogous to the native `JSON.stringify()`;
it just avoids quoting keys where possible.
See the [usage documentation](./README.md#usage) for more.
([#32]; huge thanks and props [@aeisenberg]!)
- New: `NaN` and `-NaN` are now allowed number literals.
([#30]; thanks [@rowanhill].)
- New: Duplicate object keys are now allowed; the last value is used.
This is the same behavior as JSON. ([#57]; thanks [@jordanbtucker].)
- Fix: Properly handle various whitespace and newline cases now.
E.g. JSON5 now properly supports escaped CR and CRLF newlines in strings,
and JSON5 now accepts the same whitespace as JSON (stricter than ES5).
([#58], [#60], and [#63]; thanks [@jordanbtucker].)
- New: Negative hexadecimal numbers (e.g. `-0xC8`) are allowed again.
(They were disallowed in v0.2.0; see below.)
It turns out they *are* valid in ES5, so JSON5 supports them now too.
([#36]; thanks [@jordanbtucker]!)
### v0.2.0 [[code][c0.2.0], [diff][d0.2.0]]
[c0.2.0]: https://github.com/json5/json5/tree/v0.2.0
[d0.2.0]: https://github.com/json5/json5/compare/v0.1.0...v0.2.0
This release fixes some bugs and adds some more utility features to help you
express data more easily:
- **Breaking:** Negative hexadecimal numbers (e.g. `-0xC8`) are rejected now.
While V8 (e.g. Chrome and Node) supported them, it turns out they're invalid
in ES5. This has been [fixed in V8][v8-hex-fix] (and by extension, Chrome
and Node), so JSON5 officially rejects them now, too. ([#36])
- New: Trailing decimal points in decimal numbers are allowed again.
(They were disallowed in v0.1.0; see below.)
They're allowed by ES5, and differentiating between integers and floats may
make sense on some platforms. ([#16]; thanks [@Midar].)
- New: `Infinity` and `-Infinity` are now allowed number literals.
([#30]; thanks [@pepkin88].)
- New: Plus signs (`+`) in front of numbers are now allowed, since it can
be helpful in some contexts to explicitly mark numbers as positive.
(E.g. when a property represents changes or deltas.)
- Fix: unescaped newlines in strings are rejected now.
([#24]; thanks [@Midar].)
### v0.1.0 [[code][c0.1.0], [diff][d0.1.0]]
[c0.1.0]: https://github.com/json5/json5/tree/v0.1.0
[d0.1.0]: https://github.com/json5/json5/compare/v0.0.1...v0.1.0
This release tightens JSON5 support and adds helpful utility features:
- New: Support hexadecimal numbers. (Thanks [@MaxNanasy].)
- Fix: Reject octal numbers properly now. Previously, they were accepted but
improperly parsed as base-10 numbers. (Thanks [@MaxNanasy].)
- **Breaking:** Reject "noctal" numbers now (base-10 numbers that begin with a
leading zero). These are disallowed by both JSON5 and JSON, as well as by
ES5's strict mode. (Thanks [@MaxNanasy].)
- New: Support leading decimal points in decimal numbers.
(Thanks [@MaxNanasy].)
- **Breaking:** Reject trailing decimal points in decimal numbers now. These
are disallowed by both JSON5 and JSON. (Thanks [@MaxNanasy].)
- **Breaking:** Reject omitted elements in arrays now. These are disallowed by
both JSON5 and JSON.
- Fix: Throw proper `SyntaxError` instances on errors now.
- New: Add Node.js `require()` hook. Register via `json5/lib/require`.
- New: Add Node.js `json5` executable to compile JSON5 files to JSON.
### v0.0.1 [[code][c0.0.1], [diff][d0.0.1]]
[c0.0.1]: https://github.com/json5/json5/tree/v0.0.1
[d0.0.1]: https://github.com/json5/json5/compare/v0.0.0...v0.0.1
This was the first implementation of this JSON5 parser.
- Support unquoted object keys, including reserved words. Unicode characters
and escape sequences sequences aren't yet supported.
- Support single-quoted strings.
- Support multi-line strings.
- Support trailing commas in arrays and objects.
- Support comments, both inline and block.
### v0.0.0 [[code](https://github.com/json5/json5/tree/v0.0.0)]
Let's consider this to be Douglas Crockford's original [json_parse.js] — a
parser for the regular JSON format.
[json_parse.js]: https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js
[v8-hex-fix]: http://code.google.com/p/v8/issues/detail?id=2240
[@MaxNanasy]: https://github.com/MaxNanasy
[@Midar]: https://github.com/Midar
[@pepkin88]: https://github.com/pepkin88
[@rowanhill]: https://github.com/rowanhill
[@aeisenberg]: https://github.com/aeisenberg
[@jordanbtucker]: https://github.com/jordanbtucker
[@amb26]: https://github.com/amb26
[#1]: https://github.com/json5/json5/issues/1
[#16]: https://github.com/json5/json5/issues/16
[#24]: https://github.com/json5/json5/issues/24
[#30]: https://github.com/json5/json5/issues/30
[#32]: https://github.com/json5/json5/issues/32
[#36]: https://github.com/json5/json5/issues/36
[#57]: https://github.com/json5/json5/issues/57
[#58]: https://github.com/json5/json5/pull/58
[#60]: https://github.com/json5/json5/pull/60
[#63]: https://github.com/json5/json5/pull/63
[#66]: https://github.com/json5/json5/issues/66
[#67]: https://github.com/json5/json5/issues/67
[#68]: https://github.com/json5/json5/issues/68
[#70]: https://github.com/json5/json5/issues/70
[#71]: https://github.com/json5/json5/issues/71
[#72]: https://github.com/json5/json5/issues/72
[#84]: https://github.com/json5/json5/pull/84
[#89]: https://github.com/json5/json5/pull/89
[#97]: https://github.com/json5/json5/pull/97
[#101]: https://github.com/json5/json5/pull/101
[#108]: https://github.com/json5/json5/pull/108
[#134]: https://github.com/json5/json5/pull/134
[#154]: https://github.com/json5/json5/issues/154
[#181]: https://github.com/json5/json5/issues/181
[#182]: https://github.com/json5/json5/issues/182
[#187]: https://github.com/json5/json5/issues/187
[#196]: https://github.com/json5/json5/issues/196
[#208]: https://github.com/json5/json5/issues/208
[#210]: https://github.com/json5/json5/issues/210
[#222]: https://github.com/json5/json5/issues/222
[#228]: https://github.com/json5/json5/issues/228
[#229]: https://github.com/json5/json5/issues/229
[#236]: https://github.com/json5/json5/issues/236
[#244]: https://github.com/json5/json5/issues/244

View File

@@ -0,0 +1,23 @@
MIT License
Copyright (c) 2012-2018 Aseem Kishore, and [others].
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
[others]: https://github.com/json5/json5/contributors

View File

@@ -0,0 +1,234 @@
# JSON5 JSON for Humans
[![Build Status](https://travis-ci.com/json5/json5.svg)][Build Status]
[![Coverage
Status](https://coveralls.io/repos/github/json5/json5/badge.svg)][Coverage
Status]
The JSON5 Data Interchange Format (JSON5) is a superset of [JSON] that aims to
alleviate some of the limitations of JSON by expanding its syntax to include
some productions from [ECMAScript 5.1].
This JavaScript library is the official reference implementation for JSON5
parsing and serialization libraries.
[Build Status]: https://travis-ci.com/json5/json5
[Coverage Status]: https://coveralls.io/github/json5/json5
[JSON]: https://tools.ietf.org/html/rfc7159
[ECMAScript 5.1]: https://www.ecma-international.org/ecma-262/5.1/
## Summary of Features
The following ECMAScript 5.1 features, which are not supported in JSON, have
been extended to JSON5.
### Objects
- Object keys may be an ECMAScript 5.1 _[IdentifierName]_.
- Objects may have a single trailing comma.
### Arrays
- Arrays may have a single trailing comma.
### Strings
- Strings may be single quoted.
- Strings may span multiple lines by escaping new line characters.
- Strings may include character escapes.
### Numbers
- Numbers may be hexadecimal.
- Numbers may have a leading or trailing decimal point.
- Numbers may be [IEEE 754] positive infinity, negative infinity, and NaN.
- Numbers may begin with an explicit plus sign.
### Comments
- Single and multi-line comments are allowed.
### White Space
- Additional white space characters are allowed.
[IdentifierName]: https://www.ecma-international.org/ecma-262/5.1/#sec-7.6
[IEEE 754]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933
## Short Example
```js
{
// comments
unquoted: 'and you can quote me on that',
singleQuotes: 'I can use "double quotes" here',
lineBreaks: "Look, Mom! \
No \\n's!",
hexadecimal: 0xdecaf,
leadingDecimalPoint: .8675309, andTrailing: 8675309.,
positiveSign: +1,
trailingComma: 'in objects', andIn: ['arrays',],
"backwardsCompatible": "with JSON",
}
```
## Specification
For a detailed explanation of the JSON5 format, please read the [official
specification](https://json5.github.io/json5-spec/).
## Installation
### Node.js
```sh
npm install json5
```
```js
const JSON5 = require('json5')
```
### Browsers
```html
<script src="https://unpkg.com/json5@^2.0.0/dist/index.min.js"></script>
```
This will create a global `JSON5` variable.
## API
The JSON5 API is compatible with the [JSON API].
[JSON API]:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
### JSON5.parse()
Parses a JSON5 string, constructing the JavaScript value or object described by
the string. An optional reviver function can be provided to perform a
transformation on the resulting object before it is returned.
#### Syntax
JSON5.parse(text[, reviver])
#### Parameters
- `text`: The string to parse as JSON5.
- `reviver`: If a function, this prescribes how the value originally produced by
parsing is transformed, before being returned.
#### Return value
The object corresponding to the given JSON5 text.
### JSON5.stringify()
Converts a JavaScript value to a JSON5 string, optionally replacing values if a
replacer function is specified, or optionally including only the specified
properties if a replacer array is specified.
#### Syntax
JSON5.stringify(value[, replacer[, space]])
JSON5.stringify(value[, options])
#### Parameters
- `value`: The value to convert to a JSON5 string.
- `replacer`: A function that alters the behavior of the stringification
process, or an array of String and Number objects that serve as a whitelist
for selecting/filtering the properties of the value object to be included in
the JSON5 string. If this value is null or not provided, all properties of the
object are included in the resulting JSON5 string.
- `space`: A String or Number object that's used to insert white space into the
output JSON5 string for readability purposes. If this is a Number, it
indicates the number of space characters to use as white space; this number is
capped at 10 (if it is greater, the value is just 10). Values less than 1
indicate that no space should be used. If this is a String, the string (or the
first 10 characters of the string, if it's longer than that) is used as white
space. If this parameter is not provided (or is null), no white space is used.
If white space is used, trailing commas will be used in objects and arrays.
- `options`: An object with the following properties:
- `replacer`: Same as the `replacer` parameter.
- `space`: Same as the `space` parameter.
- `quote`: A String representing the quote character to use when serializing
strings.
#### Return value
A JSON5 string representing the value.
### Node.js `require()` JSON5 files
When using Node.js, you can `require()` JSON5 files by adding the following
statement.
```js
require('json5/lib/register')
```
Then you can load a JSON5 file with a Node.js `require()` statement. For
example:
```js
const config = require('./config.json5')
```
## CLI
Since JSON is more widely used than JSON5, this package includes a CLI for
converting JSON5 to JSON and for validating the syntax of JSON5 documents.
### Installation
```sh
npm install --global json5
```
### Usage
```sh
json5 [options] <file>
```
If `<file>` is not provided, then STDIN is used.
#### Options:
- `-s`, `--space`: The number of spaces to indent or `t` for tabs
- `-o`, `--out-file [file]`: Output to the specified file, otherwise STDOUT
- `-v`, `--validate`: Validate JSON5 but do not output JSON
- `-V`, `--version`: Output the version number
- `-h`, `--help`: Output usage information
## Contributing
### Development
```sh
git clone https://github.com/json5/json5
cd json5
npm install
```
When contributing code, please write relevant tests and run `npm test` and `npm
run lint` before submitting pull requests. Please use an editor that supports
[EditorConfig](http://editorconfig.org/).
### Issues
To report bugs or request features regarding the JSON5 data format, please
submit an issue to the [official specification
repository](https://github.com/json5/json5-spec).
To report bugs or request features regarding the JavaScript implementation of
JSON5, please submit an issue to this repository.
## License
MIT. See [LICENSE.md](./LICENSE.md) for details.
## Credits
[Assem Kishore](https://github.com/aseemk) founded this project.
[Michael Bolin](http://bolinfest.com/) independently arrived at and published
some of these same ideas with awesome explanations and detail. Recommended
reading: [Suggested Improvements to JSON](http://bolinfest.com/essays/json.html)
[Douglas Crockford](http://www.crockford.com/) of course designed and built
JSON, but his state machine diagrams on the [JSON website](http://json.org/), as
cheesy as it may sound, gave us motivation and confidence that building a new
parser to implement these ideas was within reach! The original
implementation of JSON5 was also modeled directly off of Dougs open-source
[json_parse.js] parser. Were grateful for that clean and well-documented
code.
[json_parse.js]:
https://github.com/douglascrockford/JSON-js/blob/03157639c7a7cddd2e9f032537f346f1a87c0f6d/json_parse.js
[Max Nanasy](https://github.com/MaxNanasy) has been an early and prolific
supporter, contributing multiple patches and ideas.
[Andrew Eisenberg](https://github.com/aeisenberg) contributed the original
`stringify` method.
[Jordan Tucker](https://github.com/jordanbtucker) has aligned JSON5 more closely
with ES5, wrote the official JSON5 specification, completely rewrote the
codebase from the ground up, and is actively maintaining this project.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More