diff --git a/sdk/storage/README.md b/sdk/storage/README.md index 87a7ae522cd9..ddfb65d3976c 100644 --- a/sdk/storage/README.md +++ b/sdk/storage/README.md @@ -108,9 +108,9 @@ const Azure = require("@azure/storage-blob"); To use the SDK with JS bundle in the browsers, simply add a script tag to your HTML pages pointing to the downloaded JS bundle file(s): ```html - - - + + + ``` The JS bundled file is compatible with [UMD](https://github.com/umdjs/umd) standard, if no module system found, following global variable(s) will be exported: diff --git a/sdk/storage/storage-blob/.npmignore b/sdk/storage/storage-blob/.npmignore index af440bfdb888..8a5a07d9992e 100644 --- a/sdk/storage/storage-blob/.npmignore +++ b/sdk/storage/storage-blob/.npmignore @@ -1,6 +1,6 @@ # browser # -browser/azure-storage.blob.js -browser/azure-storage.blob.js.map +browser/azure-storage-blob.js +browser/azure-storage-blob.js.map # dist-test # dist-test/ diff --git a/sdk/storage/storage-blob/.nycrc b/sdk/storage/storage-blob/.nycrc index 8706e6800b07..d254584d89d6 100644 --- a/sdk/storage/storage-blob/.nycrc +++ b/sdk/storage/storage-blob/.nycrc @@ -1,6 +1,6 @@ { "include": [ - "src/**/*.ts" + "dist-test/index.node.js" ], "exclude": [ "**/*.d.ts", @@ -21,6 +21,7 @@ "html", "cobertura" ], + "exclude-after-remap":false, "sourceMap": true, "instrument": true, "all": true diff --git a/sdk/storage/storage-blob/README.md b/sdk/storage/storage-blob/README.md index 73fbabf9cd45..bab068708dcb 100644 --- a/sdk/storage/storage-blob/README.md +++ b/sdk/storage/storage-blob/README.md @@ -89,7 +89,7 @@ const Azure = require("@azure/storage-blob"); To use the SDK with JS bundle in the browsers, simply add a script tag to your HTML pages pointing to the downloaded JS bundle file(s): ```html - + ``` The JS bundled file is compatible with [UMD](https://github.com/umdjs/umd) standard, if no module system found, following global variable(s) will be exported: diff --git a/sdk/storage/storage-blob/gulpfile.js b/sdk/storage/storage-blob/gulpfile.js index c66aa821e000..9acff5891a1c 100644 --- a/sdk/storage/storage-blob/gulpfile.js +++ b/sdk/storage/storage-blob/gulpfile.js @@ -4,9 +4,13 @@ const zip = require("gulp-zip"); const version = require("./package.json").version; const zipFileName = `azurestoragejs.blob-${version}.zip`; -gulp.task("zip", function(callback) { +gulp.task("zip", function (callback) { gulp - .src(["browser/azure-storage.blob.js", "browser/azure-storage.blob.min.js", "browser/*.txt"]) + .src([ + "browser/azure-storage-blob.min.js", + "browser/azure-storage-blob.js", + "browser/*.txt" + ]) .pipe(zip(zipFileName)) .pipe(gulp.dest("browser")) .on("end", callback); diff --git a/sdk/storage/storage-blob/karma.conf.js b/sdk/storage/storage-blob/karma.conf.js index 77093d5f6b7b..f7fbf475657f 100644 --- a/sdk/storage/storage-blob/karma.conf.js +++ b/sdk/storage/storage-blob/karma.conf.js @@ -65,7 +65,7 @@ module.exports = function(config) { // Exclude coverage calculation for following files remapOptions: { - exclude: /node_modules|tests/g + exclude: /node_modules|test/g }, junitReporter: { diff --git a/sdk/storage/storage-blob/package.json b/sdk/storage/storage-blob/package.json index c180b3a101c9..b8d16097cc53 100644 --- a/sdk/storage/storage-blob/package.json +++ b/sdk/storage/storage-blob/package.json @@ -5,7 +5,7 @@ "main": "./dist/index.js", "module": "./dist-esm/src/index.js", "browser": { - "./dist/index.js": "./browser/azure-storage.blob.min.js", + "./dist/index.js": "./browser/azure-storage-blob.min.js", "./dist-esm/src/index.js": "./dist-esm/src/index.browser.js", "./dist-esm/test/utils/index.js": "./dist-esm/test/utils/index.browser.js", "./dist-esm/src/BlobDownloadResponse.js": "./dist-esm/src/BlobDownloadResponse.browser.js", @@ -78,7 +78,7 @@ "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", "integration-test:browser": "karma start --single-run", - "integration-test:node": "cross-env TS_NODE_COMPILER_OPTIONS=\"{\\\"module\\\": \\\"commonjs\\\"}\" nyc mocha --compilers ts-node/register --require source-map-support/register --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=- --full-trace --no-timeouts test/*.test.ts test/node/*.test.ts", + "integration-test:node": "nyc mocha --require source-map-support/register --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=- --full-trace -t 120000 dist-test/index.node.js", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint:fix": "echo skipped", "lint": "echo skipped", diff --git a/sdk/storage/storage-blob/rollup.base.config.js b/sdk/storage/storage-blob/rollup.base.config.js new file mode 100644 index 000000000000..40ac9d9a7eef --- /dev/null +++ b/sdk/storage/storage-blob/rollup.base.config.js @@ -0,0 +1,136 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import nodeResolve from "rollup-plugin-node-resolve"; +import multiEntry from "rollup-plugin-multi-entry"; +import cjs from "rollup-plugin-commonjs"; +import replace from "rollup-plugin-replace"; +import { uglify } from "rollup-plugin-uglify"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import shim from "rollup-plugin-shim"; +// import visualizer from "rollup-plugin-visualizer"; + +const version = require("./package.json").version; +const banner = [ + "/*!", + ` * Azure Storage SDK for JavaScript - Blob, ${version}`, + " * Copyright (c) Microsoft and contributors. All rights reserved.", + " */" +].join("\n"); + +const pkg = require("./package.json"); +const depNames = Object.keys(pkg.dependencies); +const production = process.env.NODE_ENV === "production"; + +export function nodeConfig(test = false) { + const externalNodeBuiltins = ["@azure/ms-rest-js", "crypto", "fs", "events", "os", "stream"]; + const baseConfig = { + input: "dist-esm/src/index.js", + external: depNames.concat(externalNodeBuiltins), + output: { + file: "dist/index.js", + format: "cjs", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + sourcemaps(), + replace({ + delimiters: ["", ""], + values: { + // replace dynamic checks with if (true) since this is for node only. + // Allows rollup's dead code elimination to be more aggressive. + "if (isNode)": "if (true)" + } + }), + nodeResolve({ preferBuiltins: true }), + cjs() + ] + }; + + if (test) { + // entry point is every test file + baseConfig.input = ["dist-esm/test/*.spec.js", "dist-esm/test/node/*.spec.js"]; + baseConfig.plugins.unshift(multiEntry({ exports: false })); + + // different output file + baseConfig.output.file = "dist-test/index.node.js"; + + // mark assert as external + baseConfig.external.push("assert", "fs", "path"); + + baseConfig.context = "null"; + } else if (production) { + baseConfig.plugins.push(uglify()); + } + + return baseConfig; +} + +export function browserConfig(test = false, production = false) { + const baseConfig = { + input: "dist-esm/src/index.browser.js", + external: ["ms-rest-js"], + output: { + file: "browser/azure-storage-blob.js", + banner: banner, + format: "umd", + name: "azblob", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + sourcemaps(), + replace({ + delimiters: ["", ""], + values: { + // replace dynamic checks with if (false) since this is for + // browser only. Rollup's dead code elimination will remove + // any code guarded by if (isNode) { ... } + "if (isNode)": "if (false)" + } + }), + // os is not used by the browser bundle, so just shim it + shim({ + dotenv: `export function config() { }`, + os: ` + export const type = 1; + export const release = 1; + ` + }), + nodeResolve({ + mainFields: ["module", "browser"], + preferBuiltins: false + }), + cjs({ + namedExports: { + events: ["EventEmitter"], + assert: ["ok", "deepEqual", "equal", "fail", "deepStrictEqual", "notDeepEqual"] + } + }) + ] + }; + + if (test) { + baseConfig.input = ["dist-esm/test/*.spec.js", "dist-esm/test/browser/*.spec.js"]; + baseConfig.plugins.unshift(multiEntry({ exports: false })); + baseConfig.output.file = "dist-test/index.browser.js"; + baseConfig.context = "null"; + } else if (production) { + baseConfig.output.file = "browser/azure-storage-blob.min.js"; + baseConfig.plugins.push( + uglify({ + output: { + preamble: banner + } + }) + // Comment visualizer because it only works on Node.js 8+; Uncomment it to get bundle analysis report + // visualizer({ + // filename: "./statistics.html", + // sourcemap: true + // }) + ); + } + + return baseConfig; +} diff --git a/sdk/storage/storage-blob/rollup.config.js b/sdk/storage/storage-blob/rollup.config.js index f79a86d0e405..6f119550d77a 100644 --- a/sdk/storage/storage-blob/rollup.config.js +++ b/sdk/storage/storage-blob/rollup.config.js @@ -1,95 +1,18 @@ -import nodeResolve from "rollup-plugin-node-resolve"; -import { uglify } from "rollup-plugin-uglify"; -import replace from "rollup-plugin-replace"; -import commonjs from "rollup-plugin-commonjs"; -import shim from "rollup-plugin-shim"; -// import visualizer from "rollup-plugin-visualizer"; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. -const version = require("./package.json").version; -const banner = [ - "/*!", - ` * Azure Storage SDK for JavaScript - Blob, ${version}`, - " * Copyright (c) Microsoft and contributors. All rights reserved.", - " */" -].join("\n"); +import * as base from "./rollup.base.config"; -const nodeRollupConfigFactory = () => { - return { - external: ["@azure/ms-rest-js", "crypto", "fs", "events", "os", "stream"], - input: "dist-esm/src/index.js", - output: { - file: "dist/index.js", - format: "cjs", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [nodeResolve(), uglify()] - }; -}; +const inputs = []; -const browserRollupConfigFactory = (isProduction) => { - const browserRollupConfig = { - input: "dist-esm/src/index.browser.js", - output: { - file: "browser/azure-storage.blob.js", - banner: banner, - format: "umd", - name: "azblob", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - replace({ - delimiters: ["", ""], - values: { - // replace dynamic checks with if (false) since this is for - // browser only. Rollup's dead code elimination will remove - // any code guarded by if (isNode) { ... } - "if (isNode)": "if (false)" - } - }), - // os is not used by the browser bundle, so just shim it - shim({ - dotenv: `export function config() { }`, - os: ` - export const type = 1; - export const release = 1; - ` - }), - nodeResolve({ - mainFields: ["module", "browser"], - preferBuiltins: false - }), - commonjs({ - namedExports: { - events: ["EventEmitter"], - assert: ["ok", "deepEqual", "equal", "fail", "deepStrictEqual", "notDeepEqual"] - } - }) - ] - }; +if (!process.env.ONLY_BROWSER) { + inputs.push(base.nodeConfig()); +} - if (isProduction) { - browserRollupConfig.output.file = "browser/azure-storage.blob.min.js"; - browserRollupConfig.plugins.push( - uglify({ - output: { - preamble: banner - } - }) - // Comment visualizer because it only works on Node.js 8+; Uncomment it to get bundle analysis report - // visualizer({ - // filename: "./statistics.html", - // sourcemap: true - // }) - ); - } +// Disable this until we are ready to run rollup for the browser. +if (!process.env.ONLY_NODE) { + inputs.push(base.browserConfig()); + inputs.push(base.browserConfig(false, true)); +} - return browserRollupConfig; -}; - -export default [ - browserRollupConfigFactory(false), - browserRollupConfigFactory(true), - nodeRollupConfigFactory() -]; +export default inputs; diff --git a/sdk/storage/storage-blob/rollup.test.config.js b/sdk/storage/storage-blob/rollup.test.config.js index 24622435837c..ad98718cce46 100644 --- a/sdk/storage/storage-blob/rollup.test.config.js +++ b/sdk/storage/storage-blob/rollup.test.config.js @@ -1,13 +1,6 @@ -import multi from "rollup-plugin-multi-entry"; -import baseConfig from "./rollup.config"; -import sourcemaps from "rollup-plugin-sourcemaps"; -const [browser] = baseConfig; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. -browser.input = ["dist-esm/test/*.js", "dist-esm/test/browser/*.js"]; -browser.output.sourcemap = "inline"; -browser.output.file = "dist-test/index.browser.js"; -browser.plugins.unshift(multi()); -browser.plugins.unshift(sourcemaps()); -browser.context = "null"; +import * as base from "./rollup.base.config"; -export default [browser]; +export default [base.nodeConfig(true), base.browserConfig(true)]; diff --git a/sdk/storage/storage-blob/test/aborter.test.ts b/sdk/storage/storage-blob/test/aborter.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/aborter.test.ts rename to sdk/storage/storage-blob/test/aborter.spec.ts diff --git a/sdk/storage/storage-blob/test/appendbloburl.test.ts b/sdk/storage/storage-blob/test/appendbloburl.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/appendbloburl.test.ts rename to sdk/storage/storage-blob/test/appendbloburl.spec.ts diff --git a/sdk/storage/storage-blob/test/bloburl.test.ts b/sdk/storage/storage-blob/test/bloburl.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/bloburl.test.ts rename to sdk/storage/storage-blob/test/bloburl.spec.ts diff --git a/sdk/storage/storage-blob/test/blockbloburl.test.ts b/sdk/storage/storage-blob/test/blockbloburl.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/blockbloburl.test.ts rename to sdk/storage/storage-blob/test/blockbloburl.spec.ts diff --git a/sdk/storage/storage-blob/test/browser/highlevel.browser.test.ts b/sdk/storage/storage-blob/test/browser/highlevel.browser.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/browser/highlevel.browser.test.ts rename to sdk/storage/storage-blob/test/browser/highlevel.browser.spec.ts diff --git a/sdk/storage/storage-blob/test/containerurl.test.ts b/sdk/storage/storage-blob/test/containerurl.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/containerurl.test.ts rename to sdk/storage/storage-blob/test/containerurl.spec.ts diff --git a/sdk/storage/storage-blob/test/node/blockbloburl.test.ts b/sdk/storage/storage-blob/test/node/blockbloburl.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/node/blockbloburl.test.ts rename to sdk/storage/storage-blob/test/node/blockbloburl.spec.ts diff --git a/sdk/storage/storage-blob/test/node/containerurl.test.ts b/sdk/storage/storage-blob/test/node/containerurl.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/node/containerurl.test.ts rename to sdk/storage/storage-blob/test/node/containerurl.spec.ts diff --git a/sdk/storage/storage-blob/test/node/highlevel.node.test.ts b/sdk/storage/storage-blob/test/node/highlevel.node.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/node/highlevel.node.test.ts rename to sdk/storage/storage-blob/test/node/highlevel.node.spec.ts diff --git a/sdk/storage/storage-blob/test/node/pagebloburl.test.ts b/sdk/storage/storage-blob/test/node/pagebloburl.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/node/pagebloburl.test.ts rename to sdk/storage/storage-blob/test/node/pagebloburl.spec.ts diff --git a/sdk/storage/storage-blob/test/node/sas.test.ts b/sdk/storage/storage-blob/test/node/sas.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/node/sas.test.ts rename to sdk/storage/storage-blob/test/node/sas.spec.ts diff --git a/sdk/storage/storage-blob/test/pagebloburl.test.ts b/sdk/storage/storage-blob/test/pagebloburl.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/pagebloburl.test.ts rename to sdk/storage/storage-blob/test/pagebloburl.spec.ts diff --git a/sdk/storage/storage-blob/test/retrypolicy.test.ts b/sdk/storage/storage-blob/test/retrypolicy.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/retrypolicy.test.ts rename to sdk/storage/storage-blob/test/retrypolicy.spec.ts diff --git a/sdk/storage/storage-blob/test/serviceurl.test.ts b/sdk/storage/storage-blob/test/serviceurl.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/serviceurl.test.ts rename to sdk/storage/storage-blob/test/serviceurl.spec.ts diff --git a/sdk/storage/storage-blob/test/specialnaming.test.ts b/sdk/storage/storage-blob/test/specialnaming.spec.ts similarity index 100% rename from sdk/storage/storage-blob/test/specialnaming.test.ts rename to sdk/storage/storage-blob/test/specialnaming.spec.ts diff --git a/sdk/storage/storage-blob/test/utils/index.ts b/sdk/storage/storage-blob/test/utils/index.ts index 69ed28382461..70d0c94d797a 100644 --- a/sdk/storage/storage-blob/test/utils/index.ts +++ b/sdk/storage/storage-blob/test/utils/index.ts @@ -6,6 +6,8 @@ import { SharedKeyCredential } from "../../src/credentials/SharedKeyCredential"; import { ServiceURL } from "../../src/ServiceURL"; import { StorageURL } from "../../src/StorageURL"; import { getUniqueName } from "./testutils.common"; +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); export * from "./testutils.common"; @@ -20,9 +22,7 @@ export function getGenericBSU(accountType: string, accountNameSuffix: string = " accountKey = process.env[accountKeyEnvVar]; if (!accountName || !accountKey || accountName === "" || accountKey === "") { - throw new Error( - `${accountNameEnvVar} and/or ${accountKeyEnvVar} environment variables not specified.` - ); + throw new Error(`${accountNameEnvVar} and/or ${accountKeyEnvVar} environment variables not specified.`); } const credentials = new SharedKeyCredential(accountName, accountKey); @@ -69,11 +69,7 @@ export async function bodyToString( }); } -export async function createRandomLocalFile( - folder: string, - blockNumber: number, - blockSize: number -): Promise { +export async function createRandomLocalFile(folder: string, blockNumber: number, blockSize: number): Promise { return new Promise((resolve, reject) => { const destFile = path.join(folder, getUniqueName("tempfile.")); const ws = fs.createWriteStream(destFile); diff --git a/sdk/storage/storage-file/.npmignore b/sdk/storage/storage-file/.npmignore index af749a5e8741..b84ea0bddf17 100644 --- a/sdk/storage/storage-file/.npmignore +++ b/sdk/storage/storage-file/.npmignore @@ -1,6 +1,6 @@ # browser # -browser/azure-storage.file.js -browser/azure-storage.file.js.map +browser/azure-storage-file.js +browser/azure-storage-file.js.map # dist-test # dist-test/ diff --git a/sdk/storage/storage-file/.nycrc b/sdk/storage/storage-file/.nycrc index 695f5ccbc1a0..f950dcc192c9 100644 --- a/sdk/storage/storage-file/.nycrc +++ b/sdk/storage/storage-file/.nycrc @@ -1,6 +1,6 @@ { "include": [ - "src/**/*.ts" + "dist-test/index.node.js" ], "exclude": [ "**/*.d.ts", @@ -24,6 +24,7 @@ "html", "cobertura" ], + "exclude-after-remap":false, "sourceMap": true, "instrument": true, "all": true diff --git a/sdk/storage/storage-file/README.md b/sdk/storage/storage-file/README.md index f073ffb9afd1..9d2ab3473f9b 100644 --- a/sdk/storage/storage-file/README.md +++ b/sdk/storage/storage-file/README.md @@ -1,7 +1,7 @@ # Azure Storage SDK V10 for JavaScript - File -* [![npm version](https://badge.fury.io/js/%40azure%2Fstorage-file.svg)](https://badge.fury.io/js/%40azure%2Fstorage-file) -* [API Reference documentation](https://docs.microsoft.com/en-us/javascript/api/%40azure/storage-file/index?view=azure-node-preview) +- [![npm version](https://badge.fury.io/js/%40azure%2Fstorage-file.svg)](https://badge.fury.io/js/%40azure%2Fstorage-file) +- [API Reference documentation](https://docs.microsoft.com/en-us/javascript/api/%40azure/storage-file/index?view=azure-node-preview) ## Introduction @@ -11,15 +11,15 @@ Please note that this version of the SDK is a compete overhaul of the current [A ### Features -* File Storage - * Get/Set File Service Properties - * Create/List/Delete File Shares - * Create/List/Delete File Directories - * Create/Read/List/Update/Delete Files -* Features new - * Asynchronous I/O for all operations using the async methods - * HttpPipeline which enables a high degree of per-request configurability - * 1-to-1 correlation with the Storage REST API for clarity and simplicity +- File Storage + - Get/Set File Service Properties + - Create/List/Delete File Shares + - Create/List/Delete File Directories + - Create/Read/List/Update/Delete Files +- Features new + - Asynchronous I/O for all operations using the async methods + - HttpPipeline which enables a high degree of per-request configurability + - 1-to-1 correlation with the Storage REST API for clarity and simplicity ### Compatibility @@ -31,13 +31,13 @@ You need polyfills to make this library work with IE11. The easiest way is to us Or you can load separate polyfills for missed ES feature(s). This library depends on following ES features which need external polyfills loaded. -* `Promise` -* `String.prototype.startsWith` -* `String.prototype.endsWith` -* `String.prototype.repeat` -* `String.prototype.includes` -* `Array.prototype.includes` -* `Object.keys` (Override IE11's `Object.keys` with ES6 polyfill forcely to enable [ES6 behavior](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Notes)) +- `Promise` +- `String.prototype.startsWith` +- `String.prototype.endsWith` +- `String.prototype.repeat` +- `String.prototype.includes` +- `Array.prototype.includes` +- `Object.keys` (Override IE11's `Object.keys` with ES6 polyfill forcely to enable [ES6 behavior](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Notes)) #### Differences between Node.js and browsers @@ -45,20 +45,20 @@ There are differences between Node.js and browsers runtime. When getting start w ##### Following features, interfaces, classes or functions are only available in Node.js -* Shared Key Authorization based on account name and account key - * `SharedKeyCredential` -* Shared Access Signature(SAS) generation - * `generateAccountSASQueryParameters()` - * `generateFileSASQueryParameters()` -* Parallel uploading and downloading - * `uploadFileToAzureFile()` - * `uploadStreamToAzureFile()` - * `downloadAzureFileToBuffer()` +- Shared Key Authorization based on account name and account key + - `SharedKeyCredential` +- Shared Access Signature(SAS) generation + - `generateAccountSASQueryParameters()` + - `generateFileSASQueryParameters()` +- Parallel uploading and downloading + - `uploadFileToAzureFile()` + - `uploadStreamToAzureFile()` + - `downloadAzureFileToBuffer()` ##### Following features, interfaces, classes or functions are only available in browsers -* Parallel uploading and downloading - * `uploadBrowserDataToAzureFile()` +- Parallel uploading and downloading + - `uploadBrowserDataToAzureFile()` ## Getting Started @@ -87,18 +87,18 @@ const Azure = require("@azure/storage-file"); To use the SDK with JS bundle in the browsers, simply add a script tag to your HTML pages pointing to the downloaded JS bundle file(s): ```html - + ``` The JS bundled file is compatible with [UMD](https://github.com/umdjs/umd) standard, if no module system found, following global variable(s) will be exported: -* `azfile` +- `azfile` #### Download Download latest released JS bundles from links in the [GitHub release page](https://github.com/Azure/azure-storage-js/releases). Or from following links directly: -* File [https://aka.ms/downloadazurestoragejsfile](https://aka.ms/downloadazurestoragejsfile) +- File [https://aka.ms/downloadazurestoragejsfile](https://aka.ms/downloadazurestoragejsfile) ### CORS @@ -106,19 +106,19 @@ You need to set up [Cross-Origin Resource Sharing (CORS)](https://docs.microsoft For example, you can create following CORS settings for debugging. But please customize the settings carefully according to your requirements in production environment. -* Allowed origins: \* -* Allowed verbs: DELETE,GET,HEAD,MERGE,POST,OPTIONS,PUT -* Allowed headers: \* -* Exposed headers: \* -* Maximum age (seconds): 86400 +- Allowed origins: \* +- Allowed verbs: DELETE,GET,HEAD,MERGE,POST,OPTIONS,PUT +- Allowed headers: \* +- Exposed headers: \* +- Maximum age (seconds): 86400 ## SDK Architecture The Azure Storage SDK for JavaScript provides low-level and high-level APIs. -* ServiceURL, ShareURL, DirectoryURL and FileURL objects provide the low-level API functionality and map one-to-one to the [Azure Storage File REST APIs](https://docs.microsoft.com/en-us/rest/api/storageservices/file-service-rest-api). +- ServiceURL, ShareURL, DirectoryURL and FileURL objects provide the low-level API functionality and map one-to-one to the [Azure Storage File REST APIs](https://docs.microsoft.com/en-us/rest/api/storageservices/file-service-rest-api). -* The high-level APIs provide convenience abstractions such as uploading a large stream to a file (using multiple PutBlock requests). +- The high-level APIs provide convenience abstractions such as uploading a large stream to a file (using multiple PutBlock requests). ## Code Samples @@ -253,8 +253,8 @@ main() ## More Code Samples -* [File Storage Examples](https://github.com/azure/azure-storage-js/tree/master/file/samples) -* [File Storage Examples - Test Cases](https://github.com/azure/azure-storage-js/tree/master/file/test/) +- [File Storage Examples](https://github.com/azure/azure-storage-js/tree/master/file/samples) +- [File Storage Examples - Test Cases](https://github.com/azure/azure-storage-js/tree/master/file/test/) ## License diff --git a/sdk/storage/storage-file/gulpfile.js b/sdk/storage/storage-file/gulpfile.js index 5587922cff17..946b2b3cf0c2 100644 --- a/sdk/storage/storage-file/gulpfile.js +++ b/sdk/storage/storage-file/gulpfile.js @@ -4,9 +4,13 @@ const zip = require("gulp-zip"); const version = require("./package.json").version; const zipFileName = `azurestoragejs.file-${version}.zip`; -gulp.task("zip", function(callback) { +gulp.task("zip", function (callback) { gulp - .src(["browser/azure-storage.file.js", "browser/azure-storage.file.min.js", "browser/*.txt"]) + .src([ + "browser/azure-storage-file.js", + "browser/azure-storage-file.min.js", + "browser/*.txt" + ]) .pipe(zip(zipFileName)) .pipe(gulp.dest("browser")) .on("end", callback); diff --git a/sdk/storage/storage-file/karma.conf.js b/sdk/storage/storage-file/karma.conf.js index 77093d5f6b7b..f7fbf475657f 100644 --- a/sdk/storage/storage-file/karma.conf.js +++ b/sdk/storage/storage-file/karma.conf.js @@ -65,7 +65,7 @@ module.exports = function(config) { // Exclude coverage calculation for following files remapOptions: { - exclude: /node_modules|tests/g + exclude: /node_modules|test/g }, junitReporter: { diff --git a/sdk/storage/storage-file/package.json b/sdk/storage/storage-file/package.json index cbb73a69ce11..d2615bf81720 100644 --- a/sdk/storage/storage-file/package.json +++ b/sdk/storage/storage-file/package.json @@ -5,7 +5,7 @@ "main": "./dist/index.js", "module": "./dist-esm/src/index.js", "browser": { - "./dist/index.js": "./browser/azure-storage.file.min.js", + "./dist/index.js": "./browser/azure-storage-file.min.js", "./dist-esm/src/index.js": "./dist-esm/src/index.browser.js", "./dist-esm/test/utils/index.js": "./dist-esm/test/utils/index.browser.js", "./dist-esm/src/FileDownloadResponse.js": "./dist-esm/src/FileDownloadResponse.browser.js", @@ -78,7 +78,7 @@ "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", "integration-test:browser": "karma start --single-run", - "integration-test:node": "cross-env TS_NODE_COMPILER_OPTIONS=\"{\\\"module\\\": \\\"commonjs\\\"}\" nyc mocha --compilers ts-node/register --require source-map-support/register --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=- --full-trace --no-timeouts test/*.test.ts test/node/*.test.ts", + "integration-test:node": "nyc mocha --require source-map-support/register --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=- --full-trace -t 120000 dist-test/index.node.js", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint:fix": "echo skipped", "lint": "echo skipped", diff --git a/sdk/storage/storage-file/rollup.base.config.js b/sdk/storage/storage-file/rollup.base.config.js new file mode 100644 index 000000000000..798dbaf6ca0b --- /dev/null +++ b/sdk/storage/storage-file/rollup.base.config.js @@ -0,0 +1,146 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import nodeResolve from "rollup-plugin-node-resolve"; +import multiEntry from "rollup-plugin-multi-entry"; +import cjs from "rollup-plugin-commonjs"; +import replace from "rollup-plugin-replace"; +import { uglify } from "rollup-plugin-uglify"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import shim from "rollup-plugin-shim"; +// import visualizer from "rollup-plugin-visualizer"; + +const version = require("./package.json").version; +const banner = [ + "/*!", + ` * Azure Storage SDK for JavaScript - File, ${version}`, + " * Copyright (c) Microsoft and contributors. All rights reserved.", + " */" +].join("\n"); + +const pkg = require("./package.json"); +const depNames = Object.keys(pkg.dependencies); +const production = process.env.NODE_ENV === "production"; + +export function nodeConfig(test = false) { + const externalNodeBuiltins = ["@azure/ms-rest-js", "crypto", "fs", "events", "os", "stream"]; + const baseConfig = { + input: "dist-esm/src/index.js", + external: depNames.concat(externalNodeBuiltins), + output: { + file: "dist/index.js", + format: "cjs", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + sourcemaps(), + replace({ + delimiters: ["", ""], + values: { + // replace dynamic checks with if (true) since this is for node only. + // Allows rollup's dead code elimination to be more aggressive. + "if (isNode)": "if (true)" + } + }), + nodeResolve({ preferBuiltins: true }), + cjs() + ] + }; + + if (test) { + // entry point is every test file + baseConfig.input = ["dist-esm/test/*.spec.js", "dist-esm/test/node/*.spec.js"]; + baseConfig.plugins.unshift(multiEntry({ exports: false })); + + // different output file + baseConfig.output.file = "dist-test/index.node.js"; + + // mark assert as external + baseConfig.external.push("assert", "fs", "path"); + + baseConfig.context = "null"; + } else if (production) { + baseConfig.plugins.push(uglify()); + } + + return baseConfig; +} + +export function browserConfig(test = false, production = false) { + const baseConfig = { + input: "dist-esm/src/index.browser.js", + external: ["ms-rest-js"], + output: { + file: "browser/azure-storage-file.js", + banner: banner, + format: "umd", + name: "azfile", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + sourcemaps(), + replace({ + delimiters: ["", ""], + values: { + // replace dynamic checks with if (false) since this is for + // browser only. Rollup's dead code elimination will remove + // any code guarded by if (isNode) { ... } + "if (isNode)": "if (false)" + } + }), + // os is not used by the browser bundle, so just shim it + shim({ + dotenv: `export function config() { }`, + os: ` + export const type = 1; + export const release = 1; + ` + }), + nodeResolve({ + mainFields: ["module", "browser"], + preferBuiltins: false + }), + cjs({ + namedExports: { + events: ["EventEmitter"], + assert: [ + "ok", + "deepEqual", + "equal", + "fail", + "deepStrictEqual", + "notDeepStrictEqual", + "notDeepEqual", + "notEqual" + ] + } + }) + ] + }; + + if (test) { + baseConfig.input = ["dist-esm/test/*.spec.js", "dist-esm/test/browser/*.spec.js"]; + baseConfig.plugins.unshift(multiEntry({ exports: false })); + baseConfig.output.file = "dist-test/index.browser.js"; + + baseConfig.context = "null"; + } else if (production) { + baseConfig.output.file = "browser/azure-storage-file.min.js"; + baseConfig.plugins.push( + uglify({ + output: { + preamble: banner + } + }) + // Comment visualizer because it only works on Node.js 8+; Uncomment it to get bundle analysis report + // visualizer({ + // filename: "./statistics.html", + // sourcemap: true + // }) + ); + } + + return baseConfig; +} diff --git a/sdk/storage/storage-file/rollup.config.js b/sdk/storage/storage-file/rollup.config.js index 8e94e4f9bfcb..6f119550d77a 100644 --- a/sdk/storage/storage-file/rollup.config.js +++ b/sdk/storage/storage-file/rollup.config.js @@ -1,104 +1,18 @@ -import nodeResolve from "rollup-plugin-node-resolve"; -import { uglify } from "rollup-plugin-uglify"; -import replace from "rollup-plugin-replace"; -import commonjs from "rollup-plugin-commonjs"; -import shim from "rollup-plugin-shim"; -// import visualizer from "rollup-plugin-visualizer"; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. -const version = require("./package.json").version; -const banner = [ - "/*!", - ` * Azure Storage SDK for JavaScript - File, ${version}`, - " * Copyright (c) Microsoft and contributors. All rights reserved.", - " */" -].join("\n"); +import * as base from "./rollup.base.config"; -const nodeRollupConfigFactory = () => { - return { - external: ["@azure/ms-rest-js", "crypto", "fs", "events", "os", "stream"], - input: "dist-esm/src/index.js", - output: { - file: "dist/index.js", - format: "cjs", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [nodeResolve(), uglify()] - }; -}; +const inputs = []; -const browserRollupConfigFactory = (isProduction) => { - const browserRollupConfig = { - input: "dist-esm/src/index.browser.js", - output: { - file: "browser/azure-storage.file.js", - banner: banner, - format: "umd", - name: "azfile", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - replace({ - delimiters: ["", ""], - values: { - // replace dynamic checks with if (false) since this is for - // browser only. Rollup's dead code elimination will remove - // any code guarded by if (isNode) { ... } - "if (isNode)": "if (false)" - } - }), - // os is not used by the browser bundle, so just shim it - shim({ - dotenv: `export function config() { }`, - os: ` - export const type = 1; - export const release = 1; - ` - }), - nodeResolve({ - mainFields: ["module", "browser"], - preferBuiltins: false - }), - commonjs({ - namedExports: { - events: ["EventEmitter"], - assert: [ - "ok", - "deepEqual", - "equal", - "fail", - "deepStrictEqual", - "notDeepStrictEqual", - "notDeepEqual", - "notEqual" - ] - } - }) - ] - }; +if (!process.env.ONLY_BROWSER) { + inputs.push(base.nodeConfig()); +} - if (isProduction) { - browserRollupConfig.output.file = "browser/azure-storage.file.min.js"; - browserRollupConfig.plugins.push( - uglify({ - output: { - preamble: banner - } - }) - // Comment visualizer because it only works on Node.js 8+; Uncomment it to get bundle analysis report - // visualizer({ - // filename: "./statistics.html", - // sourcemap: true - // }) - ); - } +// Disable this until we are ready to run rollup for the browser. +if (!process.env.ONLY_NODE) { + inputs.push(base.browserConfig()); + inputs.push(base.browserConfig(false, true)); +} - return browserRollupConfig; -}; - -export default [ - browserRollupConfigFactory(false), - browserRollupConfigFactory(true), - nodeRollupConfigFactory() -]; +export default inputs; diff --git a/sdk/storage/storage-file/rollup.test.config.js b/sdk/storage/storage-file/rollup.test.config.js index 24622435837c..ad98718cce46 100644 --- a/sdk/storage/storage-file/rollup.test.config.js +++ b/sdk/storage/storage-file/rollup.test.config.js @@ -1,13 +1,6 @@ -import multi from "rollup-plugin-multi-entry"; -import baseConfig from "./rollup.config"; -import sourcemaps from "rollup-plugin-sourcemaps"; -const [browser] = baseConfig; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. -browser.input = ["dist-esm/test/*.js", "dist-esm/test/browser/*.js"]; -browser.output.sourcemap = "inline"; -browser.output.file = "dist-test/index.browser.js"; -browser.plugins.unshift(multi()); -browser.plugins.unshift(sourcemaps()); -browser.context = "null"; +import * as base from "./rollup.base.config"; -export default [browser]; +export default [base.nodeConfig(true), base.browserConfig(true)]; diff --git a/sdk/storage/storage-file/test/aborter.test.ts b/sdk/storage/storage-file/test/aborter.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/aborter.test.ts rename to sdk/storage/storage-file/test/aborter.spec.ts diff --git a/sdk/storage/storage-file/test/directoryurl.test.ts b/sdk/storage/storage-file/test/directoryurl.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/directoryurl.test.ts rename to sdk/storage/storage-file/test/directoryurl.spec.ts diff --git a/sdk/storage/storage-file/test/fileurl.test.ts b/sdk/storage/storage-file/test/fileurl.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/fileurl.test.ts rename to sdk/storage/storage-file/test/fileurl.spec.ts diff --git a/sdk/storage/storage-file/test/node/fileurl.test.ts b/sdk/storage/storage-file/test/node/fileurl.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/node/fileurl.test.ts rename to sdk/storage/storage-file/test/node/fileurl.spec.ts diff --git a/sdk/storage/storage-file/test/node/highlevel.node.test.ts b/sdk/storage/storage-file/test/node/highlevel.node.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/node/highlevel.node.test.ts rename to sdk/storage/storage-file/test/node/highlevel.node.spec.ts diff --git a/sdk/storage/storage-file/test/node/sas.test.ts b/sdk/storage/storage-file/test/node/sas.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/node/sas.test.ts rename to sdk/storage/storage-file/test/node/sas.spec.ts diff --git a/sdk/storage/storage-file/test/node/sharedkeycredentialpolicy.test.ts b/sdk/storage/storage-file/test/node/sharedkeycredentialpolicy.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/node/sharedkeycredentialpolicy.test.ts rename to sdk/storage/storage-file/test/node/sharedkeycredentialpolicy.spec.ts diff --git a/sdk/storage/storage-file/test/node/shareurl.test.ts b/sdk/storage/storage-file/test/node/shareurl.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/node/shareurl.test.ts rename to sdk/storage/storage-file/test/node/shareurl.spec.ts diff --git a/sdk/storage/storage-file/test/retrypolicy.test.ts b/sdk/storage/storage-file/test/retrypolicy.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/retrypolicy.test.ts rename to sdk/storage/storage-file/test/retrypolicy.spec.ts diff --git a/sdk/storage/storage-file/test/serviceurl.test.ts b/sdk/storage/storage-file/test/serviceurl.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/serviceurl.test.ts rename to sdk/storage/storage-file/test/serviceurl.spec.ts diff --git a/sdk/storage/storage-file/test/shareurl.test.ts b/sdk/storage/storage-file/test/shareurl.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/shareurl.test.ts rename to sdk/storage/storage-file/test/shareurl.spec.ts diff --git a/sdk/storage/storage-file/test/specialnaming.test.ts b/sdk/storage/storage-file/test/specialnaming.spec.ts similarity index 100% rename from sdk/storage/storage-file/test/specialnaming.test.ts rename to sdk/storage/storage-file/test/specialnaming.spec.ts diff --git a/sdk/storage/storage-queue/.npmignore b/sdk/storage/storage-queue/.npmignore index 7f8e2a7885bf..ecf17923297a 100644 --- a/sdk/storage/storage-queue/.npmignore +++ b/sdk/storage/storage-queue/.npmignore @@ -1,6 +1,6 @@ # browser # -browser/azure-storage.queue.js -browser/azure-storage.queue.js.map +browser/azure-storage-queue.js +browser/azure-storage-queue.js.map # dist-test # dist-test/ diff --git a/sdk/storage/storage-queue/.nycrc b/sdk/storage/storage-queue/.nycrc index db40901a5a06..9d172c4525f3 100644 --- a/sdk/storage/storage-queue/.nycrc +++ b/sdk/storage/storage-queue/.nycrc @@ -1,6 +1,6 @@ { "include": [ - "src/**/*.ts" + "dist-test/index.node.js" ], "exclude": [ "**/*.d.ts", @@ -18,6 +18,7 @@ "html", "cobertura" ], + "exclude-after-remap":false, "sourceMap": true, "instrument": true, "all": true diff --git a/sdk/storage/storage-queue/README.md b/sdk/storage/storage-queue/README.md index b44e074bac87..f41d3ef2da69 100644 --- a/sdk/storage/storage-queue/README.md +++ b/sdk/storage/storage-queue/README.md @@ -1,7 +1,7 @@ # Azure Storage SDK V10 for JavaScript - Queue -* [![npm version](https://badge.fury.io/js/%40azure%2Fstorage-queue.svg)](https://badge.fury.io/js/%40azure%2Fstorage-queue) -* [API Reference documentation](https://docs.microsoft.com/en-us/javascript/api/%40azure/storage-queue/index?view=azure-node-preview) +- [![npm version](https://badge.fury.io/js/%40azure%2Fstorage-queue.svg)](https://badge.fury.io/js/%40azure%2Fstorage-queue) +- [API Reference documentation](https://docs.microsoft.com/en-us/javascript/api/%40azure/storage-queue/index?view=azure-node-preview) ## Introduction @@ -11,14 +11,14 @@ Please note that this version of the SDK is a compete overhaul of the current [A ### Features -* Queue Storage - * Get/Set Queue Service Properties - * Create/List/Delete Queues - * Enqueue/Dequeue/Peek/Clear/Update/Delete Queue Messages -* Features new - * Asynchronous I/O for all operations using the async methods - * HttpPipeline which enables a high degree of per-request configurability - * 1-to-1 correlation with the Storage REST API for clarity and simplicity +- Queue Storage + - Get/Set Queue Service Properties + - Create/List/Delete Queues + - Enqueue/Dequeue/Peek/Clear/Update/Delete Queue Messages +- Features new + - Asynchronous I/O for all operations using the async methods + - HttpPipeline which enables a high degree of per-request configurability + - 1-to-1 correlation with the Storage REST API for clarity and simplicity ### Compatibility @@ -30,14 +30,13 @@ You need polyfills to make this library work with IE11. The easiest way is to us Or you can load separate polyfills for missed ES feature(s). This library depends on following ES features which need external polyfills loaded. -* `Promise` -* `String.prototype.startsWith` -* `String.prototype.endsWith` -* `String.prototype.repeat` -* `String.prototype.includes` -* `Array.prototype.includes` -* `Object.keys` (Override IE11's `Object.keys` with ES6 polyfill forcely to enable [ES6 behavior](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Notes)) - +- `Promise` +- `String.prototype.startsWith` +- `String.prototype.endsWith` +- `String.prototype.repeat` +- `String.prototype.includes` +- `Array.prototype.includes` +- `Object.keys` (Override IE11's `Object.keys` with ES6 polyfill forcely to enable [ES6 behavior](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Notes)) #### Differences between Node.js and browsers @@ -45,11 +44,11 @@ There are differences between Node.js and browsers runtime. When getting start w ##### Following features, interfaces, classes or functions are only available in Node.js -* Shared Key Authorization based on account name and account key - * `SharedKeyCredential` -* Shared Access Signature(SAS) generation - * `generateAccountSASQueryParameters()` - * `generateQueueSASQueryParameters()` +- Shared Key Authorization based on account name and account key + - `SharedKeyCredential` +- Shared Access Signature(SAS) generation + - `generateAccountSASQueryParameters()` + - `generateQueueSASQueryParameters()` ## Getting Started @@ -78,18 +77,18 @@ const Azure = require("@azure/storage-queue"); To use the SDK with JS bundle in the browsers, simply add a script tag to your HTML pages pointing to the downloaded JS bundle file(s): ```html - + ``` The JS bundled file is compatible with [UMD](https://github.com/umdjs/umd) standard, if no module system found, following global variable(s) will be exported: -* `azqueue` +- `azqueue` #### Download Download latest released JS bundles from links in the [GitHub release page](https://github.com/Azure/azure-sdk-for-js/releases). Or from following links directly: -* Queue [https://aka.ms/downloadazurestoragejsqueue](https://aka.ms/downloadazurestoragejsqueue) +- Queue [https://aka.ms/downloadazurestoragejsqueue](https://aka.ms/downloadazurestoragejsqueue) ### CORS @@ -97,128 +96,157 @@ You need to set up [Cross-Origin Resource Sharing (CORS)](https://docs.microsoft For example, you can create following CORS settings for debugging. But please customize the settings carefully according to your requirements in production environment. -* Allowed origins: \* -* Allowed verbs: DELETE,GET,HEAD,MERGE,POST,OPTIONS,PUT -* Allowed headers: \* -* Exposed headers: \* -* Maximum age (seconds): 86400 +- Allowed origins: \* +- Allowed verbs: DELETE,GET,HEAD,MERGE,POST,OPTIONS,PUT +- Allowed headers: \* +- Exposed headers: \* +- Maximum age (seconds): 86400 ## SDK Architecture The Azure Storage SDK for JavaScript provides low-level and high-level APIs. -* ServiceURL, QueueURL, MessagesURL and MessageIdURL objects provide the low-level API functionality and map one-to-one to the [Azure Storage Queue REST APIs](https://docs.microsoft.com/en-us/rest/api/storageservices/queue-service-rest-api). +- ServiceURL, QueueURL, MessagesURL and MessageIdURL objects provide the low-level API functionality and map one-to-one to the [Azure Storage Queue REST APIs](https://docs.microsoft.com/en-us/rest/api/storageservices/queue-service-rest-api). ## Code Samples ```javascript const { - Aborter, - QueueURL, - MessagesURL, - MessageIdURL, - ServiceURL, - StorageURL, - SharedKeyCredential, - AnonymousCredential, - TokenCredential + Aborter, + QueueURL, + MessagesURL, + MessageIdURL, + ServiceURL, + StorageURL, + SharedKeyCredential, + AnonymousCredential, + TokenCredential } = require(".."); // Change to "@azure/storage-queue" in your package async function main() { - // Enter your storage account name and shared key - const account = ""; - const accountKey = ""; - - // Use SharedKeyCredential with storage account and account key - const sharedKeyCredential = new SharedKeyCredential(account, accountKey); - - // Use TokenCredential with OAuth token - const tokenCredential = new TokenCredential("token"); - tokenCredential.token = "renewedToken"; // Renew the token by updating token field of token credential - - // Use AnonymousCredential when url already includes a SAS signature - const anonymousCredential = new AnonymousCredential(); - - // Use sharedKeyCredential, tokenCredential or anonymousCredential to create a pipeline - const pipeline = StorageURL.newPipeline(sharedKeyCredential, { - // httpClient: MyHTTPClient, // A customized HTTP client implementing IHttpClient interface - // logger: MyLogger, // A customized logger implementing IHttpPipelineLogger interface - retryOptions: { maxTries: 4 }, // Retry options - telemetry: { value: "BasicSample V10.0.0" } // Customized telemetry string - }); - - // List queues - const serviceURL = new ServiceURL( - // When using AnonymousCredential, following url should include a valid SAS or support public access - `https://${account}.queue.core.windows.net`, - pipeline + // Enter your storage account name and shared key + const account = ""; + const accountKey = ""; + + // Use SharedKeyCredential with storage account and account key + const sharedKeyCredential = new SharedKeyCredential(account, accountKey); + + // Use TokenCredential with OAuth token + const tokenCredential = new TokenCredential("token"); + tokenCredential.token = "renewedToken"; // Renew the token by updating token field of token credential + + // Use AnonymousCredential when url already includes a SAS signature + const anonymousCredential = new AnonymousCredential(); + + // Use sharedKeyCredential, tokenCredential or anonymousCredential to create a pipeline + const pipeline = StorageURL.newPipeline(sharedKeyCredential, { + // httpClient: MyHTTPClient, // A customized HTTP client implementing IHttpClient interface + // logger: MyLogger, // A customized logger implementing IHttpPipelineLogger interface + retryOptions: { maxTries: 4 }, // Retry options + telemetry: { value: "BasicSample V10.0.0" } // Customized telemetry string + }); + + // List queues + const serviceURL = new ServiceURL( + // When using AnonymousCredential, following url should include a valid SAS or support public access + `https://${account}.queue.core.windows.net`, + pipeline + ); + + console.log(`List queues`); + let marker; + do { + const listQueuesResponse = await serviceURL.listQueuesSegment( + Aborter.none, + marker ); - console.log(`List queues`); - let marker; - do { - const listQueuesResponse = await serviceURL.listQueuesSegment( - Aborter.none, - marker - ); - - marker = listQueuesResponse.nextMarker; - for (const queue of listQueuesResponse.queueItems) { - console.log(`Queue: ${queue.name}`); - } - } while (marker); - - // Create a new queue - const queueName = `newqueue${new Date().getTime()}`; - const queueURL = QueueURL.fromServiceURL(serviceURL, queueName); - const createQueueResponse = await queueURL.create(Aborter.none); + marker = listQueuesResponse.nextMarker; + for (const queue of listQueuesResponse.queueItems) { + console.log(`Queue: ${queue.name}`); + } + } while (marker); + + // Create a new queue + const queueName = `newqueue${new Date().getTime()}`; + const queueURL = QueueURL.fromServiceURL(serviceURL, queueName); + const createQueueResponse = await queueURL.create(Aborter.none); + console.log( + `Create queue ${queueName} successfully, service assigned request Id: ${ + createQueueResponse.requestId + }` + ); + + // Enqueue a message into the queue using the enqueue method. + const messagesURL = MessagesURL.fromQueueURL(queueURL); + const enqueueQueueResponse = await messagesURL.enqueue( + Aborter.none, + "Hello World!" + ); + console.log( + `Enqueue message successfully, service assigned message Id: ${ + enqueueQueueResponse.messageId + }, service assigned request Id: ${enqueueQueueResponse.requestId}` + ); + + // Peek a message using peek method. + const peekQueueResponse = await messagesURL.peek(Aborter.none); + console.log( + `The peeked message is: ${ + peekQueueResponse.peekedMessageItems[0].messageText + }` + ); + + // You de-queue a message in two steps. Call GetMessage at which point the message becomes invisible to any other code reading messages + // from this queue for a default period of 30 seconds. To finish removing the message from the queue, you call DeleteMessage. + // This two-step process ensures that if your code fails to process a message due to hardware or software failure, another instance + // of your code can get the same message and try again. + const dequeueResponse = await messagesURL.dequeue(Aborter.none); + if (dequeueResponse.dequeuedMessageItems.length == 1) { + const dequeueMessageItem = dequeueResponse.dequeuedMessageItems[0]; console.log( - `Create queue ${queueName} successfully, service assigned request Id: ${createQueueResponse.requestId}` + `Processing & deleting message with content: ${ + dequeueMessageItem.messageText + }` + ); + const messageIdURL = MessageIdURL.fromMessagesURL( + messagesURL, + dequeueMessageItem.messageId + ); + const deleteMessageResponse = await messageIdURL.delete( + Aborter.none, + dequeueMessageItem.popReceipt ); - - // Enqueue a message into the queue using the enqueue method. - const messagesURL = MessagesURL.fromQueueURL(queueURL); - const enqueueQueueResponse = await messagesURL.enqueue(Aborter.none, "Hello World!"); console.log( - `Enqueue message successfully, service assigned message Id: ${enqueueQueueResponse.messageId}, service assigned request Id: ${enqueueQueueResponse.requestId}` + `Delete message succesfully, service assigned request Id: ${ + deleteMessageResponse.requestId + }` ); - - // Peek a message using peek method. - const peekQueueResponse = await messagesURL.peek(Aborter.none); - console.log(`The peeked message is: ${peekQueueResponse.peekedMessageItems[0].messageText}`); - - // You de-queue a message in two steps. Call GetMessage at which point the message becomes invisible to any other code reading messages - // from this queue for a default period of 30 seconds. To finish removing the message from the queue, you call DeleteMessage. - // This two-step process ensures that if your code fails to process a message due to hardware or software failure, another instance - // of your code can get the same message and try again. - const dequeueResponse = await messagesURL.dequeue(Aborter.none); - if (dequeueResponse.dequeuedMessageItems.length == 1) { - const dequeueMessageItem = dequeueResponse.dequeuedMessageItems[0]; - console.log(`Processing & deleting message with content: ${dequeueMessageItem.messageText}`); - const messageIdURL = MessageIdURL.fromMessagesURL(messagesURL, dequeueMessageItem.messageId); - const deleteMessageResponse = await messageIdURL.delete(Aborter.none, dequeueMessageItem.popReceipt); - console.log(`Delete message succesfully, service assigned request Id: ${deleteMessageResponse.requestId}`); - } - - // Delete the queue. - const deleteQueueResponse = await queueURL.delete(Aborter.none); - console.log(`Delete queue successfully, service assigned request Id: ${deleteQueueResponse.requestId}`); + } + + // Delete the queue. + const deleteQueueResponse = await queueURL.delete(Aborter.none); + console.log( + `Delete queue successfully, service assigned request Id: ${ + deleteQueueResponse.requestId + }` + ); } // An async method returns a Promise object, which is compatible with then().catch() coding style. main() - .then(() => { - console.log("Successfully executed sample."); - }) - .catch(err => { - console.log(err.message); - }); + .then(() => { + console.log("Successfully executed sample."); + }) + .catch(err => { + console.log(err.message); + }); ``` ## More Code Samples -* [Queue Storage Examples](https://github.com/azure/azure-sdk-for-js/tree/master/sdk/storage/storage-queue/samples) -* [Queue Storage Examples - Test Cases](https://github.com/azure/azure-sdk-for-js/tree/master/sdk/storage/storage-queue/test/) +- [Queue Storage Examples](https://github.com/azure/azure-sdk-for-js/tree/master/sdk/storage/storage-queue/samples) +- [Queue Storage Examples - Test Cases](https://github.com/azure/azure-sdk-for-js/tree/master/sdk/storage/storage-queue/test/) ## License diff --git a/sdk/storage/storage-queue/gulpfile.js b/sdk/storage/storage-queue/gulpfile.js index d094f97460cd..fdb257c9ef55 100644 --- a/sdk/storage/storage-queue/gulpfile.js +++ b/sdk/storage/storage-queue/gulpfile.js @@ -4,9 +4,13 @@ const zip = require("gulp-zip"); const version = require("./package.json").version; const zipFileName = `azurestoragejs.queue-${version}.zip`; -gulp.task("zip", function(callback) { +gulp.task("zip", function (callback) { gulp - .src(["browser/azure-storage.queue.js", "browser/azure-storage.queue.min.js", "browser/*.txt"]) + .src([ + "browser/azure-storage-queue.js", + "browser/azure-storage-queue.min.js", + "browser/*.txt" + ]) .pipe(zip(zipFileName)) .pipe(gulp.dest("browser")) .on("end", callback); diff --git a/sdk/storage/storage-queue/karma.conf.js b/sdk/storage/storage-queue/karma.conf.js index 0f2659a3760a..22d8ae1b7cc2 100644 --- a/sdk/storage/storage-queue/karma.conf.js +++ b/sdk/storage/storage-queue/karma.conf.js @@ -2,7 +2,7 @@ process.env.CHROME_BIN = require("puppeteer").executablePath(); require("dotenv").config({ path: "../.env" }); -module.exports = function(config) { +module.exports = function (config) { config.set({ // base path that will be used to resolve all patterns (eg. files, exclude) basePath: "./", @@ -65,7 +65,7 @@ module.exports = function(config) { // Exclude coverage calculation for following files remapOptions: { - exclude: /node_modules|tests/g + exclude: /node_modules|test/g }, junitReporter: { diff --git a/sdk/storage/storage-queue/package.json b/sdk/storage/storage-queue/package.json index 130356122833..6649b0f7133a 100644 --- a/sdk/storage/storage-queue/package.json +++ b/sdk/storage/storage-queue/package.json @@ -5,7 +5,7 @@ "main": "./dist/index.js", "module": "./dist-esm/src/index.js", "browser": { - "./dist/index.js": "./browser/azure-storage.queue.min.js", + "./dist/index.js": "./browser/azure-storage-queue.min.js", "./dist-esm/src/index.js": "./dist-esm/src/index.browser.js", "./dist-esm/test/utils/index.js": "./dist-esm/test/utils/index.browser.js", "os": false, @@ -76,7 +76,7 @@ "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", "integration-test:browser": "karma start --single-run", - "integration-test:node": "cross-env TS_NODE_COMPILER_OPTIONS=\"{\\\"module\\\": \\\"commonjs\\\"}\" nyc mocha --compilers ts-node/register --require source-map-support/register --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=- --full-trace --no-timeouts test/*.test.ts test/node/*.test.ts", + "integration-test:node": "nyc mocha --require source-map-support/register --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=- --full-trace -t 120000 dist-test/index.node.js", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint:fix": "echo skipped", "lint": "echo skipped", diff --git a/sdk/storage/storage-queue/rollup.base.config.js b/sdk/storage/storage-queue/rollup.base.config.js new file mode 100644 index 000000000000..7d40f05230e8 --- /dev/null +++ b/sdk/storage/storage-queue/rollup.base.config.js @@ -0,0 +1,135 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import nodeResolve from "rollup-plugin-node-resolve"; +import multiEntry from "rollup-plugin-multi-entry"; +import cjs from "rollup-plugin-commonjs"; +import replace from "rollup-plugin-replace"; +import { uglify } from "rollup-plugin-uglify"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import shim from "rollup-plugin-shim"; +// import visualizer from "rollup-plugin-visualizer"; + +const version = require("./package.json").version; +const banner = [ + "/*!", + ` * Azure Storage SDK for JavaScript - Queue, ${version}`, + " * Copyright (c) Microsoft and contributors. All rights reserved.", + " */" +].join("\n"); + +const pkg = require("./package.json"); +const depNames = Object.keys(pkg.dependencies); +const production = process.env.NODE_ENV === "production"; + +export function nodeConfig(test = false) { + const externalNodeBuiltins = ["@azure/ms-rest-js", "crypto", "fs", "os"]; + const baseConfig = { + input: "dist-esm/src/index.js", + external: depNames.concat(externalNodeBuiltins), + output: { + file: "dist/index.js", + format: "cjs", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + sourcemaps(), + replace({ + delimiters: ["", ""], + values: { + // replace dynamic checks with if (true) since this is for node only. + // Allows rollup's dead code elimination to be more aggressive. + "if (isNode)": "if (true)" + } + }), + nodeResolve({ preferBuiltins: true }), + cjs() + ] + }; + + if (test) { + // entry point is every test file + baseConfig.input = ["dist-esm/test/*.spec.js", "dist-esm/test/node/*.spec.js"]; + baseConfig.plugins.unshift(multiEntry({ exports: false })); + + // different output file + baseConfig.output.file = "dist-test/index.node.js"; + + // mark assert as external + baseConfig.external.push("assert", "fs", "path"); + + baseConfig.context = "null"; + } else if (production) { + baseConfig.plugins.push(uglify()); + } + + return baseConfig; +} + +export function browserConfig(test = false, production = false) { + const baseConfig = { + input: "dist-esm/src/index.browser.js", + output: { + file: "browser/azure-storage-queue.js", + banner: banner, + format: "umd", + name: "azqueue", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + sourcemaps(), + replace({ + delimiters: ["", ""], + values: { + // replace dynamic checks with if (false) since this is for + // browser only. Rollup's dead code elimination will remove + // any code guarded by if (isNode) { ... } + "if (isNode)": "if (false)" + } + }), + // os is not used by the browser bundle, so just shim it + shim({ + dotenv: `export function config() { }`, + os: ` + export const type = 1; + export const release = 1; + ` + }), + nodeResolve({ + mainFields: ["module", "browser"], + preferBuiltins: false + }), + cjs({ + namedExports: { + assert: ["ok", "deepEqual", "equal", "fail", "deepStrictEqual"] + } + }) + ] + }; + + if (test) { + baseConfig.input = ["dist-esm/test/*.spec.js", "dist-esm/test/browser/*.spec.js"]; + baseConfig.plugins.unshift(multiEntry({ exports: false })); + baseConfig.output.file = "dist-test/index.browser.js"; + + baseConfig.context = "null"; + } else if (production) { + baseConfig.output.file = "browser/azure-storage-queue.min.js"; + baseConfig.plugins.push( + uglify({ + output: { + preamble: banner + } + }) + // Comment visualizer because it only works on Node.js 8+; Uncomment it to get bundle analysis report + // visualizer({ + // filename: "./statistics.html", + // sourcemap: true + // }) + ); + } + + return baseConfig; +} diff --git a/sdk/storage/storage-queue/rollup.config.js b/sdk/storage/storage-queue/rollup.config.js index 9dd5f44ce62a..6f119550d77a 100644 --- a/sdk/storage/storage-queue/rollup.config.js +++ b/sdk/storage/storage-queue/rollup.config.js @@ -1,94 +1,18 @@ -import nodeResolve from "rollup-plugin-node-resolve"; -import { uglify } from "rollup-plugin-uglify"; -import replace from "rollup-plugin-replace"; -import commonjs from "rollup-plugin-commonjs"; -import shim from "rollup-plugin-shim"; -//import visualizer from "rollup-plugin-visualizer"; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. -const version = require("./package.json").version; -const banner = [ - "/*!", - ` * Azure Storage SDK for JavaScript - Queue, ${version}`, - " * Copyright (c) Microsoft and contributors. All rights reserved.", - " */" -].join("\n"); +import * as base from "./rollup.base.config"; -const nodeRollupConfigFactory = () => { - return { - external: ["@azure/ms-rest-js", "crypto", "fs", "os"], - input: "dist-esm/src/index.js", - output: { - file: "dist/index.js", - format: "cjs", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [nodeResolve(), uglify()] - }; -}; +const inputs = []; -const browserRollupConfigFactory = (isProduction) => { - const browserRollupConfig = { - input: "dist-esm/src/index.browser.js", - output: { - file: "browser/azure-storage.queue.js", - banner: banner, - format: "umd", - name: "azqueue", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - replace({ - delimiters: ["", ""], - values: { - // replace dynamic checks with if (false) since this is for - // browser only. Rollup's dead code elimination will remove - // any code guarded by if (isNode) { ... } - "if (isNode)": "if (false)" - } - }), - // os is not used by the browser bundle, so just shim it - shim({ - dotenv: `export function config() { }`, - os: ` - export const type = 1; - export const release = 1; - ` - }), - nodeResolve({ - mainFields: ["module", "browser"], - preferBuiltins: false - }), - commonjs({ - namedExports: { - assert: ["ok", "deepEqual", "equal", "fail", "deepStrictEqual"] - } - }) - ] - }; +if (!process.env.ONLY_BROWSER) { + inputs.push(base.nodeConfig()); +} - if (isProduction) { - browserRollupConfig.output.file = "browser/azure-storage.queue.min.js"; - browserRollupConfig.plugins.push( - uglify({ - output: { - preamble: banner - } - }) - // Comment visualizer because it only works on Node.js 8+; Uncomment it to get bundle analysis report - // visualizer({ - // filename: "./statistics.html", - // sourcemap: true - // }) - ); - } +// Disable this until we are ready to run rollup for the browser. +if (!process.env.ONLY_NODE) { + inputs.push(base.browserConfig()); + inputs.push(base.browserConfig(false, true)); +} - return browserRollupConfig; -}; - -export default [ - browserRollupConfigFactory(false), - browserRollupConfigFactory(true), - nodeRollupConfigFactory() -]; +export default inputs; diff --git a/sdk/storage/storage-queue/rollup.test.config.js b/sdk/storage/storage-queue/rollup.test.config.js index 24622435837c..ad98718cce46 100644 --- a/sdk/storage/storage-queue/rollup.test.config.js +++ b/sdk/storage/storage-queue/rollup.test.config.js @@ -1,13 +1,6 @@ -import multi from "rollup-plugin-multi-entry"; -import baseConfig from "./rollup.config"; -import sourcemaps from "rollup-plugin-sourcemaps"; -const [browser] = baseConfig; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. -browser.input = ["dist-esm/test/*.js", "dist-esm/test/browser/*.js"]; -browser.output.sourcemap = "inline"; -browser.output.file = "dist-test/index.browser.js"; -browser.plugins.unshift(multi()); -browser.plugins.unshift(sourcemaps()); -browser.context = "null"; +import * as base from "./rollup.base.config"; -export default [browser]; +export default [base.nodeConfig(true), base.browserConfig(true)]; diff --git a/sdk/storage/storage-queue/test/aborter.test.ts b/sdk/storage/storage-queue/test/aborter.spec.ts similarity index 100% rename from sdk/storage/storage-queue/test/aborter.test.ts rename to sdk/storage/storage-queue/test/aborter.spec.ts diff --git a/sdk/storage/storage-queue/test/messageidurl.test.ts b/sdk/storage/storage-queue/test/messageidurl.spec.ts similarity index 100% rename from sdk/storage/storage-queue/test/messageidurl.test.ts rename to sdk/storage/storage-queue/test/messageidurl.spec.ts diff --git a/sdk/storage/storage-queue/test/messagesurl.test.ts b/sdk/storage/storage-queue/test/messagesurl.spec.ts similarity index 100% rename from sdk/storage/storage-queue/test/messagesurl.test.ts rename to sdk/storage/storage-queue/test/messagesurl.spec.ts diff --git a/sdk/storage/storage-queue/test/node/messageidurl.test.ts b/sdk/storage/storage-queue/test/node/messageidurl.spec.ts similarity index 100% rename from sdk/storage/storage-queue/test/node/messageidurl.test.ts rename to sdk/storage/storage-queue/test/node/messageidurl.spec.ts diff --git a/sdk/storage/storage-queue/test/node/messagesurl.test.ts b/sdk/storage/storage-queue/test/node/messagesurl.spec.ts similarity index 100% rename from sdk/storage/storage-queue/test/node/messagesurl.test.ts rename to sdk/storage/storage-queue/test/node/messagesurl.spec.ts diff --git a/sdk/storage/storage-queue/test/node/queueurl.test.ts b/sdk/storage/storage-queue/test/node/queueurl.spec.ts similarity index 100% rename from sdk/storage/storage-queue/test/node/queueurl.test.ts rename to sdk/storage/storage-queue/test/node/queueurl.spec.ts diff --git a/sdk/storage/storage-queue/test/node/sas.test.ts b/sdk/storage/storage-queue/test/node/sas.spec.ts similarity index 100% rename from sdk/storage/storage-queue/test/node/sas.test.ts rename to sdk/storage/storage-queue/test/node/sas.spec.ts diff --git a/sdk/storage/storage-queue/test/queueurl.test.ts b/sdk/storage/storage-queue/test/queueurl.spec.ts similarity index 100% rename from sdk/storage/storage-queue/test/queueurl.test.ts rename to sdk/storage/storage-queue/test/queueurl.spec.ts diff --git a/sdk/storage/storage-queue/test/retrypolicy.test.ts b/sdk/storage/storage-queue/test/retrypolicy.spec.ts similarity index 100% rename from sdk/storage/storage-queue/test/retrypolicy.test.ts rename to sdk/storage/storage-queue/test/retrypolicy.spec.ts diff --git a/sdk/storage/storage-queue/test/serviceurl.test.ts b/sdk/storage/storage-queue/test/serviceurl.spec.ts similarity index 100% rename from sdk/storage/storage-queue/test/serviceurl.test.ts rename to sdk/storage/storage-queue/test/serviceurl.spec.ts