Skip to content

Instantly share code, notes, and snippets.

@danielbayley
Last active February 15, 2024 18:16
Show Gist options
  • Save danielbayley/2e22371a0818af67ae93103524f7e0cf to your computer and use it in GitHub Desktop.
Save danielbayley/2e22371a0818af67ae93103524f7e0cf to your computer and use it in GitHub Desktop.
@npmjs `package.json` schema.
# TODO https://gist.github.com/danielbayley/2e22371a0818af67ae93103524f7e0cf
# https://docs.npmjs.com/cli/configuring-npm/package-json
$schema: http://json-schema.org/draft-07/schema #
$id: https://json.schemastore.org/package #.json
title: JSON schema for NPM package.json files
definitions:
person:
description: A person who has been involved in creating or maintaining this package.
type:
- object
- string
required:
- name
properties:
name:
type: string
url:
type: string
format: uri
email:
type: string
format: email
dependency:
description: Dependencies are specified with a simple hash of package name to
version range. The version range is a string which has one or more space-separated
descriptors. Dependencies can also be identified with a tarball or git URL.
type: object
additionalProperties:
type: string
license:
anyOf:
- type: string
- enum:
- AGPL-3.0-only
- Apache-2.0
- BSD-2-Clause
- BSD-3-Clause
- BSL-1.0
- CC0-1.0
- CDDL-1.0
- CDDL-1.1
- EPL-1.0
- EPL-2.0
- GPL-2.0-only
- GPL-3.0-only
- ISC
- LGPL-2.0-only
- LGPL-2.1-only
- LGPL-2.1-or-later
- LGPL-3.0-only
- LGPL-3.0-or-later
- MIT
- MPL-2.0
- MS-PL
- UNLICENSED
scriptsInstallAfter:
description: Run AFTER the package is installed.
type: string
x-intellij-language-injection: Shell Script
scriptsPublishAfter:
description: Run AFTER the package is published.
type: string
x-intellij-language-injection: Shell Script
scriptsRestart:
description: 'Run by the ''npm restart'' command. Note: ''npm restart'' will run
the stop and start scripts if no restart script is provided.'
type: string
x-intellij-language-injection: Shell Script
scriptsStart:
description: Run by the 'npm start' command.
type: string
x-intellij-language-injection: Shell Script
scriptsStop:
description: Run by the 'npm stop' command.
type: string
x-intellij-language-injection: Shell Script
scriptsTest:
description: Run by the 'npm test' command.
type: string
x-intellij-language-injection: Shell Script
scriptsUninstallBefore:
description: Run BEFORE the package is uninstalled.
type: string
x-intellij-language-injection: Shell Script
scriptsVersionBefore:
description: Run BEFORE bump the package version.
type: string
x-intellij-language-injection: Shell Script
packageExportsEntryPath:
type:
- string
- 'null'
description: The module path that is resolved when this specifier is imported.
Set to `null` to disallow importing this module.
pattern: "^\\./"
packageExportsEntryObject:
type: object
description: Used to specify conditional exports, note that Conditional exports
are unsupported in older environments, so it's recommended to use the fallback
array option if support for those environments is a concern.
properties:
require:
$ref: "#/definitions/packageExportsEntryOrFallback"
description: The module path that is resolved when this specifier is imported
as a CommonJS module using the `require(...)` function.
import:
$ref: "#/definitions/packageExportsEntryOrFallback"
description: The module path that is resolved when this specifier is imported
as an ECMAScript module using an `import` declaration or the dynamic `import(...)`
function.
node:
$ref: "#/definitions/packageExportsEntryOrFallback"
description: The module path that is resolved when this environment is Node.js.
default:
$ref: "#/definitions/packageExportsEntryOrFallback"
description: The module path that is resolved when no other export type matches.
types:
$ref: "#/definitions/packageExportsEntryOrFallback"
description: The module path that is resolved for TypeScript types when this
specifier is imported. Should be listed before other conditions.
patternProperties:
"^(?![\\.0-9]).":
$ref: "#/definitions/packageExportsEntryOrFallback"
description: The module path that is resolved when this environment matches
the property name.
additionalProperties: false
packageExportsEntry:
oneOf:
- $ref: "#/definitions/packageExportsEntryPath"
- $ref: "#/definitions/packageExportsEntryObject"
packageExportsFallback:
type: array
description: Used to allow fallbacks in case this environment doesn't support
the preceding entries.
items:
$ref: "#/definitions/packageExportsEntry"
packageExportsEntryOrFallback:
oneOf:
- $ref: "#/definitions/packageExportsEntry"
- $ref: "#/definitions/packageExportsFallback"
fundingUrl:
type: string
format: uri
description: URL to a website with details about how to fund the package.
fundingWay:
type: object
description: Used to inform about ways to help fund development of the package.
properties:
url:
$ref: "#/definitions/fundingUrl"
type:
type: string
description: The type of funding or the platform through which funding can
be provided, e.g. patreon, opencollective, tidelift or github.
additionalProperties: false
required: [url]
type: object
patternProperties:
^_:
description: Any property starting with _ is valid.
tsType: any
properties:
name:
description: The name of the package.
type: string
maxLength: 214
minLength: 1
pattern: ^(?:(?:@(?:[a-z0-9-*~][a-z0-9-*._~]*)?/[a-z0-9-._~])|[a-z0-9-~])[a-z0-9-._~]*$
version:
description: Version must be parseable by node-semver, which is bundled with npm
as a dependency.
type: string
description:
description: This helps people discover your package, as it's listed in 'npm search'.
type: string
keywords:
description: This helps people discover your package as it's listed in 'npm search'.
type: array
items:
type: string
homepage:
description: The url to the project homepage.
type: string
bugs:
description: The url to your project's issue tracker and / or the email address
to which issues should be reported. These are helpful for people who encounter
issues with your package.
type:
- object
- string
properties:
url:
type: string
description: The url to your project's issue tracker.
format: uri
email:
type: string
description: The email address to which issues should be reported.
format: email
license:
$ref: "#/definitions/license"
description: You should specify a license for your package so that people know
how they are permitted to use it, and any restrictions you're placing on it.
licenses:
description: 'DEPRECATED: Instead, use SPDX expressions, like this: { "license":
"ISC" } or { "license": "(MIT OR Apache-2.0)" } see: ''https://docs.npmjs.com/files/package.json#license''.'
type: array
items:
type: object
properties:
type:
$ref: "#/definitions/license"
url:
type: string
format: uri
author:
$ref: "#/definitions/person"
contributors:
description: A list of people who contributed to this package.
type: array
items:
$ref: "#/definitions/person"
maintainers:
description: A list of people who maintains this package.
type: array
items:
$ref: "#/definitions/person"
files:
description: The 'files' field is an array of files to include in your project.
If you name a folder in the array, then it will also include the files inside
that folder.
type: array
items:
type: string
exports:
description: The "exports" field is used to restrict external access to non-exported
module files, also enables a module to import itself using "name".
oneOf:
- $ref: "#/definitions/packageExportsEntryPath"
description: The module path that is resolved when the module specifier matches
"name", shadows the "main" field.
- type: object
properties:
.:
$ref: "#/definitions/packageExportsEntryOrFallback"
description: The module path that is resolved when the module specifier
matches "name", shadows the "main" field.
patternProperties:
^\\./.+:
$ref: "#/definitions/packageExportsEntryOrFallback"
description: The module path prefix that is resolved when the module specifier
starts with "name/", set to "./*" to allow external modules to import
any subpath.
additionalProperties: false
- $ref: "#/definitions/packageExportsEntryObject"
description: The module path that is resolved when the module specifier matches
"name", shadows the "main" field.
- $ref: "#/definitions/packageExportsFallback"
description: The module path that is resolved when the module specifier matches
"name", shadows the "main" field.
main:
description: The main field is a module ID that is the primary entry point to
your program.
type: string
#browser: # https://github.com/defunctzombie/package-browser-field-spec#readme
#type: string | object TODO
bin:
type:
- string
- object
additionalProperties:
type: string
type:
description: When set to "module", the type field allows a package to specify
all .js files within are ES modules. If the "type" field is omitted or set to
"commonjs", all .js files are treated as CommonJS.
type: string
enum:
- commonjs
- module
default: commonjs
types:
description: Set the types property to point to your bundled declaration file.
type: string
typings:
description: Note that the "typings" field is synonymous with "types", and could
be used as well.
type: string
typesVersions:
description: The "typesVersions" field is used since TypeScript 3.1 to support
features that were only made available in newer TypeScript versions.
type: object
additionalProperties:
description: Contains overrides for the TypeScript version that matches the
version range matching the property key.
type: object
properties:
"*":
description: Maps all file paths to the file paths specified in the array.
type: array
items:
type: string
pattern: ^[^*]*(?:\\*[^*]*)?$
additionalProperties: false
patternProperties:
^[^*]+$:
description: Maps the file path matching the property key to the file paths
specified in the array.
type: array
items:
type: string
^[^*]*\\*[^*]*$:
description: Maps file paths matching the pattern specified in property
key to file paths specified in the array.
type: array
items:
type: string
pattern: ^[^*]*(?:\\*[^*]*)?$
man:
type:
- array
- string
description: Specify either a single file or an array of filenames to put in place
for the man program to find.
items:
type: string
directories:
type: object
properties:
bin:
description: If you specify a 'bin' directory, then all the files in that
folder will be used as the 'bin' hash.
type: string
doc:
description: Put markdown files in here. Eventually, these will be displayed
nicely, maybe, someday.
type: string
example:
description: Put example scripts in here. Someday, it might be exposed in
some clever way.
type: string
lib:
description: Tell people where the bulk of your library is. Nothing special
is done with the lib folder in any way, but it's useful meta info.
type: string
man:
type: string
description: A folder that is full of man pages. Sugar to generate a 'man'
array by walking the folder.
test:
type: string
repository:
description: Specify the place where your code lives. This is helpful for people
who want to contribute.
type:
- object
- string
properties:
type:
type: string
url:
type: string
directory:
type: string
funding:
oneOf:
- $ref: "#/definitions/fundingUrl"
- $ref: "#/definitions/fundingWay"
- type: array
items:
oneOf:
- $ref: "#/definitions/fundingUrl"
- $ref: "#/definitions/fundingWay"
minItems: 1
uniqueItems: true
scripts:
description: The 'scripts' member is an object hash of script commands that are
run at various times in the lifecycle of your package. The key is the lifecycle
event, and the value is the command to run at that point.
type: object
properties:
lint:
type: string
description: Run code quality tools, e.g. ESLint, TSLint, etc.
prepublish:
type: string
description: Run BEFORE the package is published (Also run on local npm install
without any arguments).
prepare:
type: string
description: Run both BEFORE the package is packed and published, and on local
npm install without any arguments. This is run AFTER prepublish, but BEFORE
prepublishOnly.
prepublishOnly:
type: string
description: Run BEFORE the package is prepared and packed, ONLY on npm publish.
prepack:
type: string
description: run BEFORE a tarball is packed (on npm pack, npm publish, and
when installing git dependencies).
postpack:
type: string
description: Run AFTER the tarball has been generated and moved to its final
destination.
publish:
type: string
description: Publishes a package to the registry so that it can be installed
by name. See https://docs.npmjs.com/cli/v8/commands/npm-publish
postpublish:
$ref: "#/definitions/scriptsPublishAfter"
preinstall:
type: string
description: Run BEFORE the package is installed.
install:
$ref: "#/definitions/scriptsInstallAfter"
postinstall:
$ref: "#/definitions/scriptsInstallAfter"
preuninstall:
$ref: "#/definitions/scriptsUninstallBefore"
uninstall:
$ref: "#/definitions/scriptsUninstallBefore"
postuninstall:
type: string
description: Run AFTER the package is uninstalled.
preversion:
$ref: "#/definitions/scriptsVersionBefore"
version:
$ref: "#/definitions/scriptsVersionBefore"
postversion:
type: string
description: Run AFTER bump the package version.
pretest:
$ref: "#/definitions/scriptsTest"
test:
$ref: "#/definitions/scriptsTest"
posttest:
$ref: "#/definitions/scriptsTest"
prestop:
$ref: "#/definitions/scriptsStop"
stop:
$ref: "#/definitions/scriptsStop"
poststop:
$ref: "#/definitions/scriptsStop"
prestart:
$ref: "#/definitions/scriptsStart"
start:
$ref: "#/definitions/scriptsStart"
poststart:
$ref: "#/definitions/scriptsStart"
prerestart:
$ref: "#/definitions/scriptsRestart"
restart:
$ref: "#/definitions/scriptsRestart"
postrestart:
$ref: "#/definitions/scriptsRestart"
serve:
type: string
description: Start dev server to serve application files
additionalProperties:
type: string
tsType: string | undefined
x-intellij-language-injection: Shell Script
config:
description: A 'config' hash can be used to set configuration parameters used
in package scripts that persist across upgrades.
type: object
additionalProperties: true
devDependencies:
$ref: "#/definitions/dependency"
dependencies:
$ref: "#/definitions/dependency"
# Skip install failure.
optionalDependencies:
$ref: "#/definitions/dependency"
peerDependencies:
$ref: "#/definitions/dependency"
peerDependenciesMeta:
description: When a user installs your package, warnings are emitted if packages
specified in "peerDependencies" are not already installed. The "peerDependenciesMeta"
field serves to provide more information on how your peer dependencies are utilized.
Most commonly, it allows peer dependencies to be marked as optional. Metadata
for this field is specified with a simple hash of the package name to a metadata
object.
type: object
additionalProperties:
type: object
additionalProperties: true
properties:
optional:
description: Specifies that this peer dependency is optional and should
not be installed automatically.
type: boolean
bundledDependencies:
description: Array of package names that will be bundled when publishing the package.
oneOf:
- type: array
items:
type: string
- type: boolean
bundleDependencies:
description: "DEPRECATED: This field is honored, but "bundledDependencies" is
the correct field name."
oneOf:
- type: array
items:
type: string
- type: boolean
resolutions:
description: 'Resolutions is used to support selective version resolutions using
yarn, which lets you define custom package versions or ranges inside your dependencies.
For npm, use overrides instead. See: https://classic.yarnpkg.com/en/docs/selective-version-resolutions'
type: object
overrides:
type: object
description: "Overrides is used to support selective version overrides using npm,
which lets you define custom package versions or ranges inside your dependencies.
For yarn, use resolutions instead. See: https://docs.npmjs.com/cli/v9/configuring-npm/package-json#overrides"
packageManager:
type: string
pattern: (npm|pnpm|yarn|bun)@\\d+\\.\\d+\\.\\d+(-.+)?
description: Defines which package manager is expected to be used when working
on the current project. This field is currently experimental and needs to be
opted-in; see https://nodejs.org/api/corepack.html
engines:
type: object
properties:
node:
type: string
#pnpm:
#type: string
additionalProperties:
type: string
volta: # https://volta.net/docs/get-started
description: Defines which tools and versions are expected to be used when Volta is installed.
type: object
properties:
extends:
description: The value of that entry should be a path to another JSON file which also has a "volta" section
type: string
patternProperties:
"(node|npm|pnpm|yarn)":
type: string
engineStrict:
type: boolean
os:
description: Specify which operating systems your module will run on.
type: array
items:
type: string
cpu:
description: Specify that your code only runs on certain cpu architectures.
type: array
items:
type: string
preferGlobal:
type: boolean
description: DEPRECATED: This option used to trigger an npm warning, but it will
no longer warn. It is purely there for informational purposes. It is now recommended
that you install any binaries as local devDependencies wherever possible.
private:
description: If set to true, then npm will refuse to publish it.
oneOf:
- type: boolean
- enum:
- "true" # TODO
- "false" # TODO
publishConfig:
type: object
additionalProperties: true
properties:
access:
type: string
enum:
- public
- restricted
tag:
type: string
registry:
type: string
format: uri
dist:
type: object
properties:
shasum:
type: string
tarball:
type: string
readme:
type: string
module:
description: An ECMAScript module ID that is the primary entry point to your program.
type: string
esnext:
description: A module ID with untranspiled code that is the primary entry point
to your program.
type:
- string
- object
properties:
main:
type: string
browser:
type: string
additionalProperties:
type: string
workspaces:
description: "Allows packages within a directory to depend on one another using
direct linking of local files. Additionally, dependencies within a workspace
are hoisted to the workspace root when possible to reduce duplication. Note:
It's also a good idea to set "private" to true when using this feature."
anyOf:
- type: array
description: Workspace package paths. Glob patterns are supported.
items:
type: string
- type: object
properties:
packages:
type: array
description: Workspace package paths. Glob patterns are supported.
items:
type: string
nohoist:
type: array
description: Packages to block from hoisting to the workspace root. Currently
only supported in Yarn only.
items:
type: string
jspm:
$ref: "#"
eslintConfig:
$ref: https://json.schemastore.org/eslintrc.json
prettier:
$ref: https://json.schemastore.org/prettierrc.json
stylelint:
$ref: https://json.schemastore.org/stylelintrc.json
ava:
$ref: https://json.schemastore.org/ava.json
release:
$ref: https://json.schemastore.org/semantic-release.json
jscpd:
$ref: https://json.schemastore.org/jscpd.json
anyOf:
- type: object
not:
required:
- bundledDependencies
- bundleDependencies
- type: object
not:
required:
- bundleDependencies
required:
- bundledDependencies
- type: object
not:
required:
- bundledDependencies
required:
- bundleDependencies
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment