diff --git a/cli/src/generate/grammar_files.rs b/cli/src/generate/grammar_files.rs index 34e93d00..a3db4224 100644 --- a/cli/src/generate/grammar_files.rs +++ b/cli/src/generate/grammar_files.rs @@ -104,7 +104,7 @@ pub fn generate_grammar_files( ) -> Result<()> { let dashed_language_name = language_name.to_kebab_case(); - // Create package.json, or update it with new binding path + // Create or update package.json let package_json_path_state = missing_path_else( repo_path.join("package.json"), |path| generate_file(path, PACKAGE_JSON_TEMPLATE, dashed_language_name.as_str()), @@ -117,7 +117,9 @@ pub fn generate_grammar_files( && (package_json .get("dependencies") .map_or(false, |d| d.get("nan").is_some()) - || package_json.get("types").is_none()); + || !package_json.contains_key("peerDependencies") + || !package_json.contains_key("types") + || !package_json.contains_key("files")); if package_json_needs_update { let dependencies = package_json .entry("dependencies".to_string()) @@ -125,19 +127,64 @@ pub fn generate_grammar_files( let dependencies = dependencies.as_object_mut().unwrap(); if dependencies.remove("nan").is_some() { eprintln!("Replacing package.json's nan dependency with node-addon-api"); + dependencies.insert( + "node-addon-api".to_string(), + Value::String("^7.1.0".to_string()), + ); + } + + // insert `peerDependencies` after `dependencies` + if !package_json.contains_key("peerDependencies") { + eprintln!("Adding peerDependencies to package.json"); + let mut peer_dependencies = Map::new(); + peer_dependencies.insert( + "tree-sitter".to_string(), + Value::String("^0.21.0".to_string()), + ); + package_json = insert_after( + package_json, + "peerDependencies", + "dependencies", + Value::Object(peer_dependencies), + ); + + let mut tree_sitter_meta = Map::new(); + tree_sitter_meta.insert("optional".to_string(), Value::Bool(true)); + let mut peer_dependencies_meta = Map::new(); + peer_dependencies_meta + .insert("tree_sitter".to_string(), Value::Object(tree_sitter_meta)); + package_json = insert_after( + package_json, + "peerDependencies", + "dependencies", + Value::Object(peer_dependencies_meta), + ); } - dependencies.insert( - "node-addon-api".to_string(), - Value::String("^7.1.0".to_string()), - ); // insert `types` right after `main` - package_json = insert_after( - package_json, - "types", - "main", - Value::String("bindings/node".to_string()), - ); + if !package_json.contains_key("types") { + eprintln!("Adding types to package.json"); + package_json = insert_after( + package_json, + "types", + "main", + Value::String("bindings/node".to_string()), + ); + } + + // insert `files` right after `keywords` + if !package_json.contains_key("files") { + eprintln!("Adding files to package.json"); + let files = Value::Array(vec![ + Value::String("grammar.js".to_string()), + Value::String("binding.gyp".to_string()), + Value::String("types/dsl.d.ts".to_string()), + Value::String("bindings/node/*".to_string()), + Value::String("queries/*".to_string()), + Value::String("src/**".to_string()), + ]); + package_json = insert_after(package_json, "files", "keywords", files); + } let mut package_json_str = serde_json::to_string_pretty(&package_json)?; package_json_str.push('\n'); diff --git a/cli/src/generate/templates/gitattributes b/cli/src/generate/templates/gitattributes index 9f71c8f1..ffb52abe 100644 --- a/cli/src/generate/templates/gitattributes +++ b/cli/src/generate/templates/gitattributes @@ -8,3 +8,4 @@ bindings/** linguist-generated binding.gyp linguist-generated setup.py linguist-generated Makefile linguist-generated +Package.swift linguist-generated diff --git a/cli/src/generate/templates/package.json b/cli/src/generate/templates/package.json index f44540b8..234b519c 100644 --- a/cli/src/generate/templates/package.json +++ b/cli/src/generate/templates/package.json @@ -4,8 +4,14 @@ "description": "CAMEL_PARSER_NAME grammar for tree-sitter", "repository": "github:tree-sitter/tree-sitter-PARSER_NAME", "license": "MIT", - "types": "bindings/node", "main": "bindings/node", + "types": "bindings/node", + "keywords": [ + "incremental", + "parsing", + "tree-sitter", + "LOWER_PARSER_NAME" + ], "files": [ "grammar.js", "binding.gyp", @@ -14,18 +20,20 @@ "queries/*", "src/**" ], - "keywords": [ - "incremental", - "parsing", - "tree-sitter", - "LOWER_PARSER_NAME" - ], "dependencies": { "node-addon-api": "^7.1.0" }, "devDependencies": { "tree-sitter-cli": "^CLI_VERSION" }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } + }, "scripts": { "build": "tree-sitter generate --no-bindings", "build-wasm": "tree-sitter build-wasm",