diff --git a/packages/compat/package.json b/packages/compat/package.json index 439849e7c..45c232498 100644 --- a/packages/compat/package.json +++ b/packages/compat/package.json @@ -39,6 +39,7 @@ "broccoli-plugin": "^1.3.0", "broccoli-source": "^1.1.0", "debug": "^3.1.0", + "ember-cli-htmlbars": "^3.0.1", "fs-extra": "^7.0.0", "fs-tree-diff": "0.5.7", "jsdom": "^12.0.0", diff --git a/packages/compat/src/apply-ast-transforms.ts b/packages/compat/src/apply-ast-transforms.ts new file mode 100644 index 000000000..795f4bfe9 --- /dev/null +++ b/packages/compat/src/apply-ast-transforms.ts @@ -0,0 +1,81 @@ +import { readFileSync } from 'fs'; +import HTMLBarsTransform, { Options as HTMLBarsOptions } from 'ember-cli-htmlbars'; +import { Tree } from 'broccoli-plugin'; +import { join } from 'path'; + +interface AST { + _deliberatelyOpaque: 'AST'; +} + +// see processString in ember-cli-htmlbars/index.js. We are going to build almost exactly the same transform, but instead of templateCompiler.precomiple we call ssyntax.print(yntax.preprocess()) +interface PreprocessOptions { + contents: string; // the original source of the template + moduleName: string; // example: "ember-basic-dropdown/templates/components/basic-dropdown-content.hbs" +} + +interface GlimmerSyntax { + preprocess: (html: string, options?: PreprocessOptions) => AST; + print: (ast: AST) => string; +} + +let glimmerSyntaxCache: GlimmerSyntax | undefined; + +// we could directly depend on @glimmer/syntax and have nice types and +// everything. But the problem is, we really want to use the exact version that +// the app itself is using, and its copy is bundled away inside +// ember-template-compiler.js. +function loadGlimmerSyntax(templateCompilerPath: string): GlimmerSyntax { + if (glimmerSyntaxCache) { + return glimmerSyntaxCache; + } + let orig = Object.create; + let grabbed: any[] = []; + (Object as any).create = function(proto: any, propertiesObject: any) { + let result = orig.call(this, proto, propertiesObject); + grabbed.push(result); + return result; + }; + try { + eval(readFileSync(templateCompilerPath, 'utf8')); + } finally { + Object.create = orig; + } + for (let obj of grabbed) { + if (obj['@glimmer/syntax'] && obj['@glimmer/syntax'].print) { + // we found the loaded modules + glimmerSyntaxCache = { + print: obj['@glimmer/syntax'].print, + preprocess: obj['@glimmer/syntax'].preprocess, + }; + return glimmerSyntaxCache; + } + } + throw new Error(`unable to find @glimmer/syntax methods in ${templateCompilerPath}`); +} + +export default class extends HTMLBarsTransform { + private syntax: GlimmerSyntax; + + constructor(inputTree: Tree, options: HTMLBarsOptions) { + options.name = 'embroider-apply-ast-transforms'; + super(inputTree, options); + this.syntax = loadGlimmerSyntax(options.templateCompilerPath); + + // unlike our parent class, we don't want to rename hbs to js + this.targetExtension = null; + } + processString(source: string, relativePath: string) { + console.log(`we are processing ${relativePath}`); + let ast = this.syntax.preprocess(source, { + contents: source, + moduleName: relativePath + }); + return this.syntax.print(ast); + } + cacheKeyProcessString(source: string, relativePath: string) { + return `embroider-` + super.cacheKeyProcessString(source, relativePath); + } + baseDir() { + return join(__dirname, '..'); + } +} diff --git a/packages/compat/src/v1-addon.ts b/packages/compat/src/v1-addon.ts index 2fd8cbbbc..bf82d16b0 100644 --- a/packages/compat/src/v1-addon.ts +++ b/packages/compat/src/v1-addon.ts @@ -21,6 +21,9 @@ import { Package, PackageCache, BasicPackage, AddonMeta } from "@embroider/core" import { AddonOptionsWithDefaults } from "./options"; import walkSync from 'walk-sync'; import AddToTree from "./add-to-tree"; +import ApplyASTTransforms from './apply-ast-transforms'; +import { Options as HTMLBarsOptions } from 'ember-cli-htmlbars'; +import resolve from "resolve"; const stockTreeNames = Object.freeze([ 'addon', @@ -50,6 +53,18 @@ const dynamicTreeHooks = Object.freeze([ const appPublicationDir = '_app_'; +let locatePreprocessRegistry: (addonInstance: any) => any; +{ + let preprocessRegistry: any; + locatePreprocessRegistry = function(addonInstance: any) { + if (!preprocessRegistry) { + let cliPath = resolve.sync('ember-cli', { basedir: addonInstance._findHost().project.root }); + preprocessRegistry = require(resolve.sync('ember-cli-preprocess-registry/preprocessors', { basedir: cliPath })); + } + return preprocessRegistry; + }; +} + // This controls and types the interface between our new world and the classic // v1 addon instance. export default class V1Addon implements V1Package { @@ -77,17 +92,25 @@ export default class V1Addon implements V1Package { // a no-op transform here to avoid an exception coming out of ember-cli like // "Addon templates were detected, but there are no template compilers // registered". - registry.remove('template', 'ember-cli-htmlbars'); - if (registry.load('htmlbars-ast-plugin').length > 0) { - todo(`${this.name} has a custom AST transform that we need to apply`); + let htmlbars = this.addonInstance.addons.find((a: any) => a.name === 'ember-cli-htmlbars'); + if (htmlbars) { + registry.remove('template', 'ember-cli-htmlbars'); + let options = htmlbars.htmlbarsOptions() as HTMLBarsOptions; + registry.add('template', { + name: 'embroider-addon-templates', + ext: 'hbs', + _addon: this, + toTree(tree: Tree): Tree { + if (registry.load('htmlbars-ast-plugin').length === 0) { + // when there are no custom AST transforms, we don't need to do + // anything at all. + return tree; + } else { + return new ApplyASTTransforms(tree, options); + } + } + }); } - registry.add('template', { - name: 'embroider-addon-templates', - ext: 'hbs', - toTree(tree: Tree): Tree { - return tree; - } - }); } get name(): string { @@ -167,9 +190,15 @@ export default class V1Addon implements V1Package { if (includeCSS) { tree = this.addonInstance.compileStyles(tree); } - return this.addonInstance.preprocessJs(tree, '/', this.moduleName, { + tree = this.addonInstance.preprocessJs(tree, '/', this.moduleName, { registry : this.addonInstance.registry }); + if (this.addonInstance.registry.load('template').length > 0) { + tree = locatePreprocessRegistry(this.addonInstance).preprocessTemplates(tree, { + registry: this.addonInstance.registry + }); + } + return tree; } @Memoize() @@ -267,7 +296,6 @@ export default class V1Addon implements V1Package { srcDirs: [this.moduleName, `modules/${this.moduleName}`] }); } - // todo: also invoke treeForAddonTemplates } else if (this.hasStockTree('addon')) { return this.transpile(this.stockTree('addon', { exclude: ['styles/**'] diff --git a/types/ember-cli-htmlbars/index.d.ts b/types/ember-cli-htmlbars/index.d.ts new file mode 100644 index 000000000..391cca8f2 --- /dev/null +++ b/types/ember-cli-htmlbars/index.d.ts @@ -0,0 +1,19 @@ + +declare module 'ember-cli-htmlbars' { + + import Plugin, { Tree } from "broccoli-plugin"; + + export interface Options { + templateCompilerPath: string; + name?: string; + } + + export default class HTMLBarsTransform extends Plugin { + constructor(inputTree: Tree, options: Options) + build(): Promise; + protected cacheKeyProcessString(contents: string, relativePath: string): string; + protected targetExtension: string | null; + } + + +} diff --git a/yarn.lock b/yarn.lock index 46c4a9242..203cb6460 100644 --- a/yarn.lock +++ b/yarn.lock @@ -596,6 +596,19 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +async-disk-cache@^1.2.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.4.tgz#a5c9f72f199a9933583659f57a0e11377884f816" + integrity sha512-qsIvGJ/XYZ5bSGf5vHt2aEQHZnyuehmk/+51rCJhpkZl4LtvOZ+STbhLbdFAJGYO+dLzUT5Bb4nLKqHBX83vhw== + dependencies: + debug "^2.1.3" + heimdalljs "^0.2.3" + istextorbinary "2.1.0" + mkdirp "^0.5.0" + rimraf "^2.5.3" + rsvp "^3.0.18" + username-sync "^1.0.2" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -606,6 +619,14 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== +async-promise-queue@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" + integrity sha512-GQ5X3DT+TefYuFPHdvIPXFTlKnh39U7dwtl+aUBGeKjMea9nBpv3c91DXgeyBQmY07vQ97f3Sr9XHqkamEameQ== + dependencies: + async "^2.4.1" + debug "^2.6.8" + async@^2.3.0, async@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" @@ -613,6 +634,13 @@ async@^2.3.0, async@^2.5.0: dependencies: lodash "^4.17.10" +async@^2.4.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1206,6 +1234,11 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1" integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw== +"binaryextensions@1 || 2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.2.tgz#c83c3d74233ba7674e4f313cb2a2b70f54e94b7c" + integrity sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg== + blank-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" @@ -1277,6 +1310,14 @@ broccoli-funnel@^2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" +broccoli-kitchen-sink-helpers@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" + integrity sha1-d8fBgZS5ZkFj7E/O4nk0RJJuDAY= + dependencies: + glob "^5.0.10" + mkdirp "^0.5.1" + broccoli-merge-trees@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d" @@ -1290,7 +1331,26 @@ broccoli-node-info@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= -broccoli-plugin@^1.3.0: +broccoli-persistent-filter@^1.4.3: + version "1.4.6" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" + integrity sha512-0RejLwoC95kv4kta8KAa+FmECJCK78Qgm8SRDEK7YyU0N9Cx6KpY3UCDy9WELl3mCXLN8TokNxc7/hp3lL4lfw== + dependencies: + async-disk-cache "^1.2.1" + async-promise-queue "^1.0.3" + broccoli-plugin "^1.0.0" + fs-tree-diff "^0.5.2" + hash-for-dep "^1.0.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rimraf "^2.6.1" + rsvp "^3.0.18" + symlink-or-copy "^1.0.1" + walk-sync "^0.3.1" + +broccoli-plugin@^1.0.0, broccoli-plugin@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== @@ -1784,7 +1844,7 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -1916,6 +1976,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +editions@^1.1.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== + electron-to-chromium@^1.3.47: version "1.3.113" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" @@ -1934,6 +1999,16 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +ember-cli-htmlbars@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.0.1.tgz#01e21f0fd05e0a6489154f26614b1041769e3e58" + integrity sha512-pyyB2s52vKTXDC5svU3IjU7GRLg2+5O81o9Ui0ZSiBS14US/bZl46H2dwcdSJAK+T+Za36ZkQM9eh1rNwOxfoA== + dependencies: + broccoli-persistent-filter "^1.4.3" + hash-for-dep "^1.2.3" + json-stable-stringify "^1.0.0" + strip-bom "^3.0.0" + ember-rfc176-data@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.6.tgz#7138db8dfccec39c9a832adfbd4c49d670028907" @@ -2259,7 +2334,7 @@ fs-tree-diff@0.5.7: path-posix "^1.0.0" symlink-or-copy "^1.1.8" -fs-tree-diff@^0.5.3: +fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw== @@ -2337,6 +2412,17 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob@^5.0.10: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.1, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -2444,6 +2530,17 @@ hash-base@^3.0.0: inherits "^2.0.1" safe-buffer "^5.0.1" +hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.4.7.tgz#ea6f9d8e2f9e784fc48ca60c40ea886bdb41aa54" + integrity sha512-nz0Ttg6U7vx8Ec4ai4niocpJYD76fm9L1n/d2dIt4lH+s0T+TPgwaxgYkQ3S3R7ZxDyiNedYwRtdzqL29FQyTw== + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + heimdalljs "^0.2.3" + heimdalljs-logger "^0.1.7" + path-root "^0.1.1" + resolve "^1.4.0" + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -2460,7 +2557,7 @@ heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: debug "^2.2.0" heimdalljs "^0.2.6" -heimdalljs@^0.2.0, heimdalljs@^0.2.5, heimdalljs@^0.2.6: +heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heimdalljs@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA== @@ -2745,6 +2842,15 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +istextorbinary@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874" + integrity sha1-2+0qb1G+L3R1to+JRlgRFBt1iHQ= + dependencies: + binaryextensions "1 || 2" + editions "^1.1.1" + textextensions "1 || 2" + js-reporters@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" @@ -2844,6 +2950,13 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -2875,6 +2988,11 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -3308,7 +3426,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -3729,6 +3847,18 @@ path-posix@^1.0.0: resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" integrity sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8= +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -4154,7 +4284,7 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== @@ -4166,7 +4296,7 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -4181,7 +4311,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rsvp@^3.0.14, rsvp@^3.0.17: +rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== @@ -4583,7 +4713,7 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= -symlink-or-copy@^1.0.0, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0: +symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== @@ -4629,6 +4759,11 @@ terser@^3.16.1: source-map "~0.6.1" source-map-support "~0.5.9" +"textextensions@1 || 2": + version "2.4.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.4.0.tgz#6a143a985464384cc2cff11aea448cd5b018e72b" + integrity sha512-qftQXnX1DzpSV8EddtHIT0eDDEiBF8ywhFYR2lI9xrGtxqKN+CvLXhACeCIGbCpQfxxERbrkZEFb8cZcDKbVZA== + thread-loader@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-1.2.0.tgz#35dedb23cf294afbbce6c45c1339b950ed17e7a4" @@ -4891,6 +5026,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +username-sync@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.2.tgz#0a3697909fb7b5768d29e2921f573acfdd427592" + integrity sha512-ayNkOJdoNSGNDBE46Nkc+l6IXmeugbzahZLSMkwvgRWv5y5ZqNY2IrzcgmkR4z32sj1W3tM3TuTUMqkqBzO+RA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"