<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you 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.
-->

# Change Log

All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.

# [0.20.0](https://github.com/apache/superset/compare/v2021.41.0...v0.20.0) (2024-09-09)

### Bug Fixes

- **dependencies:** stopping (and preventing) full lodash library import... now using only method level imports. ([#26710](https://github.com/apache/superset/issues/26710)) ([1d4b8b6](https://github.com/apache/superset/commit/1d4b8b69896776cf8831b8202e69424e14067011))
- **generator:** add lockfile and fix styling issues ([#18073](https://github.com/apache/superset/issues/18073)) ([5bfe2d4](https://github.com/apache/superset/commit/5bfe2d47b0d46d6f561fdae6e803d6929ffe840b))
- **generator:** more cleanup to plugin framework ([#18027](https://github.com/apache/superset/issues/18027)) ([8dea7f5](https://github.com/apache/superset/commit/8dea7f500bea194f55c15c9f1511a35b2c328cd6))
- **plugin-generator:** Addresses linter errors in newly generated Superset plugin ([#23513](https://github.com/apache/superset/issues/23513)) ([de42c11](https://github.com/apache/superset/commit/de42c11f99355e5fba2c2162ff180ee273801766))

### Features

- **build:** uplift Lerna + replace insecure shortid with nanoid + uplift Yeoman-related packages + ESM-ize generator-superset ([#29419](https://github.com/apache/superset/issues/29419)) ([c30ca53](https://github.com/apache/superset/commit/c30ca534a38f624bfc87fcfa1c1161b542115822))

# [0.19.0](https://github.com/apache/superset/compare/v2021.41.0...v0.19.0) (2024-09-07)

### Bug Fixes

- **dependencies:** stopping (and preventing) full lodash library import... now using only method level imports. ([#26710](https://github.com/apache/superset/issues/26710)) ([1d4b8b6](https://github.com/apache/superset/commit/1d4b8b69896776cf8831b8202e69424e14067011))
- **generator:** add lockfile and fix styling issues ([#18073](https://github.com/apache/superset/issues/18073)) ([5bfe2d4](https://github.com/apache/superset/commit/5bfe2d47b0d46d6f561fdae6e803d6929ffe840b))
- **generator:** more cleanup to plugin framework ([#18027](https://github.com/apache/superset/issues/18027)) ([8dea7f5](https://github.com/apache/superset/commit/8dea7f500bea194f55c15c9f1511a35b2c328cd6))
- **plugin-generator:** Addresses linter errors in newly generated Superset plugin ([#23513](https://github.com/apache/superset/issues/23513)) ([de42c11](https://github.com/apache/superset/commit/de42c11f99355e5fba2c2162ff180ee273801766))

### Features

- **build:** uplift Lerna + replace insecure shortid with nanoid + uplift Yeoman-related packages + ESM-ize generator-superset ([#29419](https://github.com/apache/superset/issues/29419)) ([c30ca53](https://github.com/apache/superset/commit/c30ca534a38f624bfc87fcfa1c1161b542115822))

# [0.18.0](https://github.com/apache-superset/superset-ui/compare/v0.17.87...v0.18.0) (2021-08-30)

**Note:** Version bump only for package @superset-ui/generator-superset
