Skip to content

Instantly share code, notes, and snippets.

@hyrious
Last active December 14, 2023 04:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hyrious/ed20efe9bb0aff510809ae04024b1d01 to your computer and use it in GitHub Desktop.
Save hyrious/ed20efe9bb0aff510809ae04024b1d01 to your computer and use it in GitHub Desktop.
sublime plugin to sort package json on save
import sublime
import sublime_plugin
import json
from collections import OrderedDict
# https://github.com/antfu/eslint-config/blob/main/src/configs/sort.ts
KeyOrder = [
'publisher',
'name',
'displayName',
'type',
'version',
'private',
'packageManager',
'description',
'author',
'license',
'funding',
'homepage',
'repository',
'bugs',
'keywords',
'categories',
'sideEffects',
'exports',
'main',
'module',
'unpkg',
'jsdelivr',
'types',
'typesVersions',
'bin',
'icon',
'files',
'engines',
'activationEvents',
'contributes',
'scripts',
'peerDependencies',
'peerDependenciesMeta',
'dependencies',
'optionalDependencies',
'devDependencies',
'pnpm',
'overrides',
'resolutions',
'husky',
'simple-git-hooks',
'lint-staged',
'eslintConfig',
]
ExportsOrder = [
'types',
'import',
'require',
'default',
]
def make_sorter(order):
def sorter(pair):
(key, value) = pair
try:
return order.index(key)
except:
return key
return sorter
class SortPackageJsonCommand(sublime_plugin.TextCommand):
def run(self, edit):
text = self.view.substr(sublime.Region(0, self.view.size()))
try:
value = sublime.decode_value(text)
except:
return
value = self._sort(value)
new_text = json.dumps(value, indent=2) + '\n'
if new_text != text:
self.view.replace(edit, sublime.Region(0, self.view.size()), new_text)
sublime.set_timeout_async(lambda: self.view.run_command('save'))
def _sort(self, json):
# Sort 'files' array
if 'files' in json:
json['files'] = sorted(json['files'])
# Sort top-level keys
json = OrderedDict(sorted(json.items(), key=make_sorter(KeyOrder)))
# Sort dependencies
for (key, value) in json.items():
if 'dependencies' in key or 'Dependencies' in key or 'overrides' in key:
json[key] = OrderedDict(sorted(value.items()))
# Sort exports
if 'exports' in json and isinstance(json['exports'], dict):
self._sort_exports(json, 'exports')
return json
def _sort_exports(self, json, key):
if isinstance(json[key], dict):
for (key, value) in json[key].items():
self._sort_exports(json[key], key)
json[key] = OrderedDict(sorted(json[key].items(), key=make_sorter(ExportsOrder)))
class SortPackageJsonOnSaveListener(sublime_plugin.ViewEventListener):
def on_post_save(self):
if self.view.file_name().endswith('package.json'):
self.view.run_command('sort_package_json')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment