ボイラープレートあったのでcloneした
https://github.com/whatupdave/lambda-boilerplate
$ git clone https://github.com/whatupdave/lambda-boilerplate.git try-lambda
$ cd try-lambda
$ npm i
~/.aws/credentialsの設定は以下を参照した
http://dev.classmethod.jp/cloud/aws-cli-credential-config/
$ pip install awscli
$ aws configure
$ gulp deploy
(node:4285) fs: re-evaluating native module sources is not supported. If you are using the graceful-fs module, please update it to a more recent version.
[09:39:39] Using gulpfile ~/dev/try-lambda/gulpfile.js
[09:39:40] Starting 'deploy'...
[09:39:40] Starting 'lambda-zip'...
[09:39:40] Starting 'clean'...
[09:39:40] Finished 'clean' after 12 ms
[09:39:40] Starting 'compile'...
[09:39:40] Starting 'node-mods'...
[09:39:40] Starting 'env'...
[09:39:40] Finished 'env' after 1.92 ms
[09:39:40] Finished 'compile' after 171 ms
npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
> fsevents@1.0.14 install /Users/user/dev/try-lambda/dist/node_modules/fsevents
> node-pre-gyp install --fallback-to-build
[fsevents] Success: "/Users/user/dev/try-lambda/dist/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node" is installed via remote
lambda-boilerplate@1.0.0 /Users/user/dev/try-lambda/dist
├─┬ babel@5.8.38
│ ├─┬ babel-core@5.8.38
│ │ ├── babel-plugin-constant-folding@1.0.1
│ │ ├── babel-plugin-dead-code-elimination@1.0.2
│ │ ├── babel-plugin-eval@1.0.1
│ │ ├── babel-plugin-inline-environment-variables@1.0.1
│ │ ├── babel-plugin-jscript@1.0.4
│ │ ├── babel-plugin-member-expression-literals@1.0.1
│ │ ├── babel-plugin-property-literals@1.0.1
│ │ ├── babel-plugin-proto-to-assign@1.0.4
│ │ ├── babel-plugin-react-constant-elements@1.0.3
│ │ ├── babel-plugin-react-display-name@1.0.3
│ │ ├── babel-plugin-remove-console@1.0.1
│ │ ├── babel-plugin-remove-debugger@1.0.1
│ │ ├── babel-plugin-runtime@1.0.7
│ │ ├─┬ babel-plugin-undeclared-variables-check@1.0.2
│ │ │ └── leven@1.0.2
│ │ ├── babel-plugin-undefined-to-void@1.1.6
│ │ ├── babylon@5.8.38
│ │ ├── bluebird@2.10.2
│ │ ├─┬ chalk@1.1.3
│ │ │ ├── ansi-styles@2.2.1
│ │ │ ├── escape-string-regexp@1.0.5
│ │ │ ├─┬ has-ansi@2.0.0
│ │ │ │ └── ansi-regex@2.0.0
│ │ │ ├── strip-ansi@3.0.1
│ │ │ └── supports-color@2.0.0
│ │ ├── core-js@1.2.7
│ │ ├─┬ debug@2.2.0
│ │ │ └── ms@0.7.1
│ │ ├─┬ detect-indent@3.0.1
│ │ │ ├── get-stdin@4.0.1
│ │ │ └── minimist@1.2.0
│ │ ├── esutils@2.0.2
│ │ ├── globals@6.4.1
│ │ ├─┬ home-or-tmp@1.0.0
│ │ │ ├── os-tmpdir@1.0.1
│ │ │ └── user-home@1.1.1
│ │ ├─┬ is-integer@1.0.6
│ │ │ └─┬ is-finite@1.0.1
│ │ │ └── number-is-nan@1.0.0
│ │ ├── js-tokens@1.0.1
│ │ ├── json5@0.4.0
│ │ ├─┬ minimatch@2.0.10
│ │ │ └─┬ brace-expansion@1.1.6
│ │ │ ├── balanced-match@0.4.2
│ │ │ └── concat-map@0.0.1
│ │ ├── private@0.1.6
│ │ ├─┬ regenerator@0.8.40
│ │ │ ├─┬ commoner@0.10.4
│ │ │ │ ├─┬ detective@4.3.1
│ │ │ │ │ ├── acorn@1.2.2
│ │ │ │ │ └── defined@1.0.0
│ │ │ │ ├── iconv-lite@0.4.13
│ │ │ │ └── q@1.4.1
│ │ │ ├─┬ defs@1.1.1
│ │ │ │ ├─┬ alter@0.2.0
│ │ │ │ │ └── stable@0.1.5
│ │ │ │ ├── ast-traverse@0.1.1
│ │ │ │ ├── breakable@1.0.0
│ │ │ │ ├── simple-fmt@0.1.0
│ │ │ │ ├── simple-is@0.2.0
│ │ │ │ ├── stringmap@0.2.2
│ │ │ │ ├── stringset@0.2.1
│ │ │ │ ├── tryor@0.1.2
│ │ │ │ └─┬ yargs@3.27.0
│ │ │ │ ├── camelcase@1.2.1
│ │ │ │ ├─┬ cliui@2.1.0
│ │ │ │ │ ├─┬ center-align@0.1.3
│ │ │ │ │ │ ├─┬ align-text@0.1.4
│ │ │ │ │ │ │ └── longest@1.0.1
│ │ │ │ │ │ └── lazy-cache@1.0.4
│ │ │ │ │ ├── right-align@0.1.3
│ │ │ │ │ └── wordwrap@0.0.2
│ │ │ │ ├── decamelize@1.2.0
│ │ │ │ ├─┬ os-locale@1.4.0
│ │ │ │ │ └─┬ lcid@1.0.0
│ │ │ │ │ └── invert-kv@1.0.0
│ │ │ │ ├── window-size@0.1.4
│ │ │ │ └── y18n@3.2.1
│ │ │ ├── esprima-fb@15001.1001.0-dev-harmony-fb
│ │ │ ├─┬ recast@0.10.33
│ │ │ │ └── ast-types@0.8.12
│ │ │ └── through@2.3.8
│ │ ├─┬ regexpu@1.3.0
│ │ │ ├── esprima@2.7.2
│ │ │ ├── regenerate@1.3.1
│ │ │ ├── regjsgen@0.2.0
│ │ │ └─┬ regjsparser@0.1.5
│ │ │ └── jsesc@0.5.0
│ │ ├── repeating@1.1.3
│ │ ├── resolve@1.1.7
│ │ ├── shebang-regex@1.0.0
│ │ ├─┬ source-map-support@0.2.10
│ │ │ └─┬ source-map@0.1.32
│ │ │ └── amdefine@1.0.0
│ │ ├── to-fast-properties@1.0.2
│ │ ├── trim-right@1.0.1
│ │ └── try-resolve@1.0.1
│ ├─┬ chokidar@1.6.0
│ │ ├─┬ anymatch@1.3.0
│ │ │ ├── arrify@1.0.1
│ │ │ └─┬ micromatch@2.3.11
│ │ │ ├─┬ arr-diff@2.0.0
│ │ │ │ └── arr-flatten@1.0.1
│ │ │ ├── array-unique@0.2.1
│ │ │ ├─┬ braces@1.8.5
│ │ │ │ ├─┬ expand-range@1.8.2
│ │ │ │ │ └─┬ fill-range@2.2.3
│ │ │ │ │ ├── is-number@2.1.0
│ │ │ │ │ ├── isobject@2.1.0
│ │ │ │ │ ├── randomatic@1.1.5
│ │ │ │ │ └── repeat-string@1.5.4
│ │ │ │ ├── preserve@0.2.0
│ │ │ │ └── repeat-element@1.1.2
│ │ │ ├─┬ expand-brackets@0.1.5
│ │ │ │ └── is-posix-bracket@0.1.1
│ │ │ ├── extglob@0.3.2
│ │ │ ├── filename-regex@2.0.0
│ │ │ ├─┬ kind-of@3.0.4
│ │ │ │ └── is-buffer@1.1.4
│ │ │ ├── normalize-path@2.0.1
│ │ │ ├─┬ object.omit@2.0.0
│ │ │ │ ├─┬ for-own@0.1.4
│ │ │ │ │ └── for-in@0.1.5
│ │ │ │ └── is-extendable@0.1.1
│ │ │ ├─┬ parse-glob@3.0.4
│ │ │ │ ├── glob-base@0.3.0
│ │ │ │ └── is-dotfile@1.0.2
│ │ │ └─┬ regex-cache@0.4.3
│ │ │ ├── is-equal-shallow@0.1.3
│ │ │ └── is-primitive@2.0.0
│ │ ├── async-each@1.0.0
│ │ ├─┬ fsevents@1.0.14
│ │ │ ├── nan@2.4.0
│ │ │ └─┬ node-pre-gyp@0.6.29
│ │ │ ├─┬ mkdirp@0.5.1
│ │ │ │ └── minimist@0.0.8
│ │ │ ├─┬ nopt@3.0.6
│ │ │ │ └── abbrev@1.0.9
│ │ │ ├─┬ npmlog@3.1.2
│ │ │ │ ├─┬ are-we-there-yet@1.1.2
│ │ │ │ │ └── delegates@1.0.0
│ │ │ │ ├── console-control-strings@1.1.0
│ │ │ │ ├─┬ gauge@2.6.0
│ │ │ │ │ ├── aproba@1.0.4
│ │ │ │ │ ├── has-color@0.1.7
│ │ │ │ │ ├── has-unicode@2.0.1
│ │ │ │ │ ├── object-assign@4.1.0
│ │ │ │ │ ├── signal-exit@3.0.0
│ │ │ │ │ ├─┬ string-width@1.0.1
│ │ │ │ │ │ ├─┬ code-point-at@1.0.0
│ │ │ │ │ │ │ └── number-is-nan@1.0.0
│ │ │ │ │ │ └── is-fullwidth-code-point@1.0.0
│ │ │ │ │ ├─┬ strip-ansi@3.0.1
│ │ │ │ │ │ └── ansi-regex@2.0.0
│ │ │ │ │ └── wide-align@1.1.0
│ │ │ │ └── set-blocking@2.0.0
│ │ │ ├─┬ rc@1.1.6
│ │ │ │ ├── deep-extend@0.4.1
│ │ │ │ ├── ini@1.3.4
│ │ │ │ ├── minimist@1.2.0
│ │ │ │ └── strip-json-comments@1.0.4
│ │ │ ├─┬ request@2.73.0
│ │ │ │ ├── aws-sign2@0.6.0
│ │ │ │ ├── aws4@1.4.1
│ │ │ │ ├─┬ bl@1.1.2
│ │ │ │ │ └── readable-stream@2.0.6
│ │ │ │ ├── caseless@0.11.0
│ │ │ │ ├─┬ combined-stream@1.0.5
│ │ │ │ │ └── delayed-stream@1.0.0
│ │ │ │ ├── extend@3.0.0
│ │ │ │ ├── forever-agent@0.6.1
│ │ │ │ ├─┬ form-data@1.0.0-rc4
│ │ │ │ │ └── async@1.5.2
│ │ │ │ ├─┬ har-validator@2.0.6
│ │ │ │ │ ├─┬ chalk@1.1.3
│ │ │ │ │ │ ├── ansi-styles@2.2.1
│ │ │ │ │ │ ├── escape-string-regexp@1.0.5
│ │ │ │ │ │ ├── has-ansi@2.0.0
│ │ │ │ │ │ └── supports-color@2.0.0
│ │ │ │ │ ├─┬ commander@2.9.0
│ │ │ │ │ │ └── graceful-readlink@1.0.1
│ │ │ │ │ ├─┬ is-my-json-valid@2.13.1
│ │ │ │ │ │ ├── generate-function@2.0.0
│ │ │ │ │ │ ├─┬ generate-object-property@1.2.0
│ │ │ │ │ │ │ └── is-property@1.0.2
│ │ │ │ │ │ ├── jsonpointer@2.0.0
│ │ │ │ │ │ └── xtend@4.0.1
│ │ │ │ │ └─┬ pinkie-promise@2.0.1
│ │ │ │ │ └── pinkie@2.0.4
│ │ │ │ ├─┬ hawk@3.1.3
│ │ │ │ │ ├── boom@2.10.1
│ │ │ │ │ ├── cryptiles@2.0.5
│ │ │ │ │ ├── hoek@2.16.3
│ │ │ │ │ └── sntp@1.0.9
│ │ │ │ ├─┬ http-signature@1.1.1
│ │ │ │ │ ├── assert-plus@0.2.0
│ │ │ │ │ ├─┬ jsprim@1.3.0
│ │ │ │ │ │ ├── extsprintf@1.0.2
│ │ │ │ │ │ ├── json-schema@0.2.2
│ │ │ │ │ │ └── verror@1.3.6
│ │ │ │ │ └─┬ sshpk@1.8.3
│ │ │ │ │ ├── asn1@0.2.3
│ │ │ │ │ ├── assert-plus@1.0.0
│ │ │ │ │ ├─┬ dashdash@1.14.0
│ │ │ │ │ │ └── assert-plus@1.0.0
│ │ │ │ │ ├── ecc-jsbn@0.1.1
│ │ │ │ │ ├─┬ getpass@0.1.6
│ │ │ │ │ │ └── assert-plus@1.0.0
│ │ │ │ │ ├── jodid25519@1.0.2
│ │ │ │ │ ├── jsbn@0.1.0
│ │ │ │ │ └── tweetnacl@0.13.3
│ │ │ │ ├── is-typedarray@1.0.0
│ │ │ │ ├── isstream@0.1.2
│ │ │ │ ├── json-stringify-safe@5.0.1
│ │ │ │ ├─┬ mime-types@2.1.11
│ │ │ │ │ └── mime-db@1.23.0
│ │ │ │ ├── node-uuid@1.4.7
│ │ │ │ ├── oauth-sign@0.8.2
│ │ │ │ ├── qs@6.2.0
│ │ │ │ ├── stringstream@0.0.5
│ │ │ │ ├── tough-cookie@2.2.2
│ │ │ │ └── tunnel-agent@0.4.3
│ │ │ ├─┬ rimraf@2.5.3
│ │ │ │ └─┬ glob@7.0.5
│ │ │ │ ├── fs.realpath@1.0.0
│ │ │ │ ├── inflight@1.0.5
│ │ │ │ ├─┬ minimatch@3.0.2
│ │ │ │ │ └─┬ brace-expansion@1.1.5
│ │ │ │ │ ├── balanced-match@0.4.2
│ │ │ │ │ └── concat-map@0.0.1
│ │ │ │ └── path-is-absolute@1.0.0
│ │ │ ├── semver@5.2.0
│ │ │ ├─┬ tar@2.2.1
│ │ │ │ ├── block-stream@0.0.9
│ │ │ │ ├─┬ fstream@1.0.10
│ │ │ │ │ └── graceful-fs@4.1.4
│ │ │ │ └── inherits@2.0.1
│ │ │ └─┬ tar-pack@3.1.4
│ │ │ ├─┬ debug@2.2.0
│ │ │ │ └── ms@0.7.1
│ │ │ ├── fstream-ignore@1.0.5
│ │ │ ├─┬ once@1.3.3
│ │ │ │ └── wrappy@1.0.2
│ │ │ ├─┬ readable-stream@2.1.4
│ │ │ │ ├── buffer-shims@1.0.0
│ │ │ │ ├── core-util-is@1.0.2
│ │ │ │ ├── isarray@1.0.0
│ │ │ │ ├── process-nextick-args@1.0.7
│ │ │ │ ├── string_decoder@0.10.31
│ │ │ │ └── util-deprecate@1.0.2
│ │ │ └── uid-number@0.0.6
│ │ ├── glob-parent@2.0.0
│ │ ├── inherits@2.0.1
│ │ ├─┬ is-binary-path@1.0.1
│ │ │ └── binary-extensions@1.5.0
│ │ ├─┬ is-glob@2.0.1
│ │ │ └── is-extglob@1.0.0
│ │ └─┬ readdirp@2.1.0
│ │ ├── minimatch@3.0.2
│ │ ├─┬ readable-stream@2.1.4
│ │ │ ├── buffer-shims@1.0.0
│ │ │ ├── core-util-is@1.0.2
│ │ │ ├── isarray@1.0.0
│ │ │ ├── process-nextick-args@1.0.7
│ │ │ ├── string_decoder@0.10.31
│ │ │ └── util-deprecate@1.0.2
│ │ └── set-immediate-shim@1.0.1
│ ├─┬ commander@2.9.0
│ │ └── graceful-readlink@1.0.1
│ ├── convert-source-map@1.3.0
│ ├── fs-readdir-recursive@0.1.2
│ ├─┬ glob@5.0.15
│ │ ├─┬ inflight@1.0.5
│ │ │ └── wrappy@1.0.2
│ │ └── once@1.3.3
│ ├── lodash@3.10.1
│ ├─┬ output-file-sync@1.1.2
│ │ ├── graceful-fs@4.1.5
│ │ ├─┬ mkdirp@0.5.1
│ │ │ └── minimist@0.0.8
│ │ └── object-assign@4.1.0
│ ├── path-exists@1.0.0
│ ├── path-is-absolute@1.0.0
│ ├── slash@1.0.0
│ └── source-map@0.5.6
└── dotenv@1.2.0
npm WARN lambda-boilerplate@1.0.0 No repository field.
[09:40:19] Finished 'node-mods' after 39 s
[09:40:19] Starting 'zip'...
[09:40:22] Finished 'zip' after 3.33 s
[09:40:22] Finished 'lambda-zip' after 43 s
[09:40:22] Starting 'upload'...
[09:40:22] Uploading Lambda function "my-lambda-func"...
[09:40:28] 'upload' errored after 5.36 s
[09:40:28] Error in plugin 'gulp-awslambda'
Message:
1 validation error detected: Value 'arn:aws:iam::123456789:role/lambda_execution_role' at 'role' failed to satisfy constraint: Member must satisfy regular expression pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+
[09:40:28] 'deploy' errored after 48 s
[09:40:28] Error in plugin 'run-sequence(upload)'
Message:
1 validation error detected: Value 'arn:aws:iam::123456789:role/lambda_execution_role' at 'role' failed to satisfy constraint: Member must satisfy regular expression pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+
Stack:
at finish (/Users/user/dev/try-lambda/node_modules/run-sequence/index.js:56:13)
at Gulp.onError (/Users/user/dev/try-lambda/node_modules/run-sequence/index.js:67:4)
at emitOne (events.js:101:20)
at Gulp.emit (events.js:188:7)
at Gulp.Orchestrator._emitTaskDone (/Users/user/dev/try-lambda/node_modules/orchestrator/index.js:264:8)
at /Users/user/dev/try-lambda/node_modules/orchestrator/index.js:275:23
at finish (/Users/user/dev/try-lambda/node_modules/orchestrator/lib/runTask.js:21:8)
at DestroyableTransform.<anonymous> (/Users/user/dev/try-lambda/node_modules/orchestrator/lib/runTask.js:52:4)
at DestroyableTransform.f (/Users/user/dev/try-lambda/node_modules/once/once.js:17:25)
at emitOne (events.js:101:20)
ロールがなんかおかしいということで、gulpfileを確認したらlambda-config.jsを読み込んでいた。 さらにlambda-config.jsを確認したところ、role値がアップロード用の設定らしきファイルだった。
module.exports = {
FunctionName: 'my-lambda-func',
Handler: 'index.handler',
Role: 'arn:aws:iam::972469208440:role/service-role/myRoleName',
Timeout: 60,
}
IAMからロールを作成し、lambda-config.jsのrole値を変更してもう一度実行。
$ gulp deploy
(node:4992) fs: re-evaluating native module sources is not supported. If you are using the graceful-fs module, please update it to a more recent version.
[23:15:23] Using gulpfile ~/dev/try-lambda/gulpfile.js
[23:15:23] Starting 'deploy'...
[23:15:23] Starting 'lambda-zip'...
[23:15:23] Starting 'clean'...
[23:15:24] Finished 'clean' after 637 ms
[23:15:24] Starting 'compile'...
[23:15:24] Starting 'node-mods'...
[23:15:24] Starting 'env'...
[23:15:24] Finished 'env' after 3.66 ms
[23:15:24] Finished 'compile' after 158 ms
npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
> fsevents@1.0.14 install /Users/user/dev/try-lambda/dist/node_modules/fsevents
> node-pre-gyp install --fallback-to-build
[fsevents] Success: "/Users/user/dev/try-lambda/dist/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node" is installed via remote
lambda-boilerplate@1.0.0 /Users/user/dev/try-lambda/dist
├─┬ babel@5.8.38
│ ├─┬ babel-core@5.8.38
│ │ ├── babel-plugin-constant-folding@1.0.1
│ │ ├── babel-plugin-dead-code-elimination@1.0.2
│ │ ├── babel-plugin-eval@1.0.1
│ │ ├── babel-plugin-inline-environment-variables@1.0.1
│ │ ├── babel-plugin-jscript@1.0.4
│ │ ├── babel-plugin-member-expression-literals@1.0.1
│ │ ├── babel-plugin-property-literals@1.0.1
│ │ ├── babel-plugin-proto-to-assign@1.0.4
│ │ ├── babel-plugin-react-constant-elements@1.0.3
│ │ ├── babel-plugin-react-display-name@1.0.3
│ │ ├── babel-plugin-remove-console@1.0.1
│ │ ├── babel-plugin-remove-debugger@1.0.1
│ │ ├── babel-plugin-runtime@1.0.7
│ │ ├─┬ babel-plugin-undeclared-variables-check@1.0.2
│ │ │ └── leven@1.0.2
│ │ ├── babel-plugin-undefined-to-void@1.1.6
│ │ ├── babylon@5.8.38
│ │ ├── bluebird@2.10.2
│ │ ├─┬ chalk@1.1.3
│ │ │ ├── ansi-styles@2.2.1
│ │ │ ├── escape-string-regexp@1.0.5
│ │ │ ├─┬ has-ansi@2.0.0
│ │ │ │ └── ansi-regex@2.0.0
│ │ │ ├── strip-ansi@3.0.1
│ │ │ └── supports-color@2.0.0
│ │ ├── core-js@1.2.7
│ │ ├─┬ debug@2.2.0
│ │ │ └── ms@0.7.1
│ │ ├─┬ detect-indent@3.0.1
│ │ │ ├── get-stdin@4.0.1
│ │ │ └── minimist@1.2.0
│ │ ├── esutils@2.0.2
│ │ ├── globals@6.4.1
│ │ ├─┬ home-or-tmp@1.0.0
│ │ │ ├── os-tmpdir@1.0.1
│ │ │ └── user-home@1.1.1
│ │ ├─┬ is-integer@1.0.6
│ │ │ └─┬ is-finite@1.0.1
│ │ │ └── number-is-nan@1.0.0
│ │ ├── js-tokens@1.0.1
│ │ ├── json5@0.4.0
│ │ ├─┬ minimatch@2.0.10
│ │ │ └─┬ brace-expansion@1.1.6
│ │ │ ├── balanced-match@0.4.2
│ │ │ └── concat-map@0.0.1
│ │ ├── private@0.1.6
│ │ ├─┬ regenerator@0.8.40
│ │ │ ├─┬ commoner@0.10.4
│ │ │ │ ├─┬ detective@4.3.1
│ │ │ │ │ ├── acorn@1.2.2
│ │ │ │ │ └── defined@1.0.0
│ │ │ │ ├── iconv-lite@0.4.13
│ │ │ │ └── q@1.4.1
│ │ │ ├─┬ defs@1.1.1
│ │ │ │ ├─┬ alter@0.2.0
│ │ │ │ │ └── stable@0.1.5
│ │ │ │ ├── ast-traverse@0.1.1
│ │ │ │ ├── breakable@1.0.0
│ │ │ │ ├── simple-fmt@0.1.0
│ │ │ │ ├── simple-is@0.2.0
│ │ │ │ ├── stringmap@0.2.2
│ │ │ │ ├── stringset@0.2.1
│ │ │ │ ├── tryor@0.1.2
│ │ │ │ └─┬ yargs@3.27.0
│ │ │ │ ├── camelcase@1.2.1
│ │ │ │ ├─┬ cliui@2.1.0
│ │ │ │ │ ├─┬ center-align@0.1.3
│ │ │ │ │ │ ├─┬ align-text@0.1.4
│ │ │ │ │ │ │ └── longest@1.0.1
│ │ │ │ │ │ └── lazy-cache@1.0.4
│ │ │ │ │ ├── right-align@0.1.3
│ │ │ │ │ └── wordwrap@0.0.2
│ │ │ │ ├── decamelize@1.2.0
│ │ │ │ ├─┬ os-locale@1.4.0
│ │ │ │ │ └─┬ lcid@1.0.0
│ │ │ │ │ └── invert-kv@1.0.0
│ │ │ │ ├── window-size@0.1.4
│ │ │ │ └── y18n@3.2.1
│ │ │ ├── esprima-fb@15001.1001.0-dev-harmony-fb
│ │ │ ├─┬ recast@0.10.33
│ │ │ │ └── ast-types@0.8.12
│ │ │ └── through@2.3.8
│ │ ├─┬ regexpu@1.3.0
│ │ │ ├── esprima@2.7.2
│ │ │ ├── regenerate@1.3.1
│ │ │ ├── regjsgen@0.2.0
│ │ │ └─┬ regjsparser@0.1.5
│ │ │ └── jsesc@0.5.0
│ │ ├── repeating@1.1.3
│ │ ├── resolve@1.1.7
│ │ ├── shebang-regex@1.0.0
│ │ ├─┬ source-map-support@0.2.10
│ │ │ └─┬ source-map@0.1.32
│ │ │ └── amdefine@1.0.0
│ │ ├── to-fast-properties@1.0.2
│ │ ├── trim-right@1.0.1
│ │ └── try-resolve@1.0.1
│ ├─┬ chokidar@1.6.0
│ │ ├─┬ anymatch@1.3.0
│ │ │ ├── arrify@1.0.1
│ │ │ └─┬ micromatch@2.3.11
│ │ │ ├─┬ arr-diff@2.0.0
│ │ │ │ └── arr-flatten@1.0.1
│ │ │ ├── array-unique@0.2.1
│ │ │ ├─┬ braces@1.8.5
│ │ │ │ ├─┬ expand-range@1.8.2
│ │ │ │ │ └─┬ fill-range@2.2.3
│ │ │ │ │ ├── is-number@2.1.0
│ │ │ │ │ ├── isobject@2.1.0
│ │ │ │ │ ├── randomatic@1.1.5
│ │ │ │ │ └── repeat-string@1.5.4
│ │ │ │ ├── preserve@0.2.0
│ │ │ │ └── repeat-element@1.1.2
│ │ │ ├─┬ expand-brackets@0.1.5
│ │ │ │ └── is-posix-bracket@0.1.1
│ │ │ ├── extglob@0.3.2
│ │ │ ├── filename-regex@2.0.0
│ │ │ ├─┬ kind-of@3.0.4
│ │ │ │ └── is-buffer@1.1.4
│ │ │ ├── normalize-path@2.0.1
│ │ │ ├─┬ object.omit@2.0.0
│ │ │ │ ├─┬ for-own@0.1.4
│ │ │ │ │ └── for-in@0.1.5
│ │ │ │ └── is-extendable@0.1.1
│ │ │ ├─┬ parse-glob@3.0.4
│ │ │ │ ├── glob-base@0.3.0
│ │ │ │ └── is-dotfile@1.0.2
│ │ │ └─┬ regex-cache@0.4.3
│ │ │ ├── is-equal-shallow@0.1.3
│ │ │ └── is-primitive@2.0.0
│ │ ├── async-each@1.0.0
│ │ ├─┬ fsevents@1.0.14
│ │ │ ├── nan@2.4.0
│ │ │ └─┬ node-pre-gyp@0.6.29
│ │ │ ├─┬ mkdirp@0.5.1
│ │ │ │ └── minimist@0.0.8
│ │ │ ├─┬ nopt@3.0.6
│ │ │ │ └── abbrev@1.0.9
│ │ │ ├─┬ npmlog@3.1.2
│ │ │ │ ├─┬ are-we-there-yet@1.1.2
│ │ │ │ │ └── delegates@1.0.0
│ │ │ │ ├── console-control-strings@1.1.0
│ │ │ │ ├─┬ gauge@2.6.0
│ │ │ │ │ ├── aproba@1.0.4
│ │ │ │ │ ├── has-color@0.1.7
│ │ │ │ │ ├── has-unicode@2.0.1
│ │ │ │ │ ├── object-assign@4.1.0
│ │ │ │ │ ├── signal-exit@3.0.0
│ │ │ │ │ ├─┬ string-width@1.0.1
│ │ │ │ │ │ ├─┬ code-point-at@1.0.0
│ │ │ │ │ │ │ └── number-is-nan@1.0.0
│ │ │ │ │ │ └── is-fullwidth-code-point@1.0.0
│ │ │ │ │ ├─┬ strip-ansi@3.0.1
│ │ │ │ │ │ └── ansi-regex@2.0.0
│ │ │ │ │ └── wide-align@1.1.0
│ │ │ │ └── set-blocking@2.0.0
│ │ │ ├─┬ rc@1.1.6
│ │ │ │ ├── deep-extend@0.4.1
│ │ │ │ ├── ini@1.3.4
│ │ │ │ ├── minimist@1.2.0
│ │ │ │ └── strip-json-comments@1.0.4
│ │ │ ├─┬ request@2.73.0
│ │ │ │ ├── aws-sign2@0.6.0
│ │ │ │ ├── aws4@1.4.1
│ │ │ │ ├─┬ bl@1.1.2
│ │ │ │ │ └── readable-stream@2.0.6
│ │ │ │ ├── caseless@0.11.0
│ │ │ │ ├─┬ combined-stream@1.0.5
│ │ │ │ │ └── delayed-stream@1.0.0
│ │ │ │ ├── extend@3.0.0
│ │ │ │ ├── forever-agent@0.6.1
│ │ │ │ ├─┬ form-data@1.0.0-rc4
│ │ │ │ │ └── async@1.5.2
│ │ │ │ ├─┬ har-validator@2.0.6
│ │ │ │ │ ├─┬ chalk@1.1.3
│ │ │ │ │ │ ├── ansi-styles@2.2.1
│ │ │ │ │ │ ├── escape-string-regexp@1.0.5
│ │ │ │ │ │ ├── has-ansi@2.0.0
│ │ │ │ │ │ └── supports-color@2.0.0
│ │ │ │ │ ├─┬ commander@2.9.0
│ │ │ │ │ │ └── graceful-readlink@1.0.1
│ │ │ │ │ ├─┬ is-my-json-valid@2.13.1
│ │ │ │ │ │ ├── generate-function@2.0.0
│ │ │ │ │ │ ├─┬ generate-object-property@1.2.0
│ │ │ │ │ │ │ └── is-property@1.0.2
│ │ │ │ │ │ ├── jsonpointer@2.0.0
│ │ │ │ │ │ └── xtend@4.0.1
│ │ │ │ │ └─┬ pinkie-promise@2.0.1
│ │ │ │ │ └── pinkie@2.0.4
│ │ │ │ ├─┬ hawk@3.1.3
│ │ │ │ │ ├── boom@2.10.1
│ │ │ │ │ ├── cryptiles@2.0.5
│ │ │ │ │ ├── hoek@2.16.3
│ │ │ │ │ └── sntp@1.0.9
│ │ │ │ ├─┬ http-signature@1.1.1
│ │ │ │ │ ├── assert-plus@0.2.0
│ │ │ │ │ ├─┬ jsprim@1.3.0
│ │ │ │ │ │ ├── extsprintf@1.0.2
│ │ │ │ │ │ ├── json-schema@0.2.2
│ │ │ │ │ │ └── verror@1.3.6
│ │ │ │ │ └─┬ sshpk@1.8.3
│ │ │ │ │ ├── asn1@0.2.3
│ │ │ │ │ ├── assert-plus@1.0.0
│ │ │ │ │ ├─┬ dashdash@1.14.0
│ │ │ │ │ │ └── assert-plus@1.0.0
│ │ │ │ │ ├── ecc-jsbn@0.1.1
│ │ │ │ │ ├─┬ getpass@0.1.6
│ │ │ │ │ │ └── assert-plus@1.0.0
│ │ │ │ │ ├── jodid25519@1.0.2
│ │ │ │ │ ├── jsbn@0.1.0
│ │ │ │ │ └── tweetnacl@0.13.3
│ │ │ │ ├── is-typedarray@1.0.0
│ │ │ │ ├── isstream@0.1.2
│ │ │ │ ├── json-stringify-safe@5.0.1
│ │ │ │ ├─┬ mime-types@2.1.11
│ │ │ │ │ └── mime-db@1.23.0
│ │ │ │ ├── node-uuid@1.4.7
│ │ │ │ ├── oauth-sign@0.8.2
│ │ │ │ ├── qs@6.2.0
│ │ │ │ ├── stringstream@0.0.5
│ │ │ │ ├── tough-cookie@2.2.2
│ │ │ │ └── tunnel-agent@0.4.3
│ │ │ ├─┬ rimraf@2.5.3
│ │ │ │ └─┬ glob@7.0.5
│ │ │ │ ├── fs.realpath@1.0.0
│ │ │ │ ├── inflight@1.0.5
│ │ │ │ ├─┬ minimatch@3.0.2
│ │ │ │ │ └─┬ brace-expansion@1.1.5
│ │ │ │ │ ├── balanced-match@0.4.2
│ │ │ │ │ └── concat-map@0.0.1
│ │ │ │ └── path-is-absolute@1.0.0
│ │ │ ├── semver@5.2.0
│ │ │ ├─┬ tar@2.2.1
│ │ │ │ ├── block-stream@0.0.9
│ │ │ │ ├─┬ fstream@1.0.10
│ │ │ │ │ └── graceful-fs@4.1.4
│ │ │ │ └── inherits@2.0.1
│ │ │ └─┬ tar-pack@3.1.4
│ │ │ ├─┬ debug@2.2.0
│ │ │ │ └── ms@0.7.1
│ │ │ ├── fstream-ignore@1.0.5
│ │ │ ├─┬ once@1.3.3
│ │ │ │ └── wrappy@1.0.2
│ │ │ ├─┬ readable-stream@2.1.4
│ │ │ │ ├── buffer-shims@1.0.0
│ │ │ │ ├── core-util-is@1.0.2
│ │ │ │ ├── isarray@1.0.0
│ │ │ │ ├── process-nextick-args@1.0.7
│ │ │ │ ├── string_decoder@0.10.31
│ │ │ │ └── util-deprecate@1.0.2
│ │ │ └── uid-number@0.0.6
│ │ ├── glob-parent@2.0.0
│ │ ├── inherits@2.0.1
│ │ ├─┬ is-binary-path@1.0.1
│ │ │ └── binary-extensions@1.5.0
│ │ ├─┬ is-glob@2.0.1
│ │ │ └── is-extglob@1.0.0
│ │ └─┬ readdirp@2.1.0
│ │ ├── minimatch@3.0.2
│ │ ├─┬ readable-stream@2.1.4
│ │ │ ├── buffer-shims@1.0.0
│ │ │ ├── core-util-is@1.0.2
│ │ │ ├── isarray@1.0.0
│ │ │ ├── process-nextick-args@1.0.7
│ │ │ ├── string_decoder@0.10.31
│ │ │ └── util-deprecate@1.0.2
│ │ └── set-immediate-shim@1.0.1
│ ├─┬ commander@2.9.0
│ │ └── graceful-readlink@1.0.1
│ ├── convert-source-map@1.3.0
│ ├── fs-readdir-recursive@0.1.2
│ ├─┬ glob@5.0.15
│ │ ├─┬ inflight@1.0.5
│ │ │ └── wrappy@1.0.2
│ │ └── once@1.3.3
│ ├── lodash@3.10.1
│ ├─┬ output-file-sync@1.1.2
│ │ ├── graceful-fs@4.1.5
│ │ ├─┬ mkdirp@0.5.1
│ │ │ └── minimist@0.0.8
│ │ └── object-assign@4.1.0
│ ├── path-exists@1.0.0
│ ├── path-is-absolute@1.0.0
│ ├── slash@1.0.0
│ └── source-map@0.5.6
└── dotenv@1.2.0
npm WARN lambda-boilerplate@1.0.0 No repository field.
[23:15:59] Finished 'node-mods' after 35 s
[23:15:59] Starting 'zip'...
[23:16:03] Finished 'zip' after 3.84 s
[23:16:03] Finished 'lambda-zip' after 40 s
[23:16:03] Starting 'upload'...
[23:16:03] Uploading Lambda function "my-lambda-func"...
[23:16:12] Lambda function "my-lambda-func" successfully uploaded
[23:16:12] Finished 'upload' after 8.73 s
[23:16:12] Finished 'deploy' after 49 s
今度は成功した。
AWSマネジメントコンソールから入ってできたか確認したら、ちゃんと作成されていた。
しかし指定されているnodeのバージョンが古いのでその辺は変更していこうと思う。
先日、LightningComponent上でサードパーティ製のライブラリを利用可能にするための仕組みとして、 LockerServiceがSalesforceのブログで発表された。
Introducing The LockerService For Lightning Components - Developer Relations
Lightning Locker Serviceのご紹介 | Salesforce Developers Japan Blog
リリースされていないけど、今回のブログをみたのとauraのソースを少しあさった事による所感。
LockerServiceでReact/Angularが使えるようになると言ってるけど、aura側で検閲処理入れたラッパー(SecureVirtualDOM)を返してくるようになるとのことで、ほんとに使えるようになるんだろうかこれ?
— mino0123 (@mino0123) 2016年4月18日
LockerServiceでReact/Angularが使えるようになると言ってるけど、aura側で検閲処理入れたラッパー(SecureVirtualDOM)を返してくるようになるとのことで、ほんとに使えるようになるんだろうかこれ?
— mino0123 (@mino0123) 2016年4月18日
auraのソースで見つけたLockerServiceで使われそうな各オブジェクトのラッパー実装。
https://github.com/forcedotcom/aura/tree/master/aura-impl/src/main/resources/aura/locker
— mino0123 (@mino0123) 2016年4月18日
Elementのプロパティにもホワイトリストがhttps://github.com/forcedotcom/aura/blob/a76e1c04eb7be858323161bc5e9098b3706ca56c/aura-impl/src/main/resources/aura/locker/SecureElement.js#L162
— mino0123 (@mino0123) 2016年4月18日
LockerService、生のオブジェクトを触る抜け道いくらでもありそうなんだけど、作ってる側はラッパーオブジェクトだけを使えるように制限することが可能でそれで安全確保できるとか考えてそうな気がちょっと
— mino0123 (@mino0123) 2016年4月18日
そもそもwindow上掛けないしそれはないか
— mino0123 (@mino0123) 2016年4月18日
Functionに文字列を渡すとコードとして実行できるが、その時にthisがグローバルオブジェクトになる。
ここにFunction('return this')()があるじゃろ?
— mino0123 (@mino0123) 2016年4月18日
JavaScriptではconsttuctorプロパティでオブジェクトのコンストラクタにアクセスできる。
コンストラクタは関数なのでFunctionのインスタンス。
つまり、あらゆるオブジェクトから.constructor.constructorでFunctionを取得できる。
単にアクセスするオブジェクトの名前でホワイトリスト作っても無駄。
c='constructor',(1)[c]c();
— mino0123 (@mino0123) 2016年4月19日
あと根本的な問題として、ブラウザ側は多分そんな用途を想定してない。
ブラウザ的にページ内の領域ごとにセキュリティ担保する方法を提供する方向性なんてないだろうし、仮に今raw windowへのアクセスを妨害可能だったとしても将来もそうである保証なんてないだろう
— mino0123 (@mino0123) 2016年4月19日
彼らの言うセキュリティは多分コンポーネント実装者に悪意があっても別のパッケージのコンポーネントが持つ情報にアクセスさせたくないとかいうレベルなんだろうけど実際に提供されるものは本当に悪意があったら簡単に回避できる上に通常の開発者への負担は膨大というシロモノになりそう
— mino0123 (@mino0123) 2016年4月19日
でもそれが可能なのかイマイチわからない
— mino0123 (@mino0123) 2016年4月19日
試してみたら
with({window:{}, document:{}}){
//...
}
の中に外部のコードを埋め込むことで一応挿げ替えはできそう。
と思って探したらそれっぽいことやってる部分あった。
上記のURLを返す ConfigAdapterImpl#getLockerWorkerURL() メソッド
このメソッドが返す値は以下のファイルでauraInitというMapにsafeEvalWorkerというキーで追加されている。
auraInit.put("safeEvalWorker", Aura.getConfigAdapter().getLockerWorkerURL());
たぶんこのマップがJSに渡るのだろう。safeEvalWorkerというキーがJSで使用されている。
var componentName = 'MyComponent';
var hash = btoa(JSON.stringify({
componentDef: 'one:auraContainer',
attributes: {
values: {
tag: 'c:' + componentName,
t: Date.now()
}
}
}));
var url = '/one/one.app#' + hash;
理由はLightning開発者ガイドで紹介されてるログ出力関数で書いたのと同じ。
JSコントローラ内でエラーが発生すると $A.$warning$ にエラーが渡されるが
$A.$warning$ が $A.$logInternal$ を呼び出しているので PROD,PRODDEBUG モードだとなにも出力されない。
開発中にエラーを握りつぶされるためとても不便。
一応下記のJSで $A.$warning$ を上書きすれば見えるようになる。
$A.$warning$ = function (msg, err) {
console.warn(msg, err);
};
ふと思い立ってやってみた。
force query "select Id, Name from Contact where AccountId='$(force query select Id, Name from Account | peco | cut -c 2-19)'"
pecoで選択した取引先データを親にもつ取引先責任者を表示する。
もっといい使い道はないだろうか。
https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/debug_log_messages.htm
$A.log(string, [error]) メソッドを使用して、ログメッセージを JavaScript コンソールに書き出します
とあるが、使用しても出力されなかったので調査した。
まずはページ内で
$A.log.toString()
を実行して関数の中身を参照。
function (value, error) {
var trace;
if(this["util"].$isError$(value)) {
error = value;
value = error.message
}
if(this["util"].$isError$(error)) {
trace = this.$getStackTrace$(error)
}else {
if(error && error.stack) {
trace = error.stack
}
}
this.$logInternal$("Info", value, error, trace)
}
$A.log は内部で $A.$logInternal$ を呼び出していることが分かる。 で
$A.$logInternal$.toString()
を実行して出てきたのが
function (type, message, error, trace) {
}
ということで $A.$logInternal$ には中身がなかった。
これは一体どういうことかとAuraのドキュメントを見ると、
http://documentation.auraframework.org/auradocs#reference?topic=api:Aura
のlogメソッド(メソッドにリンクできないの不便すぎる)に
This method doesn’t log in PROD or PRODDEBUG modes.
とあった。
Lightningコンポーネントでのモードを調べると、
https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/aura_debug_mode.htm
デフォルトでは、Lightning コンポーネントフレームワークは PROD モードで実行されます。
デバッグモードを有効化すると、フレームワークはデフォルトで PRODDEBUG モードで実行されます。
ということで、つまりLightningだとこの関数意味がない。
ただ「デフォルトで」というのが気になっててきとーに検索したら以下のページが見つかった。
http://www.salesforce.com/us/developer/docs/lightning/Content/request_server_side.htm
どうやら aura の方では aura.mode パラメータでモードを指定できるらしい。
また、どんなモードが存在するかも見つけた。
http://www.salesforce.com/us/developer/docs/lightning/Content/modes_reference.htm
実行モードには以下があるらしい。
さっそくパラメータとして aura.mode=MODE_NAME の形式で各モードを指定してみたがそれでもログは出力されなかったし、 JSTESTとJSTESTDEBUGにいたっては内部サーバーエラーになった。
そもそもPRODDEBUG以外のモードはDEBUG付きでもJSが圧縮されていたので大体のモードはPRODと同じになってる気がする。
あとAuraのドキュメントでも関数の説明が
Logs to the browser’s JavaScript console if it is available.
としかないので、jsのコンソールに出力するだけならばそもそもこの関数の存在する理由が分からない。
最終的にはモードを切り替えが可能になると共に出力有無を切り替えできるようになるんだろうか。
Salesforce1 Advent Calendar 14日目の記事です。
Lightning App Builder についてデモ動画、
Salesforce World Tour Tokyo(2014年12月) - ~IoTと次世代モバイルアプリの最新事例紹介~アプリの開発スピードを革新するSalesforce1 Lightning~
から得られる情報をまとめます。
ちなみにまだデモで存在するだけなため、リリースまでにいろいろ変更される可能性があります。
まずは App Builder に入る前のビューですが、
ビジュアルアプリケーションビルダーには、Flexible Pagesを使用してSalesforce1 のカスタムアプリケーションページを作成するための使いやすいグラフィカルインターフェースが用意されています。
と書かれています。
要するにLightning App Builder は Flexible Page をGUIで作成できるもの、ということでしょう。
新規ボタンを押した後に立ち上がる App Builder の画面です。
作成する画面の種別を3種類から選ぶようです。
これによって作成したページを割り当てできる箇所が変わるのでしょう。
翻訳後のレイアウト調整がまだなのか少しページが崩れていますが、本リリースまでには直ることでしょう多分。
ページ種別を選択するとページのテンプレートの選択に移行します。
まとめると、最大3つのエリアをもつページを作成することができ、
各エリアはページを参照する端末によって表示される箇所が変わる、ということのようです。
下に「AppExchange上でテンプレートを探す」というリンクがありますので もしかするとこれ以外のレイアウトもテンプレートとして作成・公開できるようになるのでしょうか。
テンプレートを選択すると最後にページの名前を設定してドラッグ&ドロップによるページ作成が始まります。
[標準コンポーネント], [カスタムコンポーネント] の下に [AppExchangeコンポーネント] が並んでいるのが分かります。
いままでは ユーザがD&Dで設定できてAppExchangeで公開できるUIはVisualforceページのみだった (カスタムコンポーネントでコンポーネント単位の公開はできるけど使用するのにコーディングが必要) のが、コンポーネント単位で公開しそこからユーザがD&Dでページに組み込むことができるようになるようです。
ページの設定の一番下に[処理]とありますが、Lightning Process Builderで作成した処理を割り当てたりできるのでしょうか。
プレビューの端末を変更することもできます。
いままでの Salesforce は AppExchange で公開されたものをコーディングなしで自組織に組み込むことのできるUIとしてはVisualforceページが最小単位だったと思いますが、テンプレートやコンポーネントなど、より小さな単位でAppExchangeで公開可能にすることを目指しているようです。
golang製の静的サイトジェネレータである Hugo を使った。
examples/blog がそのまま動いたのでうまくいくかと思いきや、そこそこ面倒くさかった。
configでパーマリンクを指定したとき、日本語が含まれていると生成されるファイルだけパーセントエンコードされリンクが切れる。
それを直そうとcloneしてきたら path.Join 使ってたところがすべて filepath.Join になっててWindowsだとファイル区切りが\になってた。
そもそも url と生成時のファイル生成のパスの扱いが同じ関数で行われている。
結局、
という修正をやって動かしてる。
後者に関してはissueは挙がってたしそのうち直るだろうたぶん。
あとコードのハイライトは pygments 使おうと思ったけどなぜかpタグがcode内にでてくる
function func() { var v; v = 0; v = ‘string’; v = function () {}; }
ので Hilight.js の monokai sublime テーマにした。function func() {
var v;
v = 0;
v = 'string';
v = function () {};
}
静的ファイルの追加が何故か1フォルダしか行われていなかった。 chtimeで権限エラーになっていた。 hugo.go で NewSyncer 後に
syncer.NoTimes = true
を追加することで最終更新日の同期をやめさせて対応した。
diff --git a/commands/hugo.go b/commands/hugo.go
index 6fd7fa2..21dad47 100644
--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -227,6 +229,7 @@ func copyStatic() error {
publishDir := helpers.AbsPathify(viper.GetString("PublishDir")) + "/"
syncer := fsync.NewSyncer()
+ syncer.NoTimes = true
syncer.NoTimes = viper.GetBool("notimes")
syncer.SrcFs = hugofs.SourceFs
syncer.DestFs = hugofs.DestinationFS
diff --git a/helpers/url.go b/helpers/url.go
index dd8d750..6b234b4 100644
--- a/helpers/url.go
+++ b/helpers/url.go
@@ -16,7 +16,7 @@ package helpers
import (
"fmt"
"net/url"
- "path/filepath"
+ "path"
"strings"
"github.com/PuerkitoBio/purell"
@@ -68,7 +68,7 @@ func MakePermalink(host, plink string) *url.URL {
panic(fmt.Errorf("Can't make permalink from absolute link %q", plink))
}
- base.Path = filepath.Join(base.Path, p.Path)
+ base.Path = path.Join(base.Path, p.Path)
// path.Join will strip off the last /, so put it back if it was there.
if strings.HasSuffix(p.Path, "/") && !strings.HasSuffix(base.Path, "/") {
@@ -84,7 +84,7 @@ func UrlPrep(ugly bool, in string) string {
return x
} else {
x := PrettifyUrl(SanitizeUrl(in))
- if filepath.Ext(x) == ".xml" {
+ if path.Ext(x) == ".xml" {
return x
}
url, err := purell.NormalizeURLString(x, purell.FlagAddTrailingSlash)
@@ -100,8 +100,8 @@ func UrlPrep(ugly bool, in string) string {
func PrettifyUrl(in string) string {
x := PrettifyPath(in)
- if filepath.Base(x) == "index.html" {
- return filepath.Dir(x)
+ if path.Base(x) == "index.html" {
+ return path.Dir(x)
}
if in == "" {
@@ -115,17 +115,17 @@ func PrettifyUrl(in string) string {
// /section/name/ -> /section/name.html
// /section/name.html -> /section/name.html
func Uglify(in string) string {
- if filepath.Ext(in) == "" {
+ if path.Ext(in) == "" {
if len(in) < 2 {
return "/"
}
// /section/name/ -> /section/name.html
- return filepath.Clean(in) + ".html"
+ return path.Clean(in) + ".html"
} else {
name, ext := FileAndExt(in)
if name == "index" {
// /section/name/index.html -> /section/name.html
- d := filepath.Dir(in)
+ d := path.Dir(in)
if len(d) > 1 {
return d + ext
} else {
@@ -133,7 +133,7 @@ func Uglify(in string) string {
}
} else {
// /section/name.html -> /section/name.html
- return filepath.Clean(in)
+ return path.Clean(in)
}
}
}
diff --git a/hugolib/permalinks.go b/hugolib/permalinks.go
index 642de83..955401c 100644
--- a/hugolib/permalinks.go
+++ b/hugolib/permalinks.go
@@ -146,7 +146,8 @@ func pageToPermalinkTitle(p *Page, _ string) (string, error) {
func pageToPermalinkFilename(p *Page, _ string) (string, error) {
//var extension = p.Source.Ext
//var name = p.Source.Path()[0 : len(p.Source.Path())-len(extension)]
- return helpers.Urlize(p.Source.BaseFileName()), nil
+ return p.Source.BaseFileName(), nil
+ // return helpers.Urlize(p.Source.BaseFileName()), nil
}
// if the page has a slug, return the slug, else return the title