diff --git a/samples/handlebarsjs-webpack-loader/.editorconfig b/samples/handlebarsjs-webpack-loader/.editorconfig new file mode 100644 index 000000000..8ffcdc4ec --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/.editorconfig @@ -0,0 +1,25 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] + +# change these settings to your own preference +indent_style = space +indent_size = 2 + +# we recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[{package,bower}.json] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/.gitattributes b/samples/handlebarsjs-webpack-loader/.gitattributes new file mode 100644 index 000000000..212566614 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/.gitignore b/samples/handlebarsjs-webpack-loader/.gitignore new file mode 100644 index 000000000..b19bbe123 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/.gitignore @@ -0,0 +1,32 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +solution +temp +*.sppkg + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj + +# Resx Generated Code +*.resx.ts + +# Styles Generated Code +*.scss.ts diff --git a/samples/handlebarsjs-webpack-loader/.npmignore b/samples/handlebarsjs-webpack-loader/.npmignore new file mode 100644 index 000000000..2c93a9384 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/.npmignore @@ -0,0 +1,14 @@ +# Folders +.vscode +coverage +node_modules +sharepoint +src +temp + +# Files +*.csproj +.git* +.yo-rc.json +gulpfile.js +tsconfig.json diff --git a/samples/handlebarsjs-webpack-loader/.vscode/settings.json b/samples/handlebarsjs-webpack-loader/.vscode/settings.json new file mode 100644 index 000000000..0c4a6693f --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "vsicons.presets.angular": false +} \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/.yo-rc.json b/samples/handlebarsjs-webpack-loader/.yo-rc.json new file mode 100644 index 000000000..e4881614b --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/.yo-rc.json @@ -0,0 +1,8 @@ +{ + "@microsoft/generator-sharepoint": { + "libraryName": "spfx-handlebars", + "framework": "none", + "version": "1.0.0", + "libraryId": "b8285cda-e974-4141-aab6-b7927b732a41" + } +} \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/README.md b/samples/handlebarsjs-webpack-loader/README.md new file mode 100644 index 000000000..2b8972948 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/README.md @@ -0,0 +1,45 @@ +## SPFx Sample with Handlebars.js + +This sample demonstrate how to set up SPFX to use [Handlebars](http://handlebarsjs.com) through [webpack loader](https://webpack.github.io/docs/loaders.html). + + + +## Used SharePoint Framework Version +![drop](https://img.shields.io/badge/drop-GA-green.svg) + +## Applies to + +* [SharePoint Framework Developer](http://dev.office.com/sharepoint/docs/spfx/sharepoint-framework-overview) +* [Office 365 developer tenant](http://dev.office.com/sharepoint/docs/spfx/set-up-your-developer-tenant) + +## Solution + +Solution|Author(s) +--------|--------- +SPFx-handlebars | Stefan Bauer - n8d ([@stfbauer](https://twitter.com/stfbauer)) + +## Version history + +Version|Date|Comments +-------|----|-------- +1.0|March 5, 2017|Initial release + +## Disclaimer +**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + +### Building the code + +```bash +git clone the repo +npm i +npm i -g gulp +gulp +``` + +This package produces the following: + +* lib/* - intermediate-stage commonjs build artifacts +* dist/* - the bundled script, along with other resources +* deploy/* - all resources which should be uploaded to a CDN. + + diff --git a/samples/handlebarsjs-webpack-loader/config/config.json b/samples/handlebarsjs-webpack-loader/config/config.json new file mode 100644 index 000000000..1a13f35cf --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/config/config.json @@ -0,0 +1,19 @@ +{ + "entries": [{ + "entry": "./lib/webparts/handlebarsDemo/HandlebarsDemoWebPart.js", + "manifest": "./src/webparts/handlebarsDemo/HandlebarsDemoWebPart.manifest.json", + "outputPath": "./dist/handlebars-demo.bundle.js" + }], + "externals": { + + // Load Handlebar templates from CDN + // "handlebars": "https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.6/handlebars.amd.js" + + // load handlebars from node_modules + "handlebars": "./node_modules/handlebars/dist/handlebars.amd.min.js" + + }, + "localizedResources": { + "handlebarsDemoStrings": "webparts/handlebarsDemo/loc/{locale}.js" + } +} diff --git a/samples/handlebarsjs-webpack-loader/config/copy-assets.json b/samples/handlebarsjs-webpack-loader/config/copy-assets.json new file mode 100644 index 000000000..6aca63656 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/config/copy-assets.json @@ -0,0 +1,3 @@ +{ + "deployCdnPath": "temp/deploy" +} diff --git a/samples/handlebarsjs-webpack-loader/config/copy-static-assets.json b/samples/handlebarsjs-webpack-loader/config/copy-static-assets.json new file mode 100644 index 000000000..dd91b5024 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/config/copy-static-assets.json @@ -0,0 +1,6 @@ +// copy-static-assets.json +{ + "includeExtensions": [ + "hbs" + ] +} diff --git a/samples/handlebarsjs-webpack-loader/config/deploy-azure-storage.json b/samples/handlebarsjs-webpack-loader/config/deploy-azure-storage.json new file mode 100644 index 000000000..05b016a5b --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/config/deploy-azure-storage.json @@ -0,0 +1,6 @@ +{ + "workingDir": "./temp/deploy/", + "account": "", + "container": "spfx-handlebars", + "accessKey": "" +} \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/config/package-solution.json b/samples/handlebarsjs-webpack-loader/config/package-solution.json new file mode 100644 index 000000000..c7ecdf98f --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/config/package-solution.json @@ -0,0 +1,10 @@ +{ + "solution": { + "name": "spfx-handlebars-client-side-solution", + "id": "b8285cda-e974-4141-aab6-b7927b732a41", + "version": "1.0.0.0" + }, + "paths": { + "zippedPackage": "solution/spfx-handlebars.sppkg" + } +} diff --git a/samples/handlebarsjs-webpack-loader/config/serve.json b/samples/handlebarsjs-webpack-loader/config/serve.json new file mode 100644 index 000000000..087899637 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/config/serve.json @@ -0,0 +1,9 @@ +{ + "port": 4321, + "initialPage": "https://localhost:5432/workbench", + "https": true, + "api": { + "port": 5432, + "entryPath": "node_modules/@microsoft/sp-webpart-workbench/lib/api/" + } +} diff --git a/samples/handlebarsjs-webpack-loader/config/tslint.json b/samples/handlebarsjs-webpack-loader/config/tslint.json new file mode 100644 index 000000000..3c085daaf --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/config/tslint.json @@ -0,0 +1,46 @@ +{ + // Display errors as warnings + "displayAsWarning": true, + // The TSLint task may have been configured with several custom lint rules + // before this config file is read (for example lint rules from the tslint-microsoft-contrib + // project). If true, this flag will deactivate any of these rules. + "removeExistingRules": true, + // When true, the TSLint task is configured with some default TSLint "rules.": + "useDefaultConfigAsBase": false, + // Since removeExistingRules=true and useDefaultConfigAsBase=false, there will be no lint rules + // which are active, other than the list of rules below. + "lintConfig": { + // Opt-in to Lint rules which help to eliminate bugs in JavaScript + "rules": { + "class-name": false, + "export-name": false, + "forin": false, + "label-position": false, + "member-access": true, + "no-arg": false, + "no-console": false, + "no-construct": false, + "no-duplicate-case": true, + "no-duplicate-variable": true, + "no-eval": false, + "no-function-expression": true, + "no-internal-module": true, + "no-shadowed-variable": true, + "no-switch-case-fall-through": true, + "no-unnecessary-semicolons": true, + "no-unused-expression": true, + "no-unused-imports": true, + "no-use-before-declare": true, + "no-with-statement": true, + "semicolon": true, + "trailing-comma": false, + "typedef": false, + "typedef-whitespace": false, + "use-named-parameter": true, + "valid-typeof": true, + "variable-name": false, + "whitespace": false, + "prefer-const": true + } + } +} \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/config/write-manifests.json b/samples/handlebarsjs-webpack-loader/config/write-manifests.json new file mode 100644 index 000000000..0a4bafb06 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/config/write-manifests.json @@ -0,0 +1,3 @@ +{ + "cdnBasePath": "" +} \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/gulpfile.js b/samples/handlebarsjs-webpack-loader/gulpfile.js new file mode 100644 index 000000000..8b54bd1cc --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/gulpfile.js @@ -0,0 +1,22 @@ +'use strict'; + +const gulp = require('gulp'); +const build = require('@microsoft/sp-build-web'); + +// Custom config section starts here +const loaderConfig = [{ + test: /\.hbs/, + loader: "handlebars-template-loader" +}]; + +// push loader configuration to SPFx configuration +build.configureWebpack.mergeConfig({ + additionalConfiguration: (generatedConfiguration) => { + generatedConfiguration.module.loaders.push(loaderConfig); + + return generatedConfiguration; + + } +}); + +build.initialize(gulp); diff --git a/samples/handlebarsjs-webpack-loader/package.json b/samples/handlebarsjs-webpack-loader/package.json new file mode 100644 index 000000000..440e44673 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/package.json @@ -0,0 +1,29 @@ +{ + "name": "spfx-handlebars", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=0.10.0" + }, + "dependencies": { + "@microsoft/sp-client-base": "~1.0.0", + "@microsoft/sp-core-library": "~1.0.0", + "@microsoft/sp-webpart-base": "~1.0.0", + "@types/webpack-env": ">=1.12.1 <1.14.0", + "handlebars": "^4.0.6" + }, + "devDependencies": { + "@microsoft/sp-build-web": "~1.0.0", + "@microsoft/sp-module-interfaces": "~1.0.0", + "@microsoft/sp-webpart-workbench": "~1.0.0", + "@types/chai": ">=3.4.34 <3.6.0", + "@types/mocha": ">=2.2.33 <2.6.0", + "gulp": "~3.9.1", + "handlebars-template-loader": "^0.7.0" + }, + "scripts": { + "build": "gulp bundle", + "clean": "gulp clean", + "test": "gulp test" + } +} diff --git a/samples/handlebarsjs-webpack-loader/settings.json b/samples/handlebarsjs-webpack-loader/settings.json new file mode 100644 index 000000000..0c4a6693f --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/settings.json @@ -0,0 +1,3 @@ +{ + "vsicons.presets.angular": false +} \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/src/templates/HelloWorld.hbs b/samples/handlebarsjs-webpack-loader/src/templates/HelloWorld.hbs new file mode 100644 index 000000000..27a629d9a --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/src/templates/HelloWorld.hbs @@ -0,0 +1,14 @@ +
+
+
+
+ Welcome to SharePoint! +

Customize SharePoint experiences using Web Parts.

+

{{description}}

+ + Learn more + +
+
+
+
diff --git a/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/HandlebarsDemo.module.scss b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/HandlebarsDemo.module.scss new file mode 100644 index 000000000..8f3144d1b --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/HandlebarsDemo.module.scss @@ -0,0 +1,52 @@ +.helloWorld { + .container { + max-width: 700px; + margin: 0px auto; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .row { + padding: 20px; + } + + .listItem { + max-width: 715px; + margin: 5px auto 5px auto; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .button { + // Our button + text-decoration: none; + height: 32px; + + // Primary Button + min-width: 80px; + background-color: #0078d7; + border-color: #0078d7; + color: #ffffff; + + // Basic Button + outline: transparent; + position: relative; + font-family: "Segoe UI WestEuropean","Segoe UI",-apple-system,BlinkMacSystemFont,Roboto,"Helvetica Neue",sans-serif; + -webkit-font-smoothing: antialiased; + font-size: 14px; + font-weight: 400; + border-width: 0; + text-align: center; + cursor: pointer; + display: inline-block; + padding: 0 16px; + + .label { + font-weight: 600; + font-size: 14px; + height: 32px; + line-height: 32px; + margin: 0 4px; + vertical-align: top; + display: inline-block; + } + } +} \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/HandlebarsDemoWebPart.manifest.json b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/HandlebarsDemoWebPart.manifest.json new file mode 100644 index 000000000..b34c90ec9 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/HandlebarsDemoWebPart.manifest.json @@ -0,0 +1,20 @@ +{ + "$schema": "../../../node_modules/@microsoft/sp-module-interfaces/lib/manifestSchemas/jsonSchemas/clientSideComponentManifestSchema.json", + + "id": "5cf1bbfb-4088-4eb1-8221-c5ebf4e37606", + "alias": "HandlebarsDemoWebPart", + "componentType": "WebPart", + "version": "0.0.1", + "manifestVersion": 2, + + "preconfiguredEntries": [{ + "groupId": "5cf1bbfb-4088-4eb1-8221-c5ebf4e37606", + "group": { "default": "Under Development" }, + "title": { "default": "HandlebarsDemo" }, + "description": { "default": "Handlebars Demo Web Part" }, + "officeFabricIconFontName": "Page", + "properties": { + "description": "HandlebarsDemo" + } + }] +} diff --git a/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/HandlebarsDemoWebPart.ts b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/HandlebarsDemoWebPart.ts new file mode 100644 index 000000000..a2d47faf6 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/HandlebarsDemoWebPart.ts @@ -0,0 +1,59 @@ +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, + PropertyPaneTextField +} from '@microsoft/sp-webpart-base'; +import { escape } from '@microsoft/sp-lodash-subset'; + +import styles from './HandlebarsDemo.module.scss'; +import * as strings from 'handlebarsDemoStrings'; +import { IHandlebarsDemoWebPartProps } from './IHandlebarsDemoWebPartProps'; + +// Importing handlebars +import * as Handlebars from 'handlebars'; + +// load and precompile template +var HelloWorldTemplate = require('../../templates/HelloWorld.hbs'); + +export default class HandlebarsDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + + // bind data to template + var data = { + styles: styles, + description: this.properties.description + } + + // compile and add template + this.domElement.innerHTML = HelloWorldTemplate(data); + + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + header: { + description: strings.PropertyPaneDescription + }, + groups: [ + { + groupName: strings.BasicGroupName, + groupFields: [ + PropertyPaneTextField('description', { + label: strings.DescriptionFieldLabel + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/IHandlebarsDemoWebPartProps.ts b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/IHandlebarsDemoWebPartProps.ts new file mode 100644 index 000000000..e4eb58e30 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/IHandlebarsDemoWebPartProps.ts @@ -0,0 +1,3 @@ +export interface IHandlebarsDemoWebPartProps { + description: string; +} diff --git a/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/loc/en-us.js b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/loc/en-us.js new file mode 100644 index 000000000..89f98bc1e --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/loc/en-us.js @@ -0,0 +1,7 @@ +define([], function() { + return { + "PropertyPaneDescription": "Description", + "BasicGroupName": "Group Name", + "DescriptionFieldLabel": "Description Field" + } +}); \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/loc/mystrings.d.ts b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..a11b1fafc --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/loc/mystrings.d.ts @@ -0,0 +1,10 @@ +declare interface IHandlebarsDemoStrings { + PropertyPaneDescription: string; + BasicGroupName: string; + DescriptionFieldLabel: string; +} + +declare module 'handlebarsDemoStrings' { + const strings: IHandlebarsDemoStrings; + export = strings; +} diff --git a/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/tests/HandlebarsDemo.test.ts b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/tests/HandlebarsDemo.test.ts new file mode 100644 index 000000000..c98aeb299 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/src/webparts/handlebarsDemo/tests/HandlebarsDemo.test.ts @@ -0,0 +1,9 @@ +/// + +import { assert } from 'chai'; + +describe('HandlebarsDemoWebPart', () => { + it('should do something', () => { + assert.ok(true); + }); +}); diff --git a/samples/handlebarsjs-webpack-loader/tsconfig.json b/samples/handlebarsjs-webpack-loader/tsconfig.json new file mode 100644 index 000000000..5fa39c930 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "es5", + "forceConsistentCasingInFileNames": true, + "module": "commonjs", + "jsx": "react", + "declaration": true, + "sourceMap": true, + "types": [ + "es6-promise", + "es6-collections", + "webpack-env" + ] + } +} diff --git a/samples/handlebarsjs-webpack-loader/typings.json b/samples/handlebarsjs-webpack-loader/typings.json new file mode 100644 index 000000000..634531043 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/typings.json @@ -0,0 +1,5 @@ +{ + "globalDependencies": { + "handlebars": "registry:dt/handlebars#4.0.5+20160810231743" + } +} diff --git a/samples/handlebarsjs-webpack-loader/typings/@ms/odsp.d.ts b/samples/handlebarsjs-webpack-loader/typings/@ms/odsp.d.ts new file mode 100644 index 000000000..2d2913e53 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/typings/@ms/odsp.d.ts @@ -0,0 +1,8 @@ +// Type definitions for Microsoft ODSP projects +// Project: ODSP + +/* Global definition for UNIT_TEST builds + Code that is wrapped inside an if(UNIT_TEST) {...} + block will not be included in the final bundle when the + --ship flag is specified */ +declare const UNIT_TEST: boolean; \ No newline at end of file diff --git a/samples/handlebarsjs-webpack-loader/typings/globals/handlebars/index.d.ts b/samples/handlebarsjs-webpack-loader/typings/globals/handlebars/index.d.ts new file mode 100644 index 000000000..ace400827 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/typings/globals/handlebars/index.d.ts @@ -0,0 +1,291 @@ +// Generated by typings +// Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/90198235019d12c00b3ccca03a36cc3d1579d644/handlebars/index.d.ts +declare namespace Handlebars { + export function registerHelper(name: string, fn: Function, inverse?: boolean): void; + export function registerHelper(name: Object): void; + export function registerPartial(name: string, str: any): void; + export function unregisterHelper(name: string): void; + export function unregisterPartial(name: string): void; + export function K(): void; + export function createFrame(object: any): any; + export function Exception(message: string): void; + export function log(level: number, obj: any): void; + export function parse(input: string): hbs.AST.Program; + export function compile(input: any, options?: CompileOptions): HandlebarsTemplateDelegate; + export function precompile(input: any, options?: PrecompileOptions): TemplateSpecification; + export function template(precompilation: TemplateSpecification): HandlebarsTemplateDelegate; + + export function create(): typeof Handlebars; + + export var SafeString: typeof hbs.SafeString; + export var escapeExpression: typeof hbs.Utils.escapeExpression; + export var Utils: typeof hbs.Utils; + export var logger: Logger; + export var templates: HandlebarsTemplates; + export var helpers: any; + + export function registerDecorator(name: string, fn: Function): void; + export function registerDecorator(obj: {[name: string] : Function}): void; + export function unregisterDecorator(name: string): void; + + export function noConflict(): typeof Handlebars; + + export module AST { + export var helpers: hbs.AST.helpers; + } + + interface ICompiler { + accept(node: hbs.AST.Node): void; + Program(program: hbs.AST.Program): void; + BlockStatement(block: hbs.AST.BlockStatement): void; + PartialStatement(partial: hbs.AST.PartialStatement): void; + PartialBlockStatement(partial: hbs.AST.PartialBlockStatement): void; + DecoratorBlock(decorator: hbs.AST.DecoratorBlock): void; + Decorator(decorator: hbs.AST.Decorator): void; + MustacheStatement(mustache: hbs.AST.MustacheStatement): void; + ContentStatement(content: hbs.AST.ContentStatement): void; + CommentStatement(comment?: hbs.AST.CommentStatement): void; + SubExpression(sexpr: hbs.AST.SubExpression): void; + PathExpression(path: hbs.AST.PathExpression): void; + StringLiteral(str: hbs.AST.StringLiteral): void; + NumberLiteral(num: hbs.AST.NumberLiteral): void; + BooleanLiteral(bool: hbs.AST.BooleanLiteral): void; + UndefinedLiteral(): void; + NullLiteral(): void; + Hash(hash: hbs.AST.Hash): void; + } + + export class Visitor implements ICompiler { + accept(node: hbs.AST.Node): void; + acceptKey(node: hbs.AST.Node, name: string): void; + acceptArray(arr: hbs.AST.Expression[]): void; + Program(program: hbs.AST.Program): void; + BlockStatement(block: hbs.AST.BlockStatement): void; + PartialStatement(partial: hbs.AST.PartialStatement): void; + PartialBlockStatement(partial: hbs.AST.PartialBlockStatement): void; + DecoratorBlock(decorator: hbs.AST.DecoratorBlock): void; + Decorator(decorator: hbs.AST.Decorator): void; + MustacheStatement(mustache: hbs.AST.MustacheStatement): void; + ContentStatement(content: hbs.AST.ContentStatement): void; + CommentStatement(comment?: hbs.AST.CommentStatement): void; + SubExpression(sexpr: hbs.AST.SubExpression): void; + PathExpression(path: hbs.AST.PathExpression): void; + StringLiteral(str: hbs.AST.StringLiteral): void; + NumberLiteral(num: hbs.AST.NumberLiteral): void; + BooleanLiteral(bool: hbs.AST.BooleanLiteral): void; + UndefinedLiteral(): void; + NullLiteral(): void; + Hash(hash: hbs.AST.Hash): void; + } +} + +/** +* Implement this interface on your MVW/MVVM/MVC views such as Backbone.View +**/ +interface HandlebarsTemplatable { + template: HandlebarsTemplateDelegate; +} + +interface HandlebarsTemplateDelegate { + (context: any, options?: any): string; +} + +interface HandlebarsTemplates { + [index: string]: HandlebarsTemplateDelegate; +} + +interface TemplateSpecification { + +} + +interface CompileOptions { + data?: boolean; + compat?: boolean; + knownHelpers?: { + helperMissing?: boolean; + blockHelperMissing?: boolean; + each?: boolean; + if?: boolean; + unless?: boolean; + with?: boolean; + log?: boolean; + lookup?: boolean; + } + knownHelpersOnly?: boolean; + noEscape?: boolean; + strict?: boolean; + assumeObjects?: boolean; + preventIndent?: boolean; + ignoreStandalone?: boolean; + explicitPartialContext?: boolean; +} + +interface PrecompileOptions extends CompileOptions { + srcName?: string; + destName?: string; +} + +declare namespace hbs { + class SafeString { + constructor(str: string); + static toString(): string; + } + + namespace Utils { + function escapeExpression(str: string): string; + function createFrame(obj: Object): Object; + function isEmpty(obj: any) : boolean; + function extend(obj: any, ...source: any[]): any; + function toString(obj: any): string; + function isArray(obj: any): boolean; + function isFunction(obj: any): boolean; + } +} + +interface Logger { + DEBUG: number; + INFO: number; + WARN: number; + ERROR: number; + level: number; + + methodMap: { [level: number]: string }; + + log(level: number, obj: string): void; +} + +declare namespace hbs { + namespace AST { + interface Node { + type: string; + loc: SourceLocation; + } + + interface SourceLocation { + source: string; + start: Position; + end: Position; + } + + interface Position { + line: number; + column: number; + } + + interface Program extends Node { + body: Statement[]; + blockParams: string[]; + } + + interface Statement extends Node {} + + interface MustacheStatement extends Statement { + path: PathExpression | Literal; + params: Expression[]; + hash: Hash; + escaped: boolean; + strip: StripFlags; + } + + interface Decorator extends MustacheStatement { } + + interface BlockStatement extends Statement { + path: PathExpression; + params: Expression[]; + hash: Hash; + program: Program; + inverse: Program; + openStrip: StripFlags; + inverseStrip: StripFlags; + closeStrip: StripFlags; + } + + interface DecoratorBlock extends BlockStatement { } + + interface PartialStatement extends Statement { + name: PathExpression | SubExpression; + params: Expression[]; + hash: Hash; + indent: string; + strip: StripFlags; + } + + interface PartialBlockStatement extends Statement { + name: PathExpression | SubExpression; + params: Expression[], + hash: Hash, + program: Program, + openStrip: StripFlags, + closeStrip: StripFlags + } + + interface ContentStatement extends Statement { + value: string; + original: StripFlags; + } + + interface CommentStatement extends Statement { + value: string; + strip: StripFlags; + } + + interface Expression extends Node {} + + interface SubExpression extends Expression { + path: PathExpression; + params: Expression[]; + hash: Hash; + } + + interface PathExpression extends Expression { + data: boolean; + depth: number; + parts: string[]; + original: string; + } + + interface Literal extends Expression {} + interface StringLiteral extends Literal { + value: string; + original: string; + } + + interface BooleanLiteral extends Literal { + value: boolean; + original: boolean; + } + + interface NumberLiteral extends Literal { + value: number; + original: number; + } + + interface UndefinedLiteral extends Literal {} + + interface NullLiteral extends Literal {} + + interface Hash extends Node { + pairs: HashPair[]; + } + + interface HashPair extends Node { + key: string; + value: Expression; + } + + interface StripFlags { + open: boolean; + close: boolean; + } + + interface helpers { + helperExpression(node: Node): boolean; + scopeId(path: PathExpression): boolean; + simpleId(path: PathExpression): boolean; + } + } +} + +declare module "handlebars" { + export = Handlebars; +} diff --git a/samples/handlebarsjs-webpack-loader/typings/globals/handlebars/typings.json b/samples/handlebarsjs-webpack-loader/typings/globals/handlebars/typings.json new file mode 100644 index 000000000..49e3ced3a --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/typings/globals/handlebars/typings.json @@ -0,0 +1,8 @@ +{ + "resolution": "main", + "tree": { + "src": "https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/90198235019d12c00b3ccca03a36cc3d1579d644/handlebars/index.d.ts", + "raw": "registry:dt/handlebars#4.0.5+20160810231743", + "typings": "https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/90198235019d12c00b3ccca03a36cc3d1579d644/handlebars/index.d.ts" + } +} diff --git a/samples/handlebarsjs-webpack-loader/typings/index.d.ts b/samples/handlebarsjs-webpack-loader/typings/index.d.ts new file mode 100644 index 000000000..5045c8953 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/typings/index.d.ts @@ -0,0 +1 @@ +/// diff --git a/samples/handlebarsjs-webpack-loader/typings/tsd.d.ts b/samples/handlebarsjs-webpack-loader/typings/tsd.d.ts new file mode 100644 index 000000000..e7efdd728 --- /dev/null +++ b/samples/handlebarsjs-webpack-loader/typings/tsd.d.ts @@ -0,0 +1 @@ +///