Merge pull request #1774 from handlebars-lang/merge-4.x

Merge branch 4.x into master
This commit is contained in:
Jay Linski
2021-12-29 23:47:46 +01:00
committed by GitHub
103 changed files with 19142 additions and 911 deletions
+4
View File
@@ -5,3 +5,7 @@ indent_size = 2
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true
[*.yml]
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
+1 -2
View File
@@ -4,7 +4,6 @@
*.sublime-project *.sublime-project
*.sublime-workspace *.sublime-workspace
npm-debug.log npm-debug.log
sauce_connect.log*
.idea .idea
yarn-error.log yarn-error.log
node_modules node_modules
@@ -14,7 +13,7 @@ node_modules
# Generated files # Generated files
/coverage/ /coverage/
/dist/ /dist/
/integration-testing/*/dist/ /tests/integration/*/dist/
# Third-party or files that must remain unchanged # Third-party or files that must remain unchanged
/spec/expected/ /spec/expected/
+9
View File
@@ -0,0 +1,9 @@
version: 2
updates:
- package-ecosystem: npm
directory: "/"
open-pull-requests-limit: 0
schedule:
interval: weekly
allow:
- dependency-type: production
+89
View File
@@ -0,0 +1,89 @@
name: CI
on:
push:
branches:
- master
pull_request: {}
jobs:
lint:
name: Lint
runs-on: 'ubuntu-latest'
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '16'
- name: Install dependencies
run: npm ci
- name: Lint
run: npm run lint
test:
name: Test (Node)
runs-on: ${{ matrix.operating-system }}
strategy:
fail-fast: false
matrix:
operating-system: ['ubuntu-latest', 'windows-latest']
# https://nodejs.org/en/about/releases/
node-version: ['10', '12', '14', '16', '17']
steps:
- name: Checkout
uses: actions/checkout@v2
with:
submodules: true
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: npm ci
- name: Test
run: npm run test
- name: Test (Integration)
# https://github.com/webpack/webpack/issues/14532
if: ${{ matrix.node-version != '17' }}
run: |
cd ./tests/integration/rollup-test && ./test.sh && cd -
cd ./tests/integration/webpack-babel-test && ./test.sh && cd -
cd ./tests/integration/webpack-test && ./test.sh && cd -
browser:
name: Test (Browser)
runs-on: 'ubuntu-latest'
steps:
- name: Checkout
uses: actions/checkout@v2
with:
submodules: true
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '16'
- name: Install dependencies
run: npm ci
- name: Install Playwright
run: |
npx playwright install-deps
npx playwright install
- name: Build
run: npx grunt prepare
- name: Test
run: npm run test:browser
+1 -2
View File
@@ -4,7 +4,6 @@
*.sublime-project *.sublime-project
*.sublime-workspace *.sublime-workspace
npm-debug.log npm-debug.log
sauce_connect.log*
.idea .idea
/yarn-error.log /yarn-error.log
/yarn.lock /yarn.lock
@@ -15,5 +14,5 @@ node_modules
# Generated files # Generated files
/coverage/ /coverage/
/dist/ /dist/
/integration-testing/*/dist/ /tests/integration/*/dist/
/spec/tmp/* /spec/tmp/*
+1 -1
View File
@@ -14,7 +14,7 @@ node_modules
# Generated files # Generated files
/coverage/ /coverage/
/dist/ /dist/
/integration-testing/*/dist/ /tests/integration/*/dist/
# Third-party or files that must remain unchanged # Third-party or files that must remain unchanged
/spec/expected/ /spec/expected/
-39
View File
@@ -1,39 +0,0 @@
language: node_js
jobs:
include:
- stage: test
name: check javascript (eslint)
node_js: lts/*
script: npm run lint
- stage: test
name: check formatting (prettier)
node_js: lts/*
script: npm run check-format
- stage: test
name: check typescript definitions (dtslint)
node_js: lts/*
script: npm run dtslint
- stage: test
name: extensive tests and publish to aws
script: npm run extensive-tests-and-publish-to-aws
env:
- S3_BUCKET_NAME=builds.handlebarsjs.com
- secure: ckyEe5dzjdFDjmZ6wIrhGm0CFBEnKq8c1dYptfgVV/Q5/nJFGzu8T0yTjouS/ERxzdT2H327/63VCxhFnLCRHrsh4rlW/rCy4XI3O/0TeMLgFPa4TXkO8359qZ4CB44TBb3NsJyQXNMYdJpPLTCVTMpuiqqkFFOr+6OeggR7ufA=
- secure: Nm4AgSfsgNB21kgKrF9Tl7qVZU8YYREhouQunFracTcZZh2NZ2XH5aHuSiXCj88B13Cr/jGbJKsZ4T3QS3wWYtz6lkyVOx3H3iI+TMtqhD9RM3a7A4O+4vVN8IioB2YjhEu0OKjwgX5gp+0uF+pLEi7Hpj6fupD3AbbL5uYcKg8=
- SAUCE_USERNAME=handlebars
- secure: 1VkLQhbsEug4ZMQ52tTOus/WLvW3Etqe7GbCzZfzsI8d2ygJPjFfzU8fNm4pVVwoTI21MaM5AQq7SVPu8DWN1YbDjJycMdY1zO3DsB9aZBxTal98fIB7ZIUce9r5z2EP6mETrsbYjZkeckzIBI0A4UVa+F2BO4KbRDXP1Db3u3I=
node_js: '10'
- stage: test
name: test with latest nodejs-lts
node_js: lts/*
script: npm run test
- stage: test
name: test with active nodejs
node_js: node
script: npm run test
cache: npm
email:
on_failure: change
on_success: never
git:
depth: 100
+12 -16
View File
@@ -6,7 +6,7 @@ Please don't open issues for security issues. Instead, file a report at https://
## Reporting Issues ## Reporting Issues
Please see our [FAQ](https://github.com/wycats/handlebars.js/blob/master/FAQ.md) for common issues that people run into. Please see our [FAQ](https://github.com/handlebars-lang/handlebars.js/blob/master/FAQ.md) for common issues that people run into.
Should you run into other issues with the project, please don't hesitate to let us know by filing an [issue][issue]! Should you run into other issues with the project, please don't hesitate to let us know by filing an [issue][issue]!
@@ -14,15 +14,14 @@ In general we are going to ask for an **example** of the problem failing, which
Pull requests containing only failing tests demonstrating the issue are welcomed and this also helps ensure that your issue won't regress in the future once it's fixed. Pull requests containing only failing tests demonstrating the issue are welcomed and this also helps ensure that your issue won't regress in the future once it's fixed.
Documentation issues on the handlebarsjs.com site should be reported on [handlebars-site](https://github.com/wycats/handlebars-site). Documentation issues on the [handlebarsjs.com](https://handlebarsjs.com) site should be reported on [handlebars-lang/docs](https://github.com/handlebars-lang/docs).
## Branches ## Branches
- The branch `4.x` contains the currently released version. Bugfixes should be made in this branch. - The branch `4.x` contains the currently released version. Bugfixes should be made in this branch.
- The branch `master` contains the next version. A release date is not yet specified. Maintainers - The branch `master` contains the next version. A release date is not yet specified. Maintainers
should merge the branch `4.x` into the master branch regularly. should merge the branch `4.x` into the master branch regularly.
- The branch `3.x` contains the legacy version `3.x`. Bugfixes are applied separately (if needed). The branch will not
* The branch `3.x` comtains the legacy version `3.x`. Bugfixes are applied seperately (if needed). The branch will not
be merged with any of the other branches. be merged with any of the other branches.
## Pull Requests ## Pull Requests
@@ -56,7 +55,7 @@ You can also run our set of benchmarks with `grunt bench`.
The `grunt dev` implements watching for tests and allows for in browser testing at `http://localhost:9999/spec/`. The `grunt dev` implements watching for tests and allows for in browser testing at `http://localhost:9999/spec/`.
If you notice any problems, please report them to the GitHub issue tracker at If you notice any problems, please report them to the GitHub issue tracker at
[http://github.com/wycats/handlebars.js/issues](http://github.com/wycats/handlebars.js/issues). [http://github.com/handlebars-lang/handlebars.js/issues](http://github.com/handlebars-lang/handlebars.js/issues).
## Running Tests ## Running Tests
@@ -87,14 +86,14 @@ We do linting and formatting in two phases:
- Committed files are linted and formatted in a pre-commit hook. In this stage eslint-errors are forbidden, - Committed files are linted and formatted in a pre-commit hook. In this stage eslint-errors are forbidden,
while warnings are allowed. while warnings are allowed.
- The travis-ci job also lints all files and checks if they are formatted correctly. In this stage, warnings - The GitHub CI job also lints all files and checks if they are formatted correctly. In this stage, warnings
are forbidden. are forbidden.
You can use the following scripts to make sure that the travis-job does not fail: You can use the following scripts to make sure that the CI job does not fail:
- **npm run lint** will run `eslint` and fail on warnings - **npm run lint** will run `eslint` and fail on warnings
- **npm run format** will run `prettier` on all files - **npm run format** will run `prettier` on all files
- **npm run check-before-pull-request** will perform all most checks that travis does in its build-job, excluding the "integration-test". - **npm run check-before-pull-request** will perform all most checks that our CI job does in its build-job, excluding the "integration-test".
- **npm run integration-test** will run integration tests (using old NodeJS versions and integrations with webpack, babel and so on) - **npm run integration-test** will run integration tests (using old NodeJS versions and integrations with webpack, babel and so on)
These tests only work on a Linux-machine with `nvm` installed (for running tests in multiple versions of NodeJS). These tests only work on a Linux-machine with `nvm` installed (for running tests in multiple versions of NodeJS).
@@ -102,7 +101,7 @@ You can use the following scripts to make sure that the travis-job does not fail
Before attempting the release Handlebars, please make sure that you have the following authorizations: Before attempting the release Handlebars, please make sure that you have the following authorizations:
- Push-access to `wycats/handlebars.js` - Push-access to `handlebars-lang/handlebars.js`
- Publishing rights on npmjs.com for the `handlebars` package - Publishing rights on npmjs.com for the `handlebars` package
- Publishing rights on gemfury for the `handlebars-source` package - Publishing rights on gemfury for the `handlebars-source` package
- Push-access to the repo for legacy package managers: `components/handlebars` - Push-access to the repo for legacy package managers: `components/handlebars`
@@ -110,15 +109,12 @@ Before attempting the release Handlebars, please make sure that you have the fol
_When releasing a previous version of Handlebars, please look into the CONTRIBUNG.md in the corresponding branch._ _When releasing a previous version of Handlebars, please look into the CONTRIBUNG.md in the corresponding branch._
Handlebars utilizes the [release yeoman generator][generator-release] to perform most release tasks.
A full release may be completed with the following: A full release may be completed with the following:
``` ```
npm ci npm ci
yo release npx grunt
npm publish npm publish
yo release:publish components handlebars.js dist/components/
cd dist/components/ cd dist/components/
gem build handlebars-source.gemspec gem build handlebars-source.gemspec
@@ -135,13 +131,13 @@ in those places still point to the latest version
When everything is OK, the **handlebars site** needs to be updated. When everything is OK, the **handlebars site** needs to be updated.
Go to the master branch of the repo [handlebars-lang/handlebarsjs.com-github-pages](https://github.com/handlebars-lang/handlebarsjs.com-github-pages/tree/master) Go to the master branch of the repo [handlebars-lang/docs](https://github.com/handlebars-lang/docs/tree/master)
and make a minimal change to the README. This will invoke a github-action that redeploys and make a minimal change to the README. This will invoke a github-action that redeploys
the site, fetching the latest version-number from the npm-registry. the site, fetching the latest version-number from the npm-registry.
(note that the default-branch of this repo is not the master and regular changes are done (note that the default-branch of this repo is not the master and regular changes are done
in the `handlebars-lang/docs`-repo). in the `handlebars-lang/docs`-repo).
[generator-release]: https://github.com/walmartlabs/generator-release [generator-release]: https://github.com/walmartlabs/generator-release
[pull-request]: https://github.com/wycats/handlebars.js/pull/new/master [pull-request]: https://github.com/handlebars-lang/handlebars.js/pull/new/master
[issue]: https://github.com/wycats/handlebars.js/issues/new [issue]: https://github.com/handlebars-lang/handlebars.js/issues/new
[jsfiddle]: https://jsfiddle.net/4nbwjaqz/4/ [jsfiddle]: https://jsfiddle.net/4nbwjaqz/4/
+5 -3
View File
@@ -2,11 +2,11 @@
## How can I file a bug report: ## How can I file a bug report:
See our guidelines on [reporting issues](https://github.com/wycats/handlebars.js/blob/master/CONTRIBUTING.md#reporting-issues). See our guidelines on [reporting issues](https://github.com/handlebars-lang/handlebars.js/blob/master/CONTRIBUTING.md#reporting-issues).
## Why isn't my Mustache template working? ## Why isn't my Mustache template working?
Handlebars deviates from Mustache slightly on a few behaviors. These variations are documented in our [readme](https://github.com/wycats/handlebars.js#differences-between-handlebarsjs-and-mustache). Handlebars deviates from Mustache slightly on a few behaviors. These variations are documented in our [readme](https://github.com/handlebars-lang/handlebars.js#differences-between-handlebarsjs-and-mustache).
## Why is it slower when compiling? ## Why is it slower when compiling?
@@ -36,16 +36,18 @@
```sh ```sh
handlebars --version handlebars --version
``` ```
If using the integrated precompiler and If using the integrated precompiler and
```javascript ```javascript
console.log(Handlebars.VERSION); console.log(Handlebars.VERSION);
``` ```
On the client side. On the client side.
We include the built client libraries in the npm package for those who want to be certain that they are using the same client libraries as the compiler. We include the built client libraries in the npm package for those who want to be certain that they are using the same client libraries as the compiler.
Should these match, please file an issue with us, per our [issue filing guidelines](https://github.com/wycats/handlebars.js/blob/master/CONTRIBUTING.md#reporting-issues). Should these match, please file an issue with us, per our [issue filing guidelines](https://github.com/handlebars-lang/handlebars.js/blob/master/CONTRIBUTING.md#reporting-issues).
## How do I load the runtime library when using AMD? ## How do I load the runtime library when using AMD?
+15 -70
View File
@@ -3,7 +3,7 @@ module.exports = function(grunt) {
grunt.initConfig({ grunt.initConfig({
pkg: grunt.file.readJSON('package.json'), pkg: grunt.file.readJSON('package.json'),
clean: ['tmp', 'dist', 'integration-testing/**/node_modules'], clean: ['tmp', 'dist', 'tests/integration/**/node_modules'],
copy: { copy: {
dist: { dist: {
@@ -110,55 +110,10 @@ module.exports = function(grunt) {
} }
} }
}, },
'saucelabs-mocha': {
all: {
options: {
build: process.env.TRAVIS_JOB_ID,
urls: ['http://localhost:9999/spec/?headless=true'],
detailedError: true,
concurrency: 4,
browsers: [
{ browserName: 'chrome' },
{ browserName: 'firefox', platform: 'Linux' }
// {browserName: 'safari', version: 9, platform: 'OS X 10.11'},
// {browserName: 'safari', version: 8, platform: 'OS X 10.10'},
// {
// browserName: 'internet explorer',
// version: 11,
// platform: 'Windows 8.1'
// },
// {
// browserName: 'internet explorer',
// version: 10,
// platform: 'Windows 8'
// }
]
}
},
sanity: {
options: {
build: process.env.TRAVIS_JOB_ID,
urls: [
'http://localhost:9999/spec/umd.html?headless=true',
'http://localhost:9999/spec/umd-runtime.html?headless=true'
],
detailedError: true,
concurrency: 2,
browsers: [
{ browserName: 'chrome' },
{
browserName: 'internet explorer',
version: 10,
platform: 'Windows 8'
}
]
}
}
},
bgShell: { bgShell: {
integrationTests: { integrationTests: {
cmd: './integration-testing/run-integration-tests.sh', cmd: './tests/integration/run-integration-tests.sh',
bg: false, bg: false,
fail: true fail: true
} }
@@ -185,50 +140,40 @@ module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-babel'); grunt.loadNpmTasks('grunt-babel');
grunt.loadNpmTasks('grunt-bg-shell'); grunt.loadNpmTasks('grunt-bg-shell');
grunt.loadNpmTasks('@knappi/grunt-saucelabs');
grunt.loadNpmTasks('grunt-webpack'); grunt.loadNpmTasks('grunt-webpack');
grunt.task.loadTasks('tasks'); grunt.task.loadTasks('tasks');
this.registerTask( grunt.registerTask('node', ['babel:cjs']);
'build', grunt.registerTask('globals', ['webpack']);
'Builds a distributable version of the current project', grunt.registerTask('release', 'Build final packages', [
['node', 'globals']
);
this.registerTask('node', ['babel:cjs']);
this.registerTask('globals', ['webpack']);
this.registerTask('release', 'Build final packages', [
'uglify', 'uglify',
'test:min', 'test:min',
'copy:dist', 'copy:dist',
'copy:components' 'copy:components'
]); ]);
this.registerTask('test', ['test:bin', 'test:cov']); // Requires secret properties from .travis.yaml
grunt.registerTask('bench', ['metrics']);
if (process.env.SAUCE_ACCESS_KEY) {
grunt.registerTask('sauce', ['concat:tests', 'connect', 'saucelabs-mocha']);
} else {
grunt.registerTask('sauce', []);
}
// Requires secret properties (saucelabs-credentials etc.) from .travis.yaml
grunt.registerTask('extensive-tests-and-publish-to-aws', [ grunt.registerTask('extensive-tests-and-publish-to-aws', [
'default', 'default',
'bgShell:integrationTests', 'bgShell:integrationTests',
'sauce',
'metrics', 'metrics',
'publish-to-aws' 'publish-to-aws'
]); ]);
grunt.registerTask('on-file-change', ['build', 'concat:tests', 'test']); grunt.registerTask('on-file-change', ['build', 'concat:tests', 'test']);
// === Primary tasks === // === Primary tasks ===
grunt.registerTask('dev', ['clean', 'connect', 'watch']); grunt.registerTask('dev', ['clean', 'connect', 'watch']);
grunt.registerTask('default', ['clean', 'build', 'test', 'release']); grunt.registerTask('default', ['clean', 'build', 'test', 'release']);
grunt.registerTask('test', ['test:bin', 'test:cov']);
grunt.registerTask('bench', ['metrics']);
grunt.registerTask('prepare', ['build', 'concat:tests']);
grunt.registerTask(
'build',
'Builds a distributable version of the current project',
['node', 'globals']
);
grunt.registerTask('integration-tests', [ grunt.registerTask('integration-tests', [
'default', 'default',
'bgShell:integrationTests' 'bgShell:integrationTests'
+6 -8
View File
@@ -1,7 +1,7 @@
[![Travis Build Status](https://img.shields.io/travis/handlebars-lang/handlebars.js/master.svg)](https://travis-ci.org/github/handlebars-lang/handlebars.js) [![CI Build Status](https://img.shields.io/github/workflow/status/handlebars-lang/handlebars.js/ci/master)](https://github.com/handlebars-lang/handlebars.js/actions)
[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/wycats/handlebars.js?branch=master&svg=true)](https://ci.appveyor.com/project/wycats/handlebars-js)
[![Selenium Test Status](https://saucelabs.com/buildstatus/handlebars)](https://saucelabs.com/u/handlebars)
[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/handlebars/badge?style=rounded)](https://www.jsdelivr.com/package/npm/handlebars) [![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/handlebars/badge?style=rounded)](https://www.jsdelivr.com/package/npm/handlebars)
[![Bundle size](https://img.shields.io/bundlephobia/minzip/handlebars?label=minified%20%2B%20gzipped)](https://bundlephobia.com/package/handlebars)
[![Install size](https://packagephobia.com/badge?p=handlebars)](https://packagephobia.com/result?p=handlebars)
Handlebars.js Handlebars.js
============= =============
@@ -21,7 +21,7 @@ Usage
----- -----
In general, the syntax of Handlebars.js templates is a superset In general, the syntax of Handlebars.js templates is a superset
of Mustache templates. For basic syntax, check out the [Mustache of Mustache templates. For basic syntax, check out the [Mustache
manpage](http://mustache.github.com/mustache.5.html). manpage](https://mustache.github.io/mustache.5.html).
Once you have a template, use the `Handlebars.compile` method to compile Once you have a template, use the `Handlebars.compile` method to compile
the template into a function. The generated function takes a context the template into a function. The generated function takes a context
@@ -63,7 +63,7 @@ templates easier and also changes a tiny detail of how partials work.
- [Literal Values](https://handlebarsjs.com/guide/expressions.html#literal-segments) - [Literal Values](https://handlebarsjs.com/guide/expressions.html#literal-segments)
- [Delimited Comments](https://handlebarsjs.com/guide/#template-comments) - [Delimited Comments](https://handlebarsjs.com/guide/#template-comments)
Block expressions have the same syntax as mustache sections but should not be confused with one another. Sections are akin to an implicit `each` or `with` statement depending on the input data and helpers are explicit pieces of code that are free to implement whatever behavior they like. The [mustache spec](http://mustache.github.io/mustache.5.html) defines the exact behavior of sections. In the case of name conflicts, helpers are given priority. Block expressions have the same syntax as mustache sections but should not be confused with one another. Sections are akin to an implicit `each` or `with` statement depending on the input data and helpers are explicit pieces of code that are free to implement whatever behavior they like. The [mustache spec](https://mustache.github.io/mustache.5.html) defines the exact behavior of sections. In the case of name conflicts, helpers are given priority.
### Compatibility ### Compatibility
@@ -89,8 +89,6 @@ Handlebars has been designed to work in any ECMAScript 3 environment. This inclu
Older versions and other runtimes are likely to work but have not been formally Older versions and other runtimes are likely to work but have not been formally
tested. The compiler requires `JSON.stringify` to be implemented natively or via a polyfill. If using the precompiler this is not necessary. tested. The compiler requires `JSON.stringify` to be implemented natively or via a polyfill. If using the precompiler this is not necessary.
[![Selenium Test Status](https://saucelabs.com/browser-matrix/handlebars.svg)](https://saucelabs.com/u/handlebars)
Performance Performance
----------- -----------
@@ -102,7 +100,7 @@ does have some big performance advantages. Justin Marney, a.k.a.
[gotascii](http://github.com/gotascii), confirmed that with an [gotascii](http://github.com/gotascii), confirmed that with an
[independent test](http://sorescode.com/2010/09/12/benchmarks.html). The [independent test](http://sorescode.com/2010/09/12/benchmarks.html). The
rewritten Handlebars (current version) is faster than the old version, rewritten Handlebars (current version) is faster than the old version,
with many [performance tests](https://travis-ci.org/handlebars-lang/handlebars.js/builds/33392182#L538) being 5 to 7 times faster than the Mustache equivalent. with many performance tests being 5 to 7 times faster than the Mustache equivalent.
Upgrading Upgrading
-36
View File
@@ -1,36 +0,0 @@
# Test against these versions of Node.js
environment:
matrix:
- nodejs_version: "10"
platform:
- x64
# Install scripts (runs after repo cloning)
install:
# Get the latest stable version of Node.js
- ps: Install-Product node $env:nodejs_version $env:platform
# Clone submodules (mustache spec)
- cmd: git submodule update --init --recursive
# Install modules
- cmd: npm ci
# Post-install test scripts
test_script:
# Output useful info for debugging
- cmd: node --version
- cmd: npm --version
# Run tests
- cmd: npm run test
# Don't actually build
build: off
on_failure:
- cmd: 7z a coverage.zip coverage
- cmd: appveyor PushArtifact coverage.zip
# Set build version format here instead of in the admin panel
version: "{build}"
-15
View File
@@ -1,15 +0,0 @@
{
"extends": "prettier",
"globals": {
"require": true
},
"rules": {
// Disabling for tests, for now.
"no-path-concat": 0,
"no-var": 0,
"no-shadow": 0,
"handle-callback-err": 0,
"no-console": 0
}
}
+1 -1
View File
@@ -10,7 +10,7 @@ Gem::Specification.new do |gem|
gem.date = Time.now.strftime("%Y-%m-%d") gem.date = Time.now.strftime("%Y-%m-%d")
gem.description = %q{Handlebars.js source code wrapper for (pre)compilation gems.} gem.description = %q{Handlebars.js source code wrapper for (pre)compilation gems.}
gem.summary = %q{Handlebars.js source code wrapper} gem.summary = %q{Handlebars.js source code wrapper}
gem.homepage = "https://github.com/wycats/handlebars.js/" gem.homepage = "https://github.com/handlebars-lang/handlebars.js/"
gem.version = package["version"].sub "-", "." gem.version = package["version"].sub "-", "."
gem.license = "MIT" gem.license = "MIT"
+2 -2
View File
@@ -4,8 +4,8 @@
<id>handlebars.js</id> <id>handlebars.js</id>
<version>5.0.0-alpha.1</version> <version>5.0.0-alpha.1</version>
<authors>handlebars.js Authors</authors> <authors>handlebars.js Authors</authors>
<licenseUrl>https://github.com/wycats/handlebars.js/blob/master/LICENSE</licenseUrl> <licenseUrl>https://github.com/handlebars-lang/handlebars.js/blob/master/LICENSE</licenseUrl>
<projectUrl>https://github.com/wycats/handlebars.js/</projectUrl> <projectUrl>https://github.com/handlebars-lang/handlebars.js/</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance> <requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Extension of the Mustache logicless template language</description> <description>Extension of the Mustache logicless template language</description>
<releaseNotes></releaseNotes> <releaseNotes></releaseNotes>
+1 -1
View File
@@ -18,4 +18,4 @@ Decorators are executed when the block program is instantiated and are passed `(
Decorators may set values on `props` or return a modified function that wraps `program` in particular behaviors. If the decorator returns nothing, then `program` is left unaltered. Decorators may set values on `props` or return a modified function that wraps `program` in particular behaviors. If the decorator returns nothing, then `program` is left unaltered.
The [inline partial](https://github.com/wycats/handlebars.js/blob/master/lib/handlebars/decorators/inline.js) implementation provides an example of decorators being used for both metadata and wrapping behaviors. The [inline partial](https://github.com/handlebars-lang/handlebars.js/blob/master/lib/handlebars/decorators/inline.js) implementation provides an example of decorators being used for both metadata and wrapping behaviors.
+6
View File
@@ -0,0 +1,6 @@
module.exports = {
env: {
// Handlebars should run natively in the browser
node: false
}
};
+1 -1
View File
@@ -8,7 +8,7 @@ try {
if (typeof define !== 'function' || !define.amd) { if (typeof define !== 'function' || !define.amd) {
// We don't support this in AMD environments. For these environments, we assume that // We don't support this in AMD environments. For these environments, we assume that
// they are running on the browser and thus have no need for the source-map library. // they are running on the browser and thus have no need for the source-map library.
let SourceMap = require('source-map'); let SourceMap = require('source-map'); // eslint-disable-line no-undef
SourceNode = SourceMap.SourceNode; SourceNode = SourceMap.SourceNode;
} }
} catch (err) { } catch (err) {
+2 -2
View File
@@ -44,9 +44,9 @@ export default function(instance) {
execIteration(i, i, i === context.length - 1); execIteration(i, i, i === context.length - 1);
} }
} }
} else if (global.Symbol && context[global.Symbol.iterator]) { } else if (typeof Symbol === 'function' && context[Symbol.iterator]) {
const newContext = []; const newContext = [];
const iterator = context[global.Symbol.iterator](); const iterator = context[Symbol.iterator]();
for (let it = iterator.next(); !it.done; it = iterator.next()) { for (let it = iterator.next(); !it.done; it = iterator.next()) {
newContext.push(it.value); newContext.push(it.value);
} }
+1 -1
View File
@@ -1,5 +1,5 @@
import { createNewLookupObject } from './create-new-lookup-object'; import { createNewLookupObject } from './create-new-lookup-object';
import * as logger from '../logger'; import logger from '../logger';
const loggedProperties = Object.create(null); const loggedProperties = Object.create(null);
+1 -1
View File
@@ -1,6 +1,6 @@
export default function(Handlebars) { export default function(Handlebars) {
/* istanbul ignore next */ /* istanbul ignore next */
let root = typeof global !== 'undefined' ? global : window, let root = typeof global !== 'undefined' ? global : window, // eslint-disable-line no-undef
$Handlebars = root.Handlebars; $Handlebars = root.Handlebars;
/* istanbul ignore next */ /* istanbul ignore next */
Handlebars.noConflict = function() { Handlebars.noConflict = function() {
+1
View File
@@ -1,5 +1,6 @@
// USAGE: // USAGE:
// var handlebars = require('handlebars'); // var handlebars = require('handlebars');
/* eslint-env node */
/* eslint-disable no-var */ /* eslint-disable no-var */
// var local = handlebars.create(); // var local = handlebars.create();
+1
View File
@@ -1,3 +1,4 @@
/* eslint-env node */
/* eslint-disable no-console */ /* eslint-disable no-console */
import Async from 'neo-async'; import Async from 'neo-async';
import fs from 'fs'; import fs from 'fs';
+18720 -625
View File
File diff suppressed because it is too large Load Diff
+19 -15
View File
@@ -2,7 +2,7 @@
"name": "handlebars", "name": "handlebars",
"version": "5.0.0-alpha.1", "version": "5.0.0-alpha.1",
"description": "Handlebars provides the power necessary to let you build semantic templates effectively with no frustration", "description": "Handlebars provides the power necessary to let you build semantic templates effectively with no frustration",
"homepage": "http://www.handlebarsjs.com/", "homepage": "https://www.handlebarsjs.com/",
"keywords": [ "keywords": [
"handlebars", "handlebars",
"mustache", "mustache",
@@ -11,7 +11,7 @@
], ],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/wycats/handlebars.js.git" "url": "https://github.com/handlebars-lang/handlebars.js.git"
}, },
"author": "Yehuda Katz", "author": "Yehuda Katz",
"license": "MIT", "license": "MIT",
@@ -21,7 +21,7 @@
}, },
"dependencies": { "dependencies": {
"@handlebars/parser": "^1.1.0", "@handlebars/parser": "^1.1.0",
"neo-async": "^2.6.0", "neo-async": "^2.6.2",
"source-map": "^0.6.1", "source-map": "^0.6.1",
"yargs": "^15.3.1" "yargs": "^15.3.1"
}, },
@@ -29,7 +29,8 @@
"uglify-js": "^3.1.4" "uglify-js": "^3.1.4"
}, },
"devDependencies": { "devDependencies": {
"@knappi/grunt-saucelabs": "^9.0.2", "@definitelytyped/dtslint": "^0.0.100",
"@playwright/test": "^1.17.1",
"aws-sdk": "^2.1.49", "aws-sdk": "^2.1.49",
"babel-loader": "^5.0.0", "babel-loader": "^5.0.0",
"babel-runtime": "^5.1.10", "babel-runtime": "^5.1.10",
@@ -38,12 +39,11 @@
"chai-diff": "^1.0.1", "chai-diff": "^1.0.1",
"concurrently": "^5.0.0", "concurrently": "^5.0.0",
"dirty-chai": "^2.0.1", "dirty-chai": "^2.0.1",
"dtslint": "^0.5.5",
"dustjs-linkedin": "^2.0.2", "dustjs-linkedin": "^2.0.2",
"eco": "~1.1.0-rc-3", "eco": "~1.1.0-rc-3",
"eslint": "^6.7.2", "eslint": "^6.7.2",
"eslint-config-prettier": "^6.7.0", "eslint-config-prettier": "^6.7.0",
"eslint-plugin-compat": "^3.3.0", "eslint-plugin-compat": "^3.13.0",
"eslint-plugin-es5": "^1.4.1", "eslint-plugin-es5": "^1.4.1",
"fs-extra": "^8.1.0", "fs-extra": "^8.1.0",
"grunt": "^1.0.4", "grunt": "^1.0.4",
@@ -84,15 +84,20 @@
"handlebars": "bin/handlebars" "handlebars": "bin/handlebars"
}, },
"scripts": { "scripts": {
"build": "grunt build",
"format": "prettier --write '**/*.js' && eslint --fix .", "format": "prettier --write '**/*.js' && eslint --fix .",
"check-format": "prettier --check '**/*.js'", "lint": "npm run lint:eslint && npm run lint:prettier && npm run lint:types",
"lint": "eslint --max-warnings 0 .", "lint:eslint": "eslint --max-warnings 0 .",
"dtslint": "dtslint types", "lint:prettier": "prettier --check '**/*.js'",
"test": "grunt", "lint:types": "dtslint types",
"extensive-tests-and-publish-to-aws": "npx mocha tasks/task-tests/ && grunt --stack extensive-tests-and-publish-to-aws", "test": "npm run test:mocha",
"integration-test": "grunt integration-tests", "test:mocha": "grunt build && grunt test",
"test:browser": "playwright test --config tests/browser/playwright.config.js tests/browser/spec.js",
"test:integration": "grunt integration-tests",
"test:serve": "grunt connect:server:keepalive",
"extensive-tests-and-publish-to-aws": "npx mocha tasks/tests/ && grunt --stack extensive-tests-and-publish-to-aws",
"--- combined tasks ---": "", "--- combined tasks ---": "",
"check-before-pull-request": "concurrently --kill-others-on-fail npm:lint npm:dtslint npm:check-format npm:test" "check-before-pull-request": "concurrently --kill-others-on-fail npm:lint npm:test"
}, },
"jspm": { "jspm": {
"main": "handlebars", "main": "handlebars",
@@ -109,7 +114,6 @@
"dist/amd/**/*.js", "dist/amd/**/*.js",
"dist/cjs/**/*.js", "dist/cjs/**/*.js",
"lib", "lib",
"print-script",
"release-notes.md", "release-notes.md",
"runtime.js", "runtime.js",
"types/*.d.ts", "types/*.d.ts",
@@ -121,7 +125,7 @@
} }
}, },
"lint-staged": { "lint-staged": {
"*.{js,css,json,md}": [ "*.{js,css,json}": [
"prettier --write", "prettier --write",
"git add" "git add"
], ],
+1 -1
View File
@@ -62,7 +62,7 @@
} }
var runner = mocha.run(); var runner = mocha.run();
//Reporting for saucelabs // Reporting to test-runner
var failedTests = []; var failedTests = [];
runner.on('end', function(){ runner.on('end', function(){
window.mochaResults = runner.stats; window.mochaResults = runner.stats;
+1 -1
View File
@@ -54,7 +54,7 @@
} }
var runner = mocha.run(); var runner = mocha.run();
//Reporting for saucelabs // Reporting to test-runner
var failedTests = []; var failedTests = [];
runner.on('end', function(){ runner.on('end', function(){
window.mochaResults = runner.stats; window.mochaResults = runner.stats;
+1 -1
View File
@@ -74,7 +74,7 @@
} }
var runner = mocha.run(); var runner = mocha.run();
//Reporting for saucelabs // Reporting to test-runner
var failedTests = []; var failedTests = [];
runner.on('end', function(){ runner.on('end', function(){
window.mochaResults = runner.stats; window.mochaResults = runner.stats;
+1 -1
View File
@@ -1,4 +1,4 @@
const metrics = require('../bench'); const metrics = require('../tests/bench');
const { createRegisterAsyncTaskFn } = require('./util/async-grunt-task'); const { createRegisterAsyncTaskFn } = require('./util/async-grunt-task');
module.exports = function(grunt) { module.exports = function(grunt) {
-1
View File
@@ -1 +0,0 @@
Use `mocha tasks/task-tests` to run these tests
+1
View File
@@ -0,0 +1 @@
Use `mocha tasks/tests` to run these tests
+10
View File
@@ -0,0 +1,10 @@
module.exports = {
root: true,
extends: ['eslint:recommended', 'prettier'],
env: {
node: true
},
parserOptions: {
ecmaVersion: 6
}
};
@@ -3,7 +3,7 @@ var _ = require('underscore'),
module.exports = function(grunt, callback) { module.exports = function(grunt, callback) {
// Deferring to here in case we have a build for parser, etc as part of this grunt exec // Deferring to here in case we have a build for parser, etc as part of this grunt exec
var Handlebars = require('../lib'); var Handlebars = require('../../lib');
var templateSizes = {}; var templateSizes = {};
_.each(templates, function(info, template) { _.each(templates, function(info, template) {
@@ -145,7 +145,7 @@ function makeSuite(bench, name, template, handlebarsOnly) {
module.exports = function(grunt, callback) { module.exports = function(grunt, callback) {
// Deferring load incase we are being run inline with the grunt build // Deferring load incase we are being run inline with the grunt build
Handlebars = require('../lib'); Handlebars = require('../../lib');
console.log('Execution Throughput'); console.log('Execution Throughput');
runner(grunt, makeSuite, function(times, scaled) { runner(grunt, makeSuite, function(times, scaled) {
@@ -11,8 +11,6 @@ function BenchWarmer() {
this.errors = {}; this.errors = {};
} }
var print = require('util').print;
BenchWarmer.prototype = { BenchWarmer.prototype = {
winners: function(benches) { winners: function(benches) {
return Benchmark.filter(benches, 'fastest'); return Benchmark.filter(benches, 'fastest');
@@ -69,7 +67,7 @@ BenchWarmer.prototype = {
self.startLine(''); self.startLine('');
print('\n'); console.log('\n');
self.printHeader('scaled'); self.printHeader('scaled');
_.each(self.scaled, function(value, name) { _.each(self.scaled, function(value, name) {
self.startLine(name); self.startLine(name);
@@ -78,7 +76,7 @@ BenchWarmer.prototype = {
self.writeValue(value[lang] || ''); self.writeValue(value[lang] || '');
}); });
}); });
print('\n'); console.log('\n');
var errors = false, var errors = false,
prop, prop,
@@ -94,16 +92,16 @@ BenchWarmer.prototype = {
} }
if (errors) { if (errors) {
print('\n\nErrors:\n'); console.log('\n\nErrors:\n');
Object.keys(self.errors).forEach(function(prop) { Object.keys(self.errors).forEach(function(prop) {
if (self.errors[prop].error.message !== 'EWOT') { if (self.errors[prop].error.message !== 'EWOT') {
bench = self.errors[prop]; bench = self.errors[prop];
print('\n' + bench.name + ':\n'); console.log('\n' + bench.name + ':\n');
print(bench.error.message); console.log(bench.error.message);
if (bench.error.stack) { if (bench.error.stack) {
print(bench.error.stack.join('\n')); console.log(bench.error.stack.join('\n'));
} }
print('\n'); console.log('\n');
} }
}); });
} }
@@ -112,7 +110,7 @@ BenchWarmer.prototype = {
} }
}); });
print('\n'); console.log('\n');
}, },
scaleTimes: function() { scaleTimes: function() {
@@ -163,11 +161,11 @@ BenchWarmer.prototype = {
} }
if (winners) { if (winners) {
print('WINNER(S)'); console.log('WINNER(S)');
horSize = horSize + 'WINNER(S)'.length; horSize = horSize + 'WINNER(S)'.length;
} }
print('\n' + new Array(horSize + 1).join('-')); console.log('\n' + new Array(horSize + 1).join('-'));
}, },
startLine: function(name) { startLine: function(name) {
@@ -179,8 +177,8 @@ BenchWarmer.prototype = {
this.currentBenches = []; this.currentBenches = [];
print(winners.join(', ')); console.log(winners.join(', '));
print('\n'); console.log('\n');
if (name) { if (name) {
this.writeValue(name); this.writeValue(name);
@@ -216,7 +214,7 @@ BenchWarmer.prototype = {
writeValue: function(out) { writeValue: function(out) {
var padding = this.benchSize - out.length + 1; var padding = this.benchSize - out.length + 1;
out = out + new Array(padding).join(' '); out = out + new Array(padding).join(' ');
print(out); console.log(out);
} }
}; };
+5
View File
@@ -0,0 +1,5 @@
module.exports = {
parserOptions: {
ecmaVersion: 2020
}
};
+14
View File
@@ -0,0 +1,14 @@
# Browser Tests with Playwright
These tests execute Mocha tests from the `spec`-folder in multiple browsers.
## Using Docker
Execute the following commands in the project root:
```bash
npm install
npx grunt prepare
docker pull mcr.microsoft.com/playwright:focal
docker run -it --rm --volume $(pwd):/srv/app --workdir /srv/app --ipc=host mcr.microsoft.com/playwright:focal npm run test:browser
```
+27
View File
@@ -0,0 +1,27 @@
const { devices } = require('@playwright/test');
/** @type {import('@playwright/test').PlaywrightTestConfig} */
const config = {
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] }
},
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] }
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] }
}
],
reporter: 'list',
webServer: {
command: 'npm run test:serve',
port: 9999,
reuseExistingServer: false
}
};
module.exports = config;
+23
View File
@@ -0,0 +1,23 @@
const { test, expect } = require('@playwright/test');
async function waitForMochaAndAssertResult(page) {
await page.waitForFunction(() => window.mochaResults); // eslint-disable-line no-undef
const mochaResults = await page.evaluate('window.mochaResults');
expect(mochaResults.failures).toBe(0);
}
test('Spec handlebars.js', async ({ page, baseURL }) => {
await page.goto(`${baseURL}/spec/?headless=true`);
await waitForMochaAndAssertResult(page);
});
test('Spec handlebars.js (UMD)', async ({ page, baseURL }) => {
await page.goto(`${baseURL}/spec/umd.html?headless=true`);
await waitForMochaAndAssertResult(page);
});
test('Spec handlebars.runtime.js (UMD)', async ({ page, baseURL }) => {
await page.goto(`${baseURL}/spec/umd-runtime.html?headless=true`);
await waitForMochaAndAssertResult(page);
});
@@ -1,12 +1,10 @@
Add a new integration test by creating a new subfolder Add a new integration test by creating a new subfolder
Add a file "test.sh" to that runs the test. "test.sh" should exit with a non-zero exit code Add a file "test.sh" to that runs the test. "test.sh" should exit with a non-zero exit code
and display an error message, if something goes wrong. and display an error message, if something goes wrong.
* An integration test should reflect real-world setups that use handlebars. - An integration test should reflect real-world setups that use handlebars.
* It should compile a minimal template and compare the output to an expected output. - It should compile a minimal template and compare the output to an expected output.
* It should use "../.." as dependency for Handlebars so that the currently built library is used. - It should use "../.." as dependency for Handlebars so that the currently built library is used.
Currently, integration tests are only running on Linux, especially in travis-ci. Currently, integration tests are only running on Linux, especially in our CI GitHub action.
@@ -7,7 +7,7 @@
"private": true, "private": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"handlebars": "file:../.." "handlebars": "file:../../.."
}, },
"scripts": { "scripts": {
"test": "node run-handlebars.js", "test": "node run-handlebars.js",
@@ -7,9 +7,6 @@ cd "$( dirname "$( readlink -f "$0" )" )" || exit 1
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# This script tests with precompiler and the built distribution with multiple NodeJS version. # This script tests with precompiler and the built distribution with multiple NodeJS version.
# The rest of the travis-build will only work with newer NodeJS versions, because the build
# tools don't support older versions.
# However, the built distribution should work with older NodeJS versions as well.
# This test is simple by design. It merely ensures, that calling Handlebars does not fail with old versions. # This test is simple by design. It merely ensures, that calling Handlebars does not fail with old versions.
# It does (almost) not test for correctness, because that is already done in the mocha-tests. # It does (almost) not test for correctness, because that is already done in the mocha-tests.
# And it does not use any NodeJS based testing framework to make this part independent of the Node version. # And it does not use any NodeJS based testing framework to make this part independent of the Node version.
@@ -17,7 +14,7 @@ cd "$( dirname "$( readlink -f "$0" )" )" || exit 1
unset npm_config_prefix unset npm_config_prefix
echo "Handlebars should be able to run in various versions of NodeJS" echo "Handlebars should be able to run in various versions of NodeJS"
for node_version_to_test in 10 11 12 13 14 15; do for node_version_to_test in 10 11 12 13 14 15 16 17; do
rm target node_modules package-lock.json -rf rm target node_modules package-lock.json -rf
mkdir target mkdir target
@@ -0,0 +1,11 @@
module.exports = {
root: true,
extends: ['eslint:recommended', 'prettier'],
env: {
browser: true
},
parserOptions: {
sourceType: 'module',
ecmaVersion: 6
}
};
@@ -0,0 +1,14 @@
{
"name": "rollup-test",
"description": "Various tests with Handlebars and rollup",
"version": "1.0.0",
"scripts": {
"build": "rollup --config rollup.config.js --failAfterWarnings"
},
"private": true,
"devDependencies": {
"@rollup/plugin-node-resolve": "^13.1.1",
"handlebars": "file:../../..",
"rollup": "^2.61.1"
}
}
@@ -0,0 +1,10 @@
import { nodeResolve } from '@rollup/plugin-node-resolve';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'es'
},
plugins: [nodeResolve()]
};
@@ -0,0 +1,8 @@
import Handlebars from 'handlebars/lib/handlebars';
const template = Handlebars.compile('Author: {{author}}');
const result = template({ author: 'Yehuda' });
if (result !== 'Author: Yehuda') {
throw Error('Assertion failed');
}
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
set -e
# Cleanup: package-lock and "npm ci" is not working with local dependencies
rm dist package-lock.json -rf
npm install
npm run build
node dist/bundle.js
echo "Success"
@@ -12,7 +12,7 @@
"@roundingwellos/babel-plugin-handlebars-inline-precompile": "^3.0.1", "@roundingwellos/babel-plugin-handlebars-inline-precompile": "^3.0.1",
"babel-loader": "^8.0.6", "babel-loader": "^8.0.6",
"babel-plugin-istanbul": "^5.2.0", "babel-plugin-istanbul": "^5.2.0",
"handlebars": "file:../..", "handlebars": "file:../../..",
"handlebars-loader": "^1.7.1", "handlebars-loader": "^1.7.1",
"nyc": "^14.1.1", "nyc": "^14.1.1",
"webpack": "^4.39.3", "webpack": "^4.39.3",
@@ -0,0 +1,11 @@
module.exports = {
root: true,
extends: ['eslint:recommended', 'prettier'],
env: {
browser: true
},
parserOptions: {
sourceType: 'module',
ecmaVersion: 6
}
};
@@ -4,7 +4,7 @@ set -e
# Cleanup: package-lock and "npm ci" is not working with local dependencies # Cleanup: package-lock and "npm ci" is not working with local dependencies
rm dist package-lock.json -rf rm dist package-lock.json -rf
npm install npm install --legacy-peer-deps
npm run build npm run build
for i in dist/*-test.js ; do for i in dist/*-test.js ; do
@@ -0,0 +1,3 @@
node_modules
dist
package-lock.json
@@ -13,7 +13,7 @@
"license": "ISC", "license": "ISC",
"dependencies": {}, "dependencies": {},
"devDependencies": { "devDependencies": {
"handlebars": "file:../..", "handlebars": "file:../../..",
"handlebars-loader": "^1.7.1", "handlebars-loader": "^1.7.1",
"webpack": "^4.39.3", "webpack": "^4.39.3",
"webpack-cli": "^3.3.7" "webpack-cli": "^3.3.7"
@@ -0,0 +1,12 @@
module.exports = {
root: true,
extends: ['eslint:recommended', 'prettier'],
env: {
node: true,
browser: true
},
parserOptions: {
sourceType: 'module',
ecmaVersion: 6
}
};
@@ -4,7 +4,7 @@ set -e
# Cleanup: package-lock and "npm ci" is not working with local dependencies # Cleanup: package-lock and "npm ci" is not working with local dependencies
rm dist package-lock.json -rf rm dist package-lock.json -rf
npm install npm install --legacy-peer-deps
npm run build npm run build
for i in dist/*-test.js ; do for i in dist/*-test.js ; do

Some files were not shown because too many files have changed in this diff Show More