From 6057f956e66ac4441f7080a0d8a3a765938fc624 Mon Sep 17 00:00:00 2001
From: Raul Jimenez Ortega
Date: Thu, 19 Oct 2023 12:08:55 +0200
Subject: [PATCH 01/11] docs: fixes typos and extends info in tooltips
---
builder/index.html | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/builder/index.html b/builder/index.html
index d7c7f2b..f152df4 100644
--- a/builder/index.html
+++ b/builder/index.html
@@ -40,7 +40,7 @@
Custom Snippet
Prefix *
+ >Prefix*Custom Snippet
Prefix
Defines one or more trigger words that display the
- snippet in IntelliSense. Substring matching is performed on
- prefixes, so in this case, "fc" could match "for-const".
+ snippet in IntelliSense. Approximate string matching (fuzzy search) is performed on
+ prefixes, so in this case, "fl" could match "FeatureLayer".
- Recomendations
+ Recommendations
Good prefixes are short and easy to remember, so you can
include the name of the method, class or property. Avoid
- using just acronyms.
+ using just acronyms. E.g. MapView, basemapsWithAPIKeys, findLayerByTitle, popupTemplateProps.
@@ -74,7 +74,7 @@
Custom Snippet
- Name *
+ Name*Custom Snippet
Short description that follows the prefix.
- Recomendations
- To differentiate from other IntelliSense we recommend you to
- include (Esri JSAPI)
+ Recommendations
+ Use plain English, using spaces as needed (length <35 characters). E.g. "Find layer in a MapView by title"
@@ -118,8 +117,8 @@
Custom Snippet
IntelliSense.
- Recomendations
- Explain of what the snippet does, but keep it short.
+ Recommendations
+ Explain of what the snippet does. Reuse text from the API reference whenever possible. Add AMD and ESM paths if it is a class initialization (new ...)
@@ -131,11 +130,11 @@
Custom Snippet
>
-
+
- Body *
+ Body* (Prettier playground)
Custom Snippet
which the snippet is inserted.
- Recomendations
+ Recommendations
Use "Placeholders" (${1:foo}) and "Choices" (${1|value1,value2}) when possible.
From d36de92dc995f9a4929080081cd8298b2304382a Mon Sep 17 00:00:00 2001
From: Raul Jimenez Ortega
Date: Thu, 19 Oct 2023 18:56:26 +0200
Subject: [PATCH 02/11] docs: replace link to deprecated extension, improve
usage, other minor changes
---
README.md | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/README.md b/README.md
index 232a6e3..bfdf2d6 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ Visual Studio Code extension that contains a collection of snippets for common c
To use this extension you will need to install:
1. [Visual Studio Code](https://code.visualstudio.com/download) (version 1.35 or higher).
2. The extension. There are two possibilities:
- - From the [Visual Studio Code marketplace](https://marketplace.visualstudio.com/items?itemName=Esri.arcgis-jsapi-snippets).
+ - From the [Visual Studio Code marketplace](https://marketplace.visualstudio.com/items?itemName=Esri.arcgis-maps-sdk-js-snippets).
- Using the ***[Install from VSIX](https://code.visualstudio.com/docs/editor/extension-marketplace#_install-from-a-vsix)*** command in Visual Studio Code then import the [arcgis-jsapi-snippets-1.0.0.vsix](./arcgis-jsapi-snippets-1.0.0.vsix) file.
### Usage
@@ -39,12 +39,15 @@ To use this extension you will need to install:
After installing, there are two ways to use it:
**Option 1**) Using [built-in VS Code Intellisense](https://code.visualstudio.com/docs/languages/javascript#_intellisense):
-1. Start typing the prefix for the code snippet.
-2. Select the snippet by pressing `Tab` or `Enter` key.
+1. Create an empty project with an empty `index.js` file.
+2. Start typing one the prefix of one the [available code snippets](#snippets-available). (e.g. `elev`).
+3. Select the snippet by pressing `Tab` or `Enter` key.
+4. If there are values highlighted in gray, you can move between them using `Tab` (forward) and `Shift+Tab` (backwards).
-> **Notes:**
+> **Troubleshooting:**
+> If the Intellisense doesn't work:
> - Make sure to have `"editor.tabCompletion": "on"` in the settings (`Preferences` > `Open Settings(JSON)`)
> - If pressing Tab doesn't work then you might have several snippets with the same prefix. Press `Ctrl-Space` (`Cmd-Space` on mac) to select the one you need.
>
@@ -58,12 +61,6 @@ This extension adds a new option to the activity bar that lets you quickly brows
-### Configuration
-
-If you want to create you own custom snippets you can do so. Read [about User defined snippets in Visual Studio official documentation](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_create-your-own-snippets).
-
-If you do so, please consider [contributing to this repository](#contributing) or join [other developers sharing their snippets](#community-snippets).
-
## Snippets available
### [HTML snippets](snippets/html.json)
@@ -172,14 +169,18 @@ If you do so, please consider [contributing to this repository](#contributing) o
## Issues
-If something isn't working the way you expected, please take a look at [previously logged issues](https://github.com/Esri/arcgis-js-vscode-snippets/issues/) first. Have you found a new bug? Want to request a new feature? [Open a new issue](https://github.com/Esri/arcgis-js-vscode-snippets/issues/), we'd love to hear from you.
-
-If you're looking for help you can also post issues on Stack Overflow with the "[**esri-oss**](https://stackoverflow.com/questions/tagged/esri-oss)" tag.
+If something isn't working the way you expected, please take a look at [previously logged issues](https://github.com/Esri/arcgis-js-vscode-snippets/issues/) first. Have you found a new bug? Want to request an enhancement to an existing snippet? Suggest a new snippet or tool? [Open a new issue](https://github.com/Esri/arcgis-js-vscode-snippets/issues/new/choose), we'd love to hear from you.
## Contributing
Esri welcomes contributions from anyone and everyone. Please see our [guidelines for contributing](./CONTRIBUTING.md).
+### Additional resources
+
+To learn more about **general use of code snippets in Visual Studio Code** read [Visual Studio official documentation](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_create-your-own-snippets).
+
+If you create your own custom code snippets to work with the ArcGIS Maps SDK for JavaScript, please consider [contributing to this repository](#contributing) or join [other developers sharing their snippets](#community-snippets).
+
## License
Copyright 2023 Esri
From 3f26a52718b0a57cffac0f1a8129aee51a9cd42e Mon Sep 17 00:00:00 2001
From: Raul Jimenez Ortega
Date: Thu, 19 Oct 2023 19:51:32 +0200
Subject: [PATCH 03/11] doc: adds development environment and improve
contributing guidelines
---
.vscode/development.code-snippets | 99 +++++++++++++++++
CONTRIBUTING.md | 175 +++++++++++++++++++++---------
dev/README.md | 148 +++++++++++++++++++++++++
dev/playgrounds/config.json | 2 +
dev/playgrounds/data.geojson | 2 +
dev/playgrounds/index.html | 18 +++
dev/playgrounds/index.ts | 1 +
dev/playgrounds/index.tsx | 1 +
dev/playgrounds/main.scss | 1 +
dev/sample-app.html | 71 ++++++++++++
10 files changed, 465 insertions(+), 53 deletions(-)
create mode 100644 .vscode/development.code-snippets
create mode 100644 dev/README.md
create mode 100644 dev/playgrounds/config.json
create mode 100644 dev/playgrounds/data.geojson
create mode 100644 dev/playgrounds/index.html
create mode 100644 dev/playgrounds/index.ts
create mode 100644 dev/playgrounds/index.tsx
create mode 100644 dev/playgrounds/main.scss
create mode 100644 dev/sample-app.html
diff --git a/.vscode/development.code-snippets b/.vscode/development.code-snippets
new file mode 100644
index 0000000..9bec482
--- /dev/null
+++ b/.vscode/development.code-snippets
@@ -0,0 +1,99 @@
+{
+ // Develop / test your contributions here
+
+ // JavaScript only snippet (*.js)
+ "A JavaScript only snippet": {
+ "scope": "javascript",
+ "prefix": "myConsoleLog",
+ "body": [
+ "console.log(\"Hello Map\");"
+ ],
+ "description": "Console log \"Hello Map\""
+ },
+
+ // HTML only snippet (*.html and *.htm)
+ "A HTML only snippet": {
+ "scope": "html",
+ "prefix": "dojoConfig",
+ "body": [
+ ""
+ ],
+ "description": "Loads dojoConfig"
+ },
+
+ // CSS only snippet (*.css)
+ "A CSS only snippet": {
+ "scope": "css",
+ "prefix": "smallMap",
+ "body": [
+ ".viewDiv{ width: 300px; height: 300px }"
+ ],
+ "description": "Set viewDiv to 300px x 300px"
+ },
+
+ // JSON only snippet (*.json and *.geojson)
+ "A JSON only snippet": {
+ "scope": "json",
+ "prefix": "featureCollectionPoint",
+ "body": [
+ "{",
+ "\t\"type\": \"FeatureCollection\",",
+ "\t\"features\": [",
+ "\t\t{",
+ "\t\t\t\"type\": \"Feature\",",
+ "\t\t\t\"properties\": {},",
+ "\t\t\t\"geometry\": {",
+ "\t\t\t\t\"coordinates\": [",
+ "\t\t\t\t\t-4.795935418929616,",
+ "\t\t\t\t\t38.74031154905251",
+ "\t\t\t\t],",
+ "\t\t\t\t\"type\": \"Point\"",
+ "\t\t\t}",
+ "\t\t}",
+ "\t]",
+ "}",
+ ],
+ "description": "Sample of camera position object"
+ },
+
+ // TypeScript (*.ts)
+ "A TypeScript only snippet": {
+ "scope": "typescript",
+ "body": [
+ "declare function myDebug(value: any): void;"
+ ],
+ "description": "Example using any and void",
+ "prefix": "myDebug"
+ },
+
+ // TypeScript React (*.tsx)
+ "A TypeScript only snippet": {
+ "scope": "typescriptreact",
+ "body": [
+ "const HelloWorld = () =>
Hello, World!
",
+ "export default HelloWorld",
+ ],
+ "description": "Hello world usint TypeScript and React",
+ "prefix": "helloWorldTSX"
+ },
+
+ // SCSS only snippet (*.scss)
+ "A SCSS snippet": {
+ "scope": "scss",
+ "prefix": "smallMap",
+ "body": [
+ ".viewDiv{ width: 400px; height: 400px }"
+ ],
+ "description": "Set viewDiv to 400px x 400px"
+ },
+}
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 15d59e0..c42ab02 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -7,14 +7,17 @@ Esri welcomes contributions from anyone and everyone. Please see our [guidelines
**Table of Contents**
- [I want to contribute, what should I work on?](#i-want-to-contribute-what-should-i-work-on)
-- [Getting a development environment set up](#getting-a-development-environment-set-up)
-- [Adding a new snippet](#adding-a-new-snippet)
+- [Type of snippets accepted](#type-of-snippets-accepted)
+- [Development environment](#development-environment)
+- [Add your changes](#add-your-changes)
+- [Commit message format](#commit-message-format)
+- [Pull request](#pull-request)
- [Conventions](#conventions)
- [`prefix`](#prefix)
- [`name`](#name)
- [`description`](#description)
- [`body`](#body)
-- [Pull request](#pull-request)
+- [FAQ](#faq)
- [Additional resources](#additional-resources)
@@ -30,18 +33,7 @@ You can help mostly by:
* Comment on the issue and check if any additional context is needed before you start working. This will also help everyone knows that you are already working on it.
* Sharing your own list to the [community snippets](https://github.com/Esri/arcgis-js-vscode-snippets#community-snippets)
-## Getting a development environment set up
-
-> **Note**: to avoid conflicts, we do not recommend editing the local installation of the plugin placed in (`~/.vscode/extensions/esri.arcgis-jsapi-snippets-version`)
-
-**Steps:**
-
-1. In VSCode show command palette pressing: `Cmd + Shift + P` (Windows: `Ctrl + Shift + P`) then type/select `Preferences: Configure User Snippets`.
-2. Select your preferred option, `New Global Snippets file...` or the folder you want to place the snippets file.
-3. Depending on the type of snippet you want to add, you need to type: `html.json`, `javascript.json`, `json.json`, `typescript.json` or `typescriptreact.json.`
-4. Now you can test it there. You will need to use the command palette again but instead, type `Developer: Reload Window` for VSCode to recognize the new snippet.
-
-## Adding a new snippet
+## Type of snippets accepted
We accept different type of snippets:
@@ -50,41 +42,126 @@ We accept different type of snippets:
* Common procedures (E.g. query a layer, disable navigation, project a geometry, ...).
* Enumeration of possible values (E.g: basemap styles, renderer and symbol types, ...).
-Consider using the [snippet builder](https://esri.github.io/arcgis-js-vscode-snippets/builder/) to validate your snippet, and please make sure it follows the [conventions](#conventions).
+## Development environment
+
+A local development environment with instructions is provided in the [dev folder](./dev).
+
+## Add your changes
+
+Although it is possible to make your changes directly through the GitHub web interface, we recommend that you add your changes to a local copy of the repository.
+
+**Which branch should I use?**
+If your are not doing a lot of changes you can use `master`, otherwise we encourage you to do the changes in a new branch. Branch name convention:
+* For changes associated with an issue: `/-`.
+* For changes without an associated issue: `/`.
+
+**These are the steps required:**
+
+1. Update the corresponding file in the [snippets folder](./snippets). Depending on the type of snippet, you need to will have to modify: `html.json`, `javascript.json`, `json.json`, `typescript.json`, ...
+ 1. Respects the alphabetical order, snippets are sorted by `name`).
+ 2. Make sure your snippet meets [our conventions]((#conventions)).
+2. Update the snippets table within the [README.md](./README.md) to reflect the changes.
+3. Update the [CHANGELOG.md](./CHANGELOG.md) file to reflect the changes.
+4. Commit your changes.
+
+## Commit message format
+
+This project do not strictly follows [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/), but we will use the format `: description [optional #issue-number]` to generate the changelog. Be sure to provide clear and sufficient information in commit messages.
+
+For `` you should use:
+
+* **feat**: A new snippet or feature
+* **fix**: A bug fix with the snippet
+* **docs**: Documentation only changes (changes in markdown)
+* **style**: Changes that do not affect the meaning of the code (conventions, white-space, formatting, missing semi-colons, etc)
+* **refactor**: A code change that neither fixes a bug nor adds a feature
+
+`description`:
+
+* The subject contains succinct description of the change
+* use the imperative, present tense: "change" not "changed" nor "changes"
+* do not capitalize first letter
+* do not place a period . at the end
+* entire length of the subject must not go over 50 characters
+* describe what the commit does, not what issue it relates to or fixes
+* **be brief, yet descriptive** - we should have a good understanding of what the commit does by reading the subject
+
+**Examples:**
+* `style: apply prefix conventions to all snippets #30`
+* `doc: update contributing guidelines and minor conventions changes #37`
+
+## Pull request
+
+When submitting, if you are working on an issue, remember to [link your PR to it](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue), by use a supported keyword in the pull request description. For example: "`Closes #10`" or "`Fixes Esri/arcgis-js-vscode-snippets#10`".
## Conventions
### `prefix`
+Prefix are the trigger words that display the snippet in the Intellisense:
+
+![Image showing how the prefix shows in VS Code](./builder/assets/snippet-prefix.png)
+
* Avoid acronyms (like `sms` for `SimpleMarkerSymbol`)
-* Use camelcase (not [snake_case](https://en.wikipedia.org/wiki/Snake_case), UPPERCASE, etc.)
+* Use camelCase (not [snake_case](https://en.wikipedia.org/wiki/Snake_case), UPPERCASE, etc.)
* Per snippet type:
* **Class properties objects**: add the suffix "Props".
* **Class constructors**: match JS SDK capitalization.
+**Examples**:
+* Class constructors: `SimpleMarkerSymbol`, `MapView`, ...
+* Class properties objects: `popupTemplateProps`, `featureReductionClusterProps`...
+* Common procedures an enumerations: `basemapsWithAPIKeys`, `findLayerByTitle`, ...
+
> If you want to suggest a change, please [check the issue #10](https://github.com/Esri/arcgis-js-vscode-snippets/issues/10).
### `name`
+Name is the short description that follows the prefix:
+
+![Image showing how the name shows in VS Code](./builder/assets/snippet-name.png)
+
* Start your sentence with capitals (do not capitalize, uppercase)
* Use plain english using spaces as needed (don't use [camelCase](https://en.wikipedia.org/wiki/Camel_case), [snake_case](https://en.wikipedia.org/wiki/Snake_case), [PascalCase](https://www.freecodecamp.org/news/snake-case-vs-camel-case-vs-pascal-case-vs-kebab-case-whats-the-difference/#pascal-case), or [kebab-case](https://en.wikipedia.org/wiki/Letter_case#Kebab_case)).
* Keep the name short as possible (< 35 characters) to avoid ellipsis ("...").
+**Examples**:
+* `City scale 3D callout`
+* `Create class breaks renderer`
+* `Create 3D extruded polygon symbol`
+* `Generate icon Point 3D`
+
> If you want to suggest a change, please [check the issue #20](https://github.com/Esri/arcgis-js-vscode-snippets/issues/20).
### `description`
+Description is a long description that precedes the body:
+
+![Image showing how the description shows in VS Code](./builder/assets/snippet-description.png)
+
* It should be a proper description of what the snippet does, and reuse text from the API reference whenever possible.
-* If it is a snippet related to a class/module include the AMD and ESM paths. For example: `Convert a geometry from Web Mercator units (wkid: 3857) to geographic units (wkid: 4326). AMD path: esri/geometry/support/webMercatorUtils | ESM path: @arcgis/core/geometry/support/webMercatorUtils.js`
+* If it is a snippet related to a class/module include the AMD and ESM paths.
+
+Examples:
+* `Create an instance of MapView using a Map.`
+* `Create an instance of MapView using a WebMap.`
+* `Convert a geometry from Web Mercator units (wkid: 3857) to geographic units (wkid: 4326). AMD path: esri/geometry/support/webMercatorUtils | ESM path: @arcgis/core/geometry/support/webMercatorUtils.js`
+* `Create a PictureFillSymbol with customizable image-based patterns for polygons.`
> If you want to suggest a change, please [check the issue #21](https://github.com/Esri/arcgis-js-vscode-snippets/issues/21).
### `body`
+Body contain the code snippet that will be inserted:
+
+![Image showing how the body shows in VS Code](./builder/assets/snippet-body.png)
+
> If you want to suggest a change, please [check the issue #19](https://github.com/Esri/arcgis-js-vscode-snippets/issues/19).
#### 1) Use `\t` for tabs (do not use spaces)
+> **Note:** You don't have to worry about this if you use the [Snippets Builder](https://esri.github.io/arcgis-js-vscode-snippets/builder/).
+
**Example:**
```js
@@ -105,7 +182,24 @@ Consider using the [snippet builder](https://esri.github.io/arcgis-js-vscode-sni
}
```
-#### 2) Don't add comments in your snippets
+#### 2) Style guide conventions
+
+Follow the ArcGIS Maps SDK for JavaScript coding conventions define in [github.com/esri/jsapi-resources/.prettierrc.json](https://github.com/Esri/jsapi-resources/blob/main/.prettierrc.json):
+
+* **Plain JavaScript**:
+ * Print semicolons at the ends of statements.
+ * Always require parentheses around arrow function arguments ([example](https://eslint.org/docs/latest/rules/arrow-parens)).
+ * Print spaces between brackets in object literals: true ([example](https://prettier.io/docs/en/options.html)).
+ * If at least one property in an object requires quotes, quote all properties.
+ * No [trailing commas](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas) (final commas)
+ * Line length: 120
+* **JavaScript React** (JSX):
+ * Put the \> of a multi-line JSX element at the end of the last line instead of being alone on the next line (does not apply to self closing elements) ([example](https://prettier.io/docs/en/options.html#deprecated-jsx-brackets)).
+ * Line length: 100
+
+We have set [this prettier.io/playground](https://prettier.io/playground/#N4Igxg9gdgLgprEAuEIA0IIAcYEtoDOyoAhgE5kQDuACuQkSiQDZUkCeRGARmSWAGs4MAMokAtnAAyuKHGQAzFgTg8+g4SKz9ZAc2QwyAV1UgV43AeOmCe5nACKRiPEXLTAKwIAPEXcfOrkhKzCoYAI6BcDSUWIzghLgE8IgYhiS4zHoAwhDi4iTIIFDQ8hi2ULr2AIIwhrjcRvA0cGQycm6hpgAWMOLMAOrduPAE2mBwIgwjuABuI+xFYARcILMmAJJQACYIomBkuDjVOyIw7PadYSBYlCoDfFhFt3AqZLNlILJvMDEkugUrqZtGQ3kVuCRuHBmOgbodYANcNsYN1kABGABMAAYMGQ4JFcHi-gDCsF3GlIYjkaikBiMEYVAAVSGMELXODiKHbXbbKQkSpGf5wABiEDIBTqeiKJCaEBAAF95UA) to help you beautify your code.
+
+#### 3) Don't add comments in your snippets
**Example:**
@@ -116,7 +210,7 @@ myLayer.queryFeatures().then(results => {
})
```
-#### 3) Keep snippets small
+#### 4) Keep snippets small
Try not to instantiate more than one class whenever possible. Keeping snippets small helps make them more reusable. So instead of doing this:
@@ -152,7 +246,7 @@ new MapView({
});
```
-#### 4) Conventions for constructor properties
+#### 5) Conventions for constructor properties
* Sort properties by alphabetical order.
* Include what you think are the most common properties.
@@ -173,7 +267,7 @@ new PopupTemplate({
Observe the [PopupTemplate property "content"](https://developers.arcgis.com/javascript/latest/api-reference/esri-PopupTemplate.html#content) include a list of possible values, and `popupContent` will trigger other snippets like:
`popupCustomContent`, `popupMediaContent`, `popupFieldsContent`, `popupTextContent` and `popupAttachmentsContent`.
-#### 5) After a class initialization, don't assign it to a variable
+#### 6) After a class initialization, don't assign it to a variable
Avoid doing this:
@@ -195,7 +289,7 @@ new WebMap({
})
```
-#### 6) For inherited methods, try to make generic snippets.
+#### 7) For inherited methods, try to make generic snippets
For methods like [fromJSON()](https://developers.arcgis.com/javascript/latest/api-reference/esri-renderers-Renderer.html#methods-summary), which is inherited in many classes, for example: SimpleRenderer, UniqueValueRenderer, HeatmapRenderer, ... do something like this:
@@ -203,41 +297,16 @@ For methods like [fromJSON()](https://developers.arcgis.com/javascript/latest/ap
${1|Simple,UniqueValue,ClassBreaks,Dictionary,DotDensity,Heatmap|}Renderer.fromJSON(json)
```
-## Commit message format
-This project do not strictly follows [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/), but we will use the format `: description [optional #issue-number]` to generate the changelog. Be sure to provide clear and sufficient information in commit messages.
+## FAQ
-For `` you should use:
+**I have made a contribution, but I can't find the contribution in the extension deployed in the marketplace. Why?**
-* **feat**: A new snippet or feature
-* **fix**: A bug fix with the snippet
-** **docs**: Documentation only changes (changes in markdown)
-* **style**: Changes that do not affect the meaning of the code (conventions, white-space, formatting, missing semi-colons, etc)
-* **refactor**: A code change that neither fixes a bug nor adds a feature
-
-`description`:
-
-* The subject contains succinct description of the change
-* use the imperative, present tense: "change" not "changed" nor "changes"
-* do not capitalize first letter
-* do not place a period . at the end
-* entire length of the subject must not go over 50 characters
-* describe what the commit does, not what issue it relates to or fixes
-* **be brief, yet descriptive** - we should have a good understanding of what the commit does by reading the subject
-
-Examples:
-`style: apply prefix conventions to all snippets #30`
-`doc: update contributing guidelines and minor conventions changes #37`
-
-## Pull request
+The Esri team have to to deploy a new version of the snippet to the Visual Studio Code marketplace in order to make the changes available to every user of the extension.
-Before each PR follow these steps:
+**Can I modify the local installation of the extension to test my edits?**
+To avoid conflicts and overwrites, we do not recommend editing the local installation of your extension placed in your home folder (`~/.vscode/extensions/esri.arcgis-maps-sdk-js-snippets-VERSION_NO`).
-1. Update the file in the [snippets folder](./snippets) (respects the alphabetical order).
-2. Update the [CHANGELOG.md](./CHANGELOG.md) file to reflect the changes.
-3. Add the info to the [snippets table](./README.md).
-4. Submit your PR.
- * [Link your PR to an issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) if it exists. Use a supported keyword in the pull request description. Ex."`Closes #10`" or "`Fixes Esri/arcgis-js-vscode-snippets#10`".
## Additional resources
diff --git a/dev/README.md b/dev/README.md
new file mode 100644
index 0000000..99ef4d0
--- /dev/null
+++ b/dev/README.md
@@ -0,0 +1,148 @@
+# Development environment
+
+To contribute without messing around with other snippets you might use in other projects, this repo provides a project-folder scoped file (`development.code-snippets`) and several playgrounds to help you test the snippets you are going to contribute.
+
+
+
+**Table of Contents**:
+
+- [Before you get started](#before-you-get-started)
+ - [How Visual Studio Intellisense works](#how-visual-studio-intellisense-works)
+ - [Project folder structure](#project-folder-structure)
+- [Getting started](#getting-started)
+ - [Add a new snippet](#add-a-new-snippet)
+ - [Enhance an existing snippet](#enhance-an-existing-snippet)
+ - [Test a snippet](#test-a-snippet)
+- [Troubleshooting](#troubleshooting)
+- [FAQ](#faq)
+ - [How do I add placeholders to my snippet?](#how-do-i-add-placeholders-to-my-snippet)
+ - [How do I add a dropdown/choices in my snippet?](#how-do-i-add-a-dropdownchoices-in-my-snippet)
+ - [Are there other alternatives to use the `development.code-snippets` file?](#are-there-other-alternatives-to-use-the-developmentcode-snippets-file)
+ - [Are there other alternatives to use the Snippet Builder to generate JSON code?](#are-there-other-alternatives-to-use-the-snippet-builder-to-generate-json-code)
+- [Additional resources](#additional-resources)
+
+
+
+
+## Before you get started
+
+### How Visual Studio Intellisense works
+
+The first thing you should familiarize yourself with, if you have never created a custom snippet in Visual Studio Code, is the different components that make up Intellisense (intelligent code completion) in Visual Studio Code:
+
+![](../builder/assets/use-sample.png)
+
+These fields are shown in the image above: `Name`, `prefix`, `Body`, and `Description`, have to be defined in a JSON object that looks like this:
+
+```js
+"Name": {
+"prefix": "PREFIX",
+"body": [
+ "BODY",
+],
+"description": "Description"
+}
+```
+
+Later on, we will see where we will have to enter this code. To help you creating the snippet code we provide you with an user interface, the [Snippets Builder](https://esri.github.io/arcgis-js-vscode-snippets/builder/).
+
+### Project folder structure
+
+Let's see the most relevant files and folders in this repository and what they contain:
+
+* **[.vscode/](../.vscode/)**: the most important file in this folder is `development.code-snippets` that you will use to test the snippets you will contribute.
+* **[builder/](../builder/)**: this folder include the code of the [Snippets Builder application](https://esri.github.io/arcgis-js-vscode-snippets/builder/).
+* **[dev/](.)**: the folder you are currently in have the files to help you during your development proccess, and the instructions to use them.
+* **[images/](.)**: contains the assets being used in the README files as well as the icon being use in the Visual Studio Code marketplace.
+* **[snippets/](../snippets/)**: this folder have all the available snippets within the official extension that is published (defined in the [package.json file](../package.json)).
+* **[CHANGELOG.md](../CHANGELOG.md)**: this file keeps a log or record of all notable changes made to the project.
+
+## Getting started
+
+First of all, **fork and clone locally** this repository.
+
+### Add a new snippet
+
+* 1\) Within this folder ([dev](./dev)), build a sample app make sure you have tested the code snippet you want to contribute (e.g. [sample-app.html](./sample-app.html)).
+* 2\) Generate the [custom snippet code](#what-is-a-custom-snippet-code) using the [VS Code Snippets Builder](https://esri.github.io/arcgis-js-vscode-snippets/builder/).
+* 3\) Paste your VS Code Snippets JSON syntax into [../.vscode/development.code-snippets](../.vscode/development.code-snippets).
+* 4\) [Test the snippet](#test-a-snippet)
+
+
+### Enhance an existing snippet
+
+To be able to test your modifications, we encourage you to follow these steps, even if you are doing a simple change to the `prefix`, `name`, or `description`.
+
+* 1\) Open the file (from the [snippets folder](../snippets/)) that contains the [custom snippet code](#what-is-a-custom-snippet-code) you are going to enhance, **find it and copy it**.
+* 2\) Paste the snippet into [../.vscode/development.code-snippets](../.vscode/development.code-snippets).
+* 3\) Do the modifications there. Use the [snippets builder](https://esri.github.io/arcgis-js-vscode-snippets/builder/), and add [placeholders](#are-there-other-alternatives-to-use-the-developmentcode-snippets-file), [choices](#how-do-i-add-a-dropdownchoices-in-my-snippet), ... as needed.
+* 4\) [Test the snippet](#test-a-snippet)
+
+### Test a snippet
+
+* 1\) Open in VS Code a file and start typing your snippet prefix. You can use any of the provided files within the folder [playgrounds](./playgrounds/) to test it. Choose the right one based on the type of snippets you want to contribute:
+ * **index.html** for HTML, CSS and JavaScript snippets.
+ * **config.json** or **data.geojson** for JSON snippets.
+ * **main.scss** for SCSS snippets.
+ * **index.ts** for TypeScript snippets.
+ * **index.tsx** for TypeScript React snippets.
+* 2\) If everything works as expected, follow the [steps to add your changes](https://github.com/Esri/arcgis-js-vscode-snippets/blob/master/CONTRIBUTING.md#add-your-changes).
+
+
+## Troubleshooting
+
+If your code snippet doesn't show up:
+* Make sure the developmnet.code-snippets is still a valid JSON. You can test it with [JSONLint](http://jsonlint.com/) (but **remember to remove comments**).
+* Use the command palette (Mac: `Cmd + Shift + P` | Windows/Linux: `Ctrl + Shift + P`) and type Developer: `Reload Window`.
+
+## FAQ
+
+### How do I add placeholders to my snippet?
+
+You have to use the syntax `${1:default_value}`. Example:
+
+```json
+{
+ "Load a new MapView (2D)": {
+ "prefix": "mapView",
+ "body": [
+ "new MapView({",
+ "\tcontainer: \"${1:viewDiv}\",",
+ "\tmap: ${2:map},",
+ "});"
+ ]
+ },
+}
+```
+Learn [more about placeholders](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_placeholders).
+
+### How do I add a dropdown/choices in my snippet?
+
+You have to use the syntax `${1|one,two,three|}`. Example:
+
+```json
+ "Get the API from the CDN": {
+ "prefix": "getApi",
+ "body": [
+ "",
+ ""
+ ],
+ },
+```
+
+Learn [more about choices](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_choice).
+
+### Are there other alternatives to use the `development.code-snippets` file?
+1. In VSCode show command palette pressing: `Cmd + Shift + P` (Windows: `Ctrl + Shift + P`) then type/select `Preferences: Configure User Snippets`.
+2. Select your preferred option, `New Global Snippets file...` or the folder you want to place the snippets file.
+
+### Are there other alternatives to use the Snippet Builder to generate JSON code?
+Yes, you can use any another extension, for example, the [Snippet Generator](https://marketplace.visualstudio.com/items?itemName=wenfangdu.snippet-generator).
+
+## Additional resources
+
+Learn more about:
+* [VS Code Snippets JSON syntax](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax)
+* [Snippets scope (language and project scopes)](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-scope)
+
+
diff --git a/dev/playgrounds/config.json b/dev/playgrounds/config.json
new file mode 100644
index 0000000..50fddb5
--- /dev/null
+++ b/dev/playgrounds/config.json
@@ -0,0 +1,2 @@
+// Test your JSON snippets here (e.g. featureCollectionPoint)
+// Note: Remove this comments afterwards (JSON do not support comments)
diff --git a/dev/playgrounds/data.geojson b/dev/playgrounds/data.geojson
new file mode 100644
index 0000000..68e2b2f
--- /dev/null
+++ b/dev/playgrounds/data.geojson
@@ -0,0 +1,2 @@
+// Test your JSON snippets here (e.g. featureCollectionPoint)
+// Note: Remove this comments afterwards (GeoJSON do not support comments)
diff --git a/dev/playgrounds/index.html b/dev/playgrounds/index.html
new file mode 100644
index 0000000..5209fd7
--- /dev/null
+++ b/dev/playgrounds/index.html
@@ -0,0 +1,18 @@
+
+
+
+
+
+ Development environment
+
+
+
+
+
+
+
+
diff --git a/dev/playgrounds/index.ts b/dev/playgrounds/index.ts
new file mode 100644
index 0000000..fe2fea3
--- /dev/null
+++ b/dev/playgrounds/index.ts
@@ -0,0 +1 @@
+// Test your TypeScript here (e.g. myDebug)
diff --git a/dev/playgrounds/index.tsx b/dev/playgrounds/index.tsx
new file mode 100644
index 0000000..9fe6253
--- /dev/null
+++ b/dev/playgrounds/index.tsx
@@ -0,0 +1 @@
+// Test your TypeScript React here (e.g. helloWorldTSX)
\ No newline at end of file
diff --git a/dev/playgrounds/main.scss b/dev/playgrounds/main.scss
new file mode 100644
index 0000000..7265696
--- /dev/null
+++ b/dev/playgrounds/main.scss
@@ -0,0 +1 @@
+// Test your JavaScript snippets here (e.g. smallMap)
\ No newline at end of file
diff --git a/dev/sample-app.html b/dev/sample-app.html
new file mode 100644
index 0000000..2f94457
--- /dev/null
+++ b/dev/sample-app.html
@@ -0,0 +1,71 @@
+
+
+
+
+
+ Document
+
+
+
+
+
+
+
+
+
From d8d71388eb04bcaf7ae50ab889e7113b5e5dbc49 Mon Sep 17 00:00:00 2001
From: Raul Jimenez Ortega
Date: Fri, 20 Oct 2023 11:30:59 +0200
Subject: [PATCH 04/11] doc: extended doc to suggest new snippets and intro to
VSCode snippets
---
CONTRIBUTING.md | 156 +++++++++++++++++++++--
dev/README.md | 37 ------
images/places-and-choices.png | Bin 0 -> 121562 bytes
images/vscode-intelisense-components.png | Bin 0 -> 37491 bytes
4 files changed, 142 insertions(+), 51 deletions(-)
create mode 100644 images/places-and-choices.png
create mode 100644 images/vscode-intelisense-components.png
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c42ab02..d9fc2c3 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,8 +6,13 @@ Esri welcomes contributions from anyone and everyone. Please see our [guidelines
**Table of Contents**
+- [Before you get started](#before-you-get-started)
+ - [How Visual Studio Intellisense works](#how-visual-studio-intellisense-works)
+ - [Project folder structure](#project-folder-structure)
- [I want to contribute, what should I work on?](#i-want-to-contribute-what-should-i-work-on)
-- [Type of snippets accepted](#type-of-snippets-accepted)
+- [Suggesting new snippets](#suggesting-new-snippets)
+ - [JavaScript and TypeScript snippets](#javascript-and-typescript-snippets)
+ - [Other snippets](#other-snippets)
- [Development environment](#development-environment)
- [Add your changes](#add-your-changes)
- [Commit message format](#commit-message-format)
@@ -22,32 +27,152 @@ Esri welcomes contributions from anyone and everyone. Please see our [guidelines
+## Before you get started
+
+### How Visual Studio Intellisense works
+
+The first thing you should familiarize yourself with, if you have never created a custom snippet in Visual Studio Code, is the most important components that make up Intellisense (intelligent code completion) in Visual Studio Code:
+
+![](./images/vscode-intelisense-components.png)
+
+These fields are shown in the image above: `prefix`, `name`, `description`, and `body`, have to be defined in a JSON object that looks like this:
+
+```json
+"Layer View query features": {
+"prefix": ["layerView", "layerViewQF"],
+"body": [
+ "layerView.queryFeatures().then(function(results){",
+ "\tconsole.log(results.features);",
+ "});",
+],
+"description": "Get features in the layer"
+}
+```
+
+Where:
+* "Layer View query features": is the snippet name. It is displayed via IntelliSense if no `description` is provided
+* `prefix` defines **one or more** trigger words that display the snippet in IntelliSense. Substring matching (fuzzy search) is performed on prefixes, that's why in this case, "lq" matched "layerViewQF"
+* `body` is one or more lines of content, which will be joined as multiple lines upon insertion. Newlines and embedded tabs will be formatted according to the context in which the snippet is inserted.
+* `description` is a description of the snippet displayed by IntelliSense.
+
+> **Note**: there is another optional component ([scope](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-scope)) that can be used to specify in which context ([language](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers)) the snippet is relevant.
+
+To improve accessibility and usability, Visual Studio Code have a special syntax that can be used inside the `body`, for example [placeholders](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_placeholders), and [choices](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_choice):
+![IPlaceholders and Choices](./images/places-and-choices.png)
+
+Later on, we will see in which file(s) we will have to add this code and the user interface we provide to facilitate the creation of the snippet code.
+
+### Project folder structure
+
+The most relevant files and folders in this repository are:
+
+* **[.vscode/](./.vscode/)**: the most important file in this folder is `development.code-snippets` that you will use to test the snippets you will contribute.
+* **[builder/](./builder/)**: this folder include the code of the [Snippets Builder application](https://esri.github.io/arcgis-js-vscode-snippets/builder/).
+* **[dev/](./dev)**: this folder contains the files to help you during your development proccess, and the instructions on how to use them.
+* **[images/](./images/)**: contains the assets being used in the README files as well as the icon being use in the Visual Studio Code marketplace.
+* **[snippets/](./snippets/)**: this folder have all the available snippets within the official extension that is published (defined in the [package.json file](./package.json)).
+* **[CHANGELOG.md](./CHANGELOG.md)**: this file keeps a log or record of all notable changes made to the project.
+
## I want to contribute, what should I work on?
You can help mostly by:
-* Adding ideas for snippets using the [snippet builder](https://esri.github.io/arcgis-js-vscode-snippets/builder/).
-* Requesting updates for existing snippets by creating a [Enhancement issue](https://github.com/Esri/arcgis-js-vscode-snippets/issues/new?assignees=&labels=type%2Fenhancement%2C0+-+new%2Cneeds+triage&projects=&template=enhancement.yml).
-* Reporting problems by creating a [Bug issue](https://github.com/Esri/arcgis-js-vscode-snippets/issues/new?assignees=&labels=type%2Fenhancement%2C0+-+new%2Cneeds+triage&projects=&template=bug.yml).
-* Working on the issues marked as `help wanted`. There is also a `good first issue` label if you are just getting started.
+* **Adding ideas for snippets** using the [snippet builder](https://esri.github.io/arcgis-js-vscode-snippets/builder/). If you are planning to do so, check [Suggesting new snippets](#suggesting-new-snippets).
+* **Requesting enhancements** for existing snippets by creating a [Enhancement issue](https://github.com/Esri/arcgis-js-vscode-snippets/issues/new?assignees=&labels=type%2Fenhancement%2C0+-+new%2Cneeds+triage&projects=&template=enhancement.yml).
+* **Reporting problems** by creating a [Bug issue](https://github.com/Esri/arcgis-js-vscode-snippets/issues/new?assignees=&labels=type%2Fenhancement%2C0+-+new%2Cneeds+triage&projects=&template=bug.yml).
+* **Working on the issues** marked as `help wanted`. There is also a `good first issue` label if you are just getting started.
* Comment on the issue and check if any additional context is needed before you start working. This will also help everyone knows that you are already working on it.
-* Sharing your own list to the [community snippets](https://github.com/Esri/arcgis-js-vscode-snippets#community-snippets)
+* **Sharing your own list of snippets** to the [community snippets](https://github.com/Esri/arcgis-js-vscode-snippets#community-snippets)
+
+## Suggesting new snippets
+
+If you plan to propose new snippets, this section contains an overview of the main type of snippets this extension contains for each language, but if you have any another idea(s), do not hesitate to share them.
+
+### JavaScript and TypeScript snippets
+
+The list below summarize the main type of snippets within [snippets/javascript.json](./snippets/javascript.json), [snippets/typescript.json](./snippets/typescript.json), and [snippets/typescriptreact.json](./snippets/typescriptreact.json).
-## Type of snippets accepted
+**1) Initialization of classes.**
+
+Instantiate an object of a new class like MapView, FeatureLayers, widgets (e.g. Search widget with multple configurations: multiple sources, custom sources, ...).
+
+Examples: `FeatureLayerClientSide`
+
+```js
+new FeatureLayer({
+ fields: [{
+ name: "OBJECTID",
+ type: "oid"
+ }, {
+ name: "${1:url}",
+ type: "string"
+ }],
+ objectIdField: "OBJECTID",
+ popupTemplate: {
+ content: "${2:}"
+ },
+ renderer: ${3:Renderer},
+ source: ${4:graphics},
+});
+```
-We accept different type of snippets:
+**2) JS objects with constructor properties**
+
+JavaScript objects to facilitate class configuration:
+
+Examples: `featureReductionClusterProps`
+
+```js
+{
+ type: "cluster",
+ clusterMaxSize: ${1:37.5},
+ clusterMinSize: ${2:16.5},
+ clusterRadius: ${3:60},
+ labelingInfo: ${4:LabelClass},
+ labelsVisible: true
+ popupEnabled: true,
+ popupTemplate: ${5:PopupTemplate},
+}
+```
+
+**3) Common procedures and programming patterns**
+
+Like query a layer, disable navigation, project a geometry, ...
+
+Example: `queryLayerView`
+
+```js
+view.whenLayerView(${1:fl}).then(function (layerView) {
+ layerView.queryFeatures().then(function (results) {
+ console.log(results.features);
+ });
+});
+```
+**4) Enumeration of possible values**
+
+Snippets to help choosing between multiple enumerations, like [basemap styles](https://developers.arcgis.com/javascript/latest/api-reference/esri-Map.html#basemap), [renderer types](https://developers.arcgis.com/javascript/latest/api-reference/esri-renderers-Renderer.html#type), [symbol types](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-Symbol.html#type), [layer types](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-Layer.html#type), ...
+
+Example: `basemapsWithAPIKeys`
+
+```
+${1|arcgis-imagery,arcgis-imagery-standard,arcgis-imagery-labels,arcgis-light-gray,arcgis-dark-gray,arcgis-navigation,arcgis-navigation-night,arcgis-streets,arcgis-streets-night,arcgis-streets-relief,arcgis-topographic,arcgis-oceans,osm-standard,osm-standard-relief,osm-streets,osm-streets-relief,osm-light-gray,osm-dark-gray,arcgis-terrain,arcgis-community,arcgis-charted-territory,arcgis-colored-pencil,arcgis-nova,arcgis-modern-antique,arcgis-midcentury,arcgis-newspaper,arcgis-hillshade-light,arcgis-hillshade-dark|}
+```
+
+### Other snippets
+
+The list of snippets within [html.json](./snippets/html.json), and [json.json](./snippets/json.json) is short, so we encourage you to check yourself.
-* Initialization of classes. (E.g. `new FeatureLayer({ ... })`).
-* JS objects with constructor properties (`{ url: ... }`).
-* Common procedures (E.g. query a layer, disable navigation, project a geometry, ...).
-* Enumeration of possible values (E.g: basemap styles, renderer and symbol types, ...).
## Development environment
-A local development environment with instructions is provided in the [dev folder](./dev).
+At this point you are almost ready to start doing your contribution.
+
+Go to the [dev folder](./dev), and read the instructions to learn how to setup and use your local development environment.
## Add your changes
+Do you have your contribution ready? If so, keep reading.
+
Although it is possible to make your changes directly through the GitHub web interface, we recommend that you add your changes to a local copy of the repository.
**Which branch should I use?**
@@ -55,7 +180,8 @@ If your are not doing a lot of changes you can use `master`, otherwise we encour
* For changes associated with an issue: `/-`.
* For changes without an associated issue: `/`.
-**These are the steps required:**
+**Checklist before doing a Pull Request**
+Please ensure that you have completed the following steps before making a PR:
1. Update the corresponding file in the [snippets folder](./snippets). Depending on the type of snippet, you need to will have to modify: `html.json`, `javascript.json`, `json.json`, `typescript.json`, ...
1. Respects the alphabetical order, snippets are sorted by `name`).
@@ -92,6 +218,8 @@ For `` you should use:
## Pull request
+> **Reminder**: before doing a PR, ensure that you have completed the checklist included in [Add your changes](#add-your-changes).
+
When submitting, if you are working on an issue, remember to [link your PR to it](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue), by use a supported keyword in the pull request description. For example: "`Closes #10`" or "`Fixes Esri/arcgis-js-vscode-snippets#10`".
## Conventions
diff --git a/dev/README.md b/dev/README.md
index 99ef4d0..8f9d5d1 100644
--- a/dev/README.md
+++ b/dev/README.md
@@ -6,9 +6,6 @@ To contribute without messing around with other snippets you might use in other
**Table of Contents**:
-- [Before you get started](#before-you-get-started)
- - [How Visual Studio Intellisense works](#how-visual-studio-intellisense-works)
- - [Project folder structure](#project-folder-structure)
- [Getting started](#getting-started)
- [Add a new snippet](#add-a-new-snippet)
- [Enhance an existing snippet](#enhance-an-existing-snippet)
@@ -23,40 +20,6 @@ To contribute without messing around with other snippets you might use in other
-
-## Before you get started
-
-### How Visual Studio Intellisense works
-
-The first thing you should familiarize yourself with, if you have never created a custom snippet in Visual Studio Code, is the different components that make up Intellisense (intelligent code completion) in Visual Studio Code:
-
-![](../builder/assets/use-sample.png)
-
-These fields are shown in the image above: `Name`, `prefix`, `Body`, and `Description`, have to be defined in a JSON object that looks like this:
-
-```js
-"Name": {
-"prefix": "PREFIX",
-"body": [
- "BODY",
-],
-"description": "Description"
-}
-```
-
-Later on, we will see where we will have to enter this code. To help you creating the snippet code we provide you with an user interface, the [Snippets Builder](https://esri.github.io/arcgis-js-vscode-snippets/builder/).
-
-### Project folder structure
-
-Let's see the most relevant files and folders in this repository and what they contain:
-
-* **[.vscode/](../.vscode/)**: the most important file in this folder is `development.code-snippets` that you will use to test the snippets you will contribute.
-* **[builder/](../builder/)**: this folder include the code of the [Snippets Builder application](https://esri.github.io/arcgis-js-vscode-snippets/builder/).
-* **[dev/](.)**: the folder you are currently in have the files to help you during your development proccess, and the instructions to use them.
-* **[images/](.)**: contains the assets being used in the README files as well as the icon being use in the Visual Studio Code marketplace.
-* **[snippets/](../snippets/)**: this folder have all the available snippets within the official extension that is published (defined in the [package.json file](../package.json)).
-* **[CHANGELOG.md](../CHANGELOG.md)**: this file keeps a log or record of all notable changes made to the project.
-
## Getting started
First of all, **fork and clone locally** this repository.
diff --git a/images/places-and-choices.png b/images/places-and-choices.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c71bb5ee358153a418d8ffaa9d8605e0ae61476
GIT binary patch
literal 121562
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