@fluidframework/routerlicious-urlresolver 2.0.0-rc.1.0.3 → 2.0.0-rc.2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +5 -2
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +8 -0
  4. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +2 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/nconf.cjs +13 -0
  12. package/dist/nconf.cjs.map +1 -0
  13. package/{lib/index.mjs → dist/nconf.d.cts} +3 -2
  14. package/dist/nconf.d.cts.map +1 -0
  15. package/dist/package.json +3 -0
  16. package/dist/tsdoc-metadata.json +1 -1
  17. package/dist/urlResolver.d.ts +1 -1
  18. package/dist/urlResolver.d.ts.map +1 -1
  19. package/dist/urlResolver.js +3 -4
  20. package/dist/urlResolver.js.map +1 -1
  21. package/lib/{index.d.mts → index.d.ts} +2 -2
  22. package/lib/index.d.ts.map +1 -0
  23. package/lib/index.js +6 -0
  24. package/lib/index.js.map +1 -0
  25. package/lib/nconf.cjs +13 -0
  26. package/lib/nconf.cjs.map +1 -0
  27. package/lib/nconf.d.cts +7 -0
  28. package/lib/nconf.d.cts.map +1 -0
  29. package/lib/test/routerlicious-urlResolver.spec.js +144 -0
  30. package/lib/test/routerlicious-urlResolver.spec.js.map +1 -0
  31. package/lib/test/types/validateRouterliciousUrlresolverPrevious.generated.js +8 -0
  32. package/lib/test/types/validateRouterliciousUrlresolverPrevious.generated.js.map +1 -0
  33. package/lib/{urlResolver.d.mts → urlResolver.d.ts} +2 -2
  34. package/lib/urlResolver.d.ts.map +1 -0
  35. package/lib/{urlResolver.mjs → urlResolver.js} +4 -5
  36. package/lib/urlResolver.js.map +1 -0
  37. package/package.json +31 -49
  38. package/src/index.ts +1 -1
  39. package/src/nconf.cts +12 -0
  40. package/src/urlResolver.ts +4 -5
  41. package/tsconfig.cjs.json +7 -0
  42. package/tsconfig.json +2 -5
  43. package/lib/index.d.mts.map +0 -1
  44. package/lib/index.mjs.map +0 -1
  45. package/lib/urlResolver.d.mts.map +0 -1
  46. package/lib/urlResolver.mjs.map +0 -1
  47. /package/lib/{routerlicious-urlresolver-alpha.d.mts → routerlicious-urlresolver-alpha.d.ts} +0 -0
  48. /package/lib/{routerlicious-urlresolver-beta.d.mts → routerlicious-urlresolver-beta.d.ts} +0 -0
  49. /package/lib/{routerlicious-urlresolver-public.d.mts → routerlicious-urlresolver-public.d.ts} +0 -0
  50. /package/lib/{routerlicious-urlresolver-untrimmed.d.mts → routerlicious-urlresolver-untrimmed.d.ts} +0 -0
@@ -4,7 +4,10 @@
4
4
  */
5
5
 
6
6
  module.exports = {
7
- extends: [require.resolve("@fluidframework/eslint-config-fluid/minimal"), "prettier"],
7
+ extends: [
8
+ require.resolve("@fluidframework/eslint-config-fluid/minimal-deprecated"),
9
+ "prettier",
10
+ ],
8
11
  parserOptions: {
9
12
  project: ["./tsconfig.json", "./src/test/tsconfig.json"],
10
13
  },
@@ -22,7 +25,7 @@ module.exports = {
22
25
  ],
23
26
 
24
27
  // This library is used in the browser, so we don't want dependencies on most node libraries.
25
- "import/no-nodejs-modules": ["error", { allow: ["url"] }],
28
+ "import/no-nodejs-modules": ["error"],
26
29
  },
27
30
  overrides: [
28
31
  {
@@ -5,7 +5,7 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const getFluidTestMochaConfig = require("@fluidframework/mocha-test-setup/mocharc-common");
8
+ const getFluidTestMochaConfig = require("@fluid-internal/mocha-test-setup/mocharc-common");
9
9
 
10
10
  const packageDir = __dirname;
11
11
  const config = getFluidTestMochaConfig(packageDir);
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @fluidframework/routerlicious-urlresolver
2
2
 
3
+ ## 2.0.0-rc.2.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Resolved URLs no longer use non-standard protocols ([#19840](https://github.com/microsoft/FluidFramework/issues/19840)) [9d3d185183](https://github.com/microsoft/FluidFramework/commits/9d3d1851830d953792a6dfad60dde6f1c59480de)
8
+
9
+ Previously, `IResolvedUrl.url` could use a non-standard protocol like `fluid://`, `fluid-odsp://`, or `fluid-test://`. These have been replaced with `https://` to permit standards-compliant URL parsing.
10
+
3
11
  ## 2.0.0-rc.1.0.0
4
12
 
5
13
  ### Minor Changes
@@ -1,4 +1,8 @@
1
1
  {
2
2
  "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
3
- "extends": "../../../common/build/build-common/api-extractor-base-esm.json"
3
+ "extends": "../../../common/build/build-common/api-extractor-base.cjs.primary.json",
4
+ // CJS is actually secondary; so, no report.
5
+ "apiReport": {
6
+ "enabled": false
7
+ }
4
8
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
3
- "extends": "../../../common/build/build-common/api-extractor-lint.json"
3
+ "extends": "../../../common/build/build-common/api-extractor-lint.esm.primary.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
3
- "extends": "../../../common/build/build-common/api-extractor-base.json"
3
+ "extends": "../../../common/build/build-common/api-extractor-base.esm.primary.json"
4
4
  }
package/dist/index.d.ts CHANGED
@@ -2,5 +2,5 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- export { IAlfredUser, IConfig, RouterliciousUrlResolver } from "./urlResolver";
5
+ export { IAlfredUser, IConfig, RouterliciousUrlResolver } from "./urlResolver.js";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -5,6 +5,6 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.RouterliciousUrlResolver = void 0;
8
- var urlResolver_1 = require("./urlResolver");
9
- Object.defineProperty(exports, "RouterliciousUrlResolver", { enumerable: true, get: function () { return urlResolver_1.RouterliciousUrlResolver; } });
8
+ var urlResolver_js_1 = require("./urlResolver.js");
9
+ Object.defineProperty(exports, "RouterliciousUrlResolver", { enumerable: true, get: function () { return urlResolver_js_1.RouterliciousUrlResolver; } });
10
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6CAA+E;AAAhD,uHAAA,wBAAwB,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { IAlfredUser, IConfig, RouterliciousUrlResolver } from \"./urlResolver\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,mDAAkF;AAAnD,0HAAA,wBAAwB,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { IAlfredUser, IConfig, RouterliciousUrlResolver } from \"./urlResolver.js\";\n"]}
package/dist/nconf.cjs ADDED
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Provider = void 0;
8
+ // This file serves as an intermediary module to export the 'Provider' named export from the 'nconf' module.
9
+ // It is written using ESM module syntax, making it compatible with both ESM and CJS module.
10
+ // This compatibility allows for flexible usage of the 'Provider' named export from the 'nconf' module across different module systems without modification.
11
+ const nconf_1 = require("nconf");
12
+ Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return nconf_1.Provider; } });
13
+ //# sourceMappingURL=nconf.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nconf.cjs","sourceRoot":"","sources":["../src/nconf.cts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,4GAA4G;AAC5G,4FAA4F;AAC5F,4JAA4J;AAE5J,iCAAiC;AAExB,yFAFA,gBAAQ,OAEA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// This file serves as an intermediary module to export the 'Provider' named export from the 'nconf' module.\n// It is written using ESM module syntax, making it compatible with both ESM and CJS module.\n// This compatibility allows for flexible usage of the 'Provider' named export from the 'nconf' module across different module systems without modification.\n\nimport { Provider } from \"nconf\";\n\nexport { Provider };\n"]}
@@ -2,5 +2,6 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- export { RouterliciousUrlResolver } from "./urlResolver.mjs";
6
- //# sourceMappingURL=index.mjs.map
5
+ import { Provider } from "nconf";
6
+ export { Provider };
7
+ //# sourceMappingURL=nconf.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nconf.d.cts","sourceRoot":"","sources":["../src/nconf.cts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.38.3"
8
+ "packageVersion": "7.42.3"
9
9
  }
10
10
  ]
11
11
  }
@@ -5,7 +5,7 @@
5
5
  import { IRequest } from "@fluidframework/core-interfaces";
6
6
  import { IResolvedUrl, IUrlResolver } from "@fluidframework/driver-definitions";
7
7
  import { IUser } from "@fluidframework/protocol-definitions";
8
- import { Provider } from "nconf";
8
+ import { Provider } from "./nconf.cjs";
9
9
  /**
10
10
  * @internal
11
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"urlResolver.d.ts","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,sCAAsC,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQjC;;GAEG;AACH,qBAAa,wBAAyB,YAAW,YAAY;IAE3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAGvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJP,MAAM,EACpB;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAC5D,SAAS,EACK,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAC/B,OAAO,EAAE,MAAM;IAGjC;;OAEG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IA8G7D,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgB5F;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,KAAK;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"urlResolver.d.ts","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,sCAAsC,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQvC;;GAEG;AACH,qBAAa,wBAAyB,YAAW,YAAY;IAE3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAGvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJP,MAAM,EACpB;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAC5D,SAAS,EACK,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAC/B,OAAO,EAAE,MAAM;IAGjC;;OAEG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IA8G7D,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgB5F;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,KAAK;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACnB"}
@@ -5,7 +5,6 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.RouterliciousUrlResolver = void 0;
8
- const url_1 = require("url");
9
8
  const core_utils_1 = require("@fluidframework/core-utils");
10
9
  const r11sServers = [
11
10
  "www.wu2-ppe.prague.office-int.com",
@@ -59,9 +58,9 @@ class RouterliciousUrlResolver {
59
58
  const isLocalHost = server === "localhost";
60
59
  const isInternalRequest = server.includes("gateway"); // e.g. gateway:3000 || fierce-dog-gateway:3000
61
60
  const serverSuffix = isLocalHost ? `${server}:3003` : server.substring(4);
62
- let fluidUrl = "fluid://" +
61
+ let fluidUrl = "https://" +
63
62
  `${this.config
64
- ? (0, url_1.parse)(this.config.provider.get("worker:serverUrl")).host
63
+ ? new URL(this.config.provider.get("worker:serverUrl")).host
65
64
  : serverSuffix}/` +
66
65
  `${encodeURIComponent(tenantId)}/` +
67
66
  `${encodeURIComponent(documentId)}`;
@@ -115,7 +114,7 @@ class RouterliciousUrlResolver {
115
114
  return resolved;
116
115
  }
117
116
  async getAbsoluteUrl(resolvedUrl, relativeUrl) {
118
- const parsedUrl = (0, url_1.parse)(resolvedUrl.url);
117
+ const parsedUrl = new URL(resolvedUrl.url);
119
118
  (0, core_utils_1.assert)(!!parsedUrl.pathname, 0x0b9 /* "PathName should exist" */);
120
119
  const [, tenantId, documentId] = parsedUrl.pathname.split("/");
121
120
  (0, core_utils_1.assert)(!!tenantId, 0x0ba /* "Tenant id should exist" */);
@@ -1 +1 @@
1
- {"version":3,"file":"urlResolver.js","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6BAA4B;AAC5B,2DAAoD;AAMpD,MAAM,WAAW,GAAG;IACnB,mCAAmC;IACnC,+BAA+B;IAC/B,8BAA8B;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAa,wBAAwB;IACpC,YACkB,MAEL,EACK,QAA+B,EAC/B,OAAe;QAJf,WAAM,GAAN,MAAM,CAEX;QACK,aAAQ,GAAR,QAAQ,CAAuB;QAC/B,YAAO,GAAP,OAAO,CAAQ;IAC9B,CAAC;IAEJ;;OAEG;IACI,KAAK,CAAC,OAAO,CAAC,OAAiB;QACrC,IAAI,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;QAE/B,gDAAgD;QAChD,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC/C,YAAY,GAAG,oBAAoB,OAAO,CAAC,GAAG,EAAE,CAAC;SACjD;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAE7C,sFAAsF;QACtF,IACC,CAAC,CACA,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC5B,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;YAClD,IAAI,CAAC,MAAM,CACX,EACA;YACD,OAAO,SAAS,CAAC;SACjB;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAgB,CAAC;QACrB,IAAI,UAAkB,CAAC;QACvB,IAAI,QAA8B,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,EAAE;YAChB,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAChC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;YACpC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;SAChC;aAAM,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;YAC5B,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;SACrB;aAAM;YACN,QAAQ,GAAG,OAAO,CAAC;YACnB,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;SACrB;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEpC,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW,CAAC;QAC3C,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,+CAA+C;QAErG,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAE1E,IAAI,QAAQ,GACX,UAAU;YACV,GACC,IAAI,CAAC,MAAM;gBACV,CAAC,CAAC,IAAA,WAAK,EAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI;gBAC1D,CAAC,CAAC,YACJ,GAAG;YACH,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG;YAClC,GAAG,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QAErC,gEAAgE;QAChE,IAAI,MAAM,CAAC,MAAM,EAAE;YAClB,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;YACnC,IAAI,YAAY,EAAE;gBACjB,QAAQ,IAAI,YAAY,CAAC;aACzB;SACD;QAED,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,eAAe,GAAG,EAAE,CAAC;QAEzB,oDAAoD;QACpD,IAAI,QAAQ,IAAI,iBAAiB,EAAE;YAClC,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC3D,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAC9C,eAAe,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,WAAW,kBAAkB,CACjF,QAAQ,CACR,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;SACtC;aAAM,IAAI,QAAQ,EAAE;YACpB,UAAU,GAAG,QAAQ;iBACnB,GAAG,CAAC,uBAAuB,CAAC;iBAC5B,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;YAC9C,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAC9C,eAAe,GAAG,GAAG,UAAU,WAAW,kBAAkB,CAC3D,QAAQ,CACR,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;SACtC;aAAM,IAAI,WAAW,EAAE;YACvB,UAAU,GAAG,uBAAuB,CAAC;YACrC,UAAU,GAAG,uBAAuB,CAAC;YACrC,eAAe,GAAG,gCAAgC,QAAQ,IAAI,UAAU,EAAE,CAAC;SAC3E;aAAM;YACN,UAAU,GAAG,qBAAqB,YAAY,EAAE,CAAC;YACjD,UAAU,GAAG,kBAAkB,YAAY,EAAE,CAAC;YAC9C,eAAe,GAAG,kBAAkB,YAAY,WAAW,QAAQ,IAAI,UAAU,EAAE,CAAC;SACpF;QAED,UAAU,IAAI,UAAU,QAAQ,EAAE,CAAC;QACnC,UAAU,IAAI,EAAE,CAAC;QACjB,eAAe,IAAI,EAAE,CAAC;QAEtB,MAAM,QAAQ,GAAiB;YAC9B,SAAS,EAAE;gBACV,UAAU;gBACV,eAAe;gBACf,UAAU;aACV;YACD,EAAE,EAAE,UAAU;YACd,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE;YACtB,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,QAAQ;SACb,CAAC;QACF,OAAO,QAAQ,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,WAAyB,EAAE,WAAmB;QACzE,MAAM,SAAS,GAAG,IAAA,WAAK,EAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,IAAA,mBAAM,EAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAA,mBAAM,EAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACzD,IAAA,mBAAM,EAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAE7D,IAAI,GAAG,GAAG,WAAW,CAAC;QACtB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACxB,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SACpB;QAED,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,kBAAkB,CAAC,QAAQ,CAAC,IAAI,kBAAkB,CAC3E,UAAU,CACV,IAAI,GAAG,EAAE,CAAC;IACZ,CAAC;CACD;AA1ID,4DA0IC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { parse } from \"url\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IResolvedUrl, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport { IUser } from \"@fluidframework/protocol-definitions\";\nimport { Provider } from \"nconf\";\n\nconst r11sServers = [\n\t\"www.wu2-ppe.prague.office-int.com\",\n\t\"www.wu2.prague.office-int.com\",\n\t\"www.eu.prague.office-int.com\",\n];\n\n/**\n * @internal\n */\nexport class RouterliciousUrlResolver implements IUrlResolver {\n\tconstructor(\n\t\tprivate readonly config:\n\t\t\t| { provider: Provider; tenantId: string; documentId: string }\n\t\t\t| undefined,\n\t\tprivate readonly getToken: () => Promise<string>,\n\t\tprivate readonly hostUrl: string,\n\t) {}\n\n\t/**\n\t * Handles a request and returns the relevant endpoints for the environment\n\t */\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {\n\t\tlet requestedUrl = request.url;\n\n\t\t// If we know the original hostname, reinsert it\n\t\tif (this.config && request.url.startsWith(\"/\")) {\n\t\t\trequestedUrl = `http://dummy:3000${request.url}`;\n\t\t}\n\n\t\tconst reqUrl = new URL(requestedUrl);\n\t\tconst server = reqUrl.hostname.toLowerCase();\n\n\t\t// If we don't have a valid server or a prescriptive config, we cannot resolve the URL\n\t\tif (\n\t\t\t!(\n\t\t\t\tr11sServers.includes(server) ||\n\t\t\t\t(server === \"localhost\" && reqUrl.port === \"3000\") ||\n\t\t\t\tthis.config\n\t\t\t)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst path = reqUrl.pathname.split(\"/\");\n\t\tlet tenantId: string;\n\t\tlet documentId: string;\n\t\tlet provider: Provider | undefined;\n\t\tif (this.config) {\n\t\t\ttenantId = this.config.tenantId;\n\t\t\tdocumentId = this.config.documentId;\n\t\t\tprovider = this.config.provider;\n\t\t} else if (path.length >= 4) {\n\t\t\ttenantId = path[2];\n\t\t\tdocumentId = path[3];\n\t\t} else {\n\t\t\ttenantId = \"fluid\";\n\t\t\tdocumentId = path[2];\n\t\t}\n\n\t\tconst token = await this.getToken();\n\n\t\tconst isLocalHost = server === \"localhost\";\n\t\tconst isInternalRequest = server.includes(\"gateway\"); // e.g. gateway:3000 || fierce-dog-gateway:3000\n\n\t\tconst serverSuffix = isLocalHost ? `${server}:3003` : server.substring(4);\n\n\t\tlet fluidUrl =\n\t\t\t\"fluid://\" +\n\t\t\t`${\n\t\t\t\tthis.config\n\t\t\t\t\t? parse(this.config.provider.get(\"worker:serverUrl\")).host\n\t\t\t\t\t: serverSuffix\n\t\t\t}/` +\n\t\t\t`${encodeURIComponent(tenantId)}/` +\n\t\t\t`${encodeURIComponent(documentId)}`;\n\n\t\t// In case of any additional parameters add them back to the url\n\t\tif (reqUrl.search) {\n\t\t\tconst searchParams = reqUrl.search;\n\t\t\tif (searchParams) {\n\t\t\t\tfluidUrl += searchParams;\n\t\t\t}\n\t\t}\n\n\t\tlet storageUrl = \"\";\n\t\tlet ordererUrl = \"\";\n\t\tlet deltaStorageUrl = \"\";\n\n\t\t// There is no provider when using debugging tooling\n\t\tif (provider && isInternalRequest) {\n\t\t\tstorageUrl = provider.get(\"worker:internalBlobStorageUrl\");\n\t\t\tordererUrl = provider.get(\"worker:alfredUrl\");\n\t\t\tdeltaStorageUrl = `${provider.get(\"worker:alfredUrl\")}/deltas/${encodeURIComponent(\n\t\t\t\ttenantId,\n\t\t\t)}/${encodeURIComponent(documentId)}`;\n\t\t} else if (provider) {\n\t\t\tstorageUrl = provider\n\t\t\t\t.get(\"worker:blobStorageUrl\")\n\t\t\t\t.replace(\"historian:3000\", \"localhost:3001\");\n\t\t\tordererUrl = provider.get(\"worker:serverUrl\");\n\t\t\tdeltaStorageUrl = `${ordererUrl}/deltas/${encodeURIComponent(\n\t\t\t\ttenantId,\n\t\t\t)}/${encodeURIComponent(documentId)}`;\n\t\t} else if (isLocalHost) {\n\t\t\tstorageUrl = `http://localhost:3001`;\n\t\t\tordererUrl = `http://localhost:3003`;\n\t\t\tdeltaStorageUrl = `http://localhost:3003/deltas/${tenantId}/${documentId}`;\n\t\t} else {\n\t\t\tstorageUrl = `https://historian.${serverSuffix}`;\n\t\t\tordererUrl = `https://alfred.${serverSuffix}`;\n\t\t\tdeltaStorageUrl = `https://alfred.${serverSuffix}/deltas/${tenantId}/${documentId}`;\n\t\t}\n\n\t\tstorageUrl += `/repos/${tenantId}`;\n\t\tordererUrl += ``;\n\t\tdeltaStorageUrl += ``;\n\n\t\tconst resolved: IResolvedUrl = {\n\t\t\tendpoints: {\n\t\t\t\tstorageUrl,\n\t\t\t\tdeltaStorageUrl,\n\t\t\t\tordererUrl,\n\t\t\t},\n\t\t\tid: documentId,\n\t\t\ttokens: { jwt: token },\n\t\t\ttype: \"fluid\",\n\t\t\turl: fluidUrl,\n\t\t};\n\t\treturn resolved;\n\t}\n\n\tpublic async getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string> {\n\t\tconst parsedUrl = parse(resolvedUrl.url);\n\t\tassert(!!parsedUrl.pathname, 0x0b9 /* \"PathName should exist\" */);\n\t\tconst [, tenantId, documentId] = parsedUrl.pathname.split(\"/\");\n\t\tassert(!!tenantId, 0x0ba /* \"Tenant id should exist\" */);\n\t\tassert(!!documentId, 0x0bb /* \"Document id should exist\" */);\n\n\t\tlet url = relativeUrl;\n\t\tif (url.startsWith(\"/\")) {\n\t\t\turl = url.substr(1);\n\t\t}\n\n\t\treturn `${this.hostUrl}/${encodeURIComponent(tenantId)}/${encodeURIComponent(\n\t\t\tdocumentId,\n\t\t)}/${url}`;\n\t}\n}\n\n/**\n * @internal\n */\nexport interface IAlfredUser extends IUser {\n\tdisplayName: string;\n\tname: string;\n}\n\n/**\n * @internal\n */\nexport interface IConfig {\n\tserverUrl: string;\n\tblobStorageUrl: string;\n\ttenantId: string;\n\tdocumentId: string;\n}\n"]}
1
+ {"version":3,"file":"urlResolver.js","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IResolvedUrl, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport { IUser } from \"@fluidframework/protocol-definitions\";\nimport { Provider } from \"./nconf.cjs\";\n\nconst r11sServers = [\n\t\"www.wu2-ppe.prague.office-int.com\",\n\t\"www.wu2.prague.office-int.com\",\n\t\"www.eu.prague.office-int.com\",\n];\n\n/**\n * @internal\n */\nexport class RouterliciousUrlResolver implements IUrlResolver {\n\tconstructor(\n\t\tprivate readonly config:\n\t\t\t| { provider: Provider; tenantId: string; documentId: string }\n\t\t\t| undefined,\n\t\tprivate readonly getToken: () => Promise<string>,\n\t\tprivate readonly hostUrl: string,\n\t) {}\n\n\t/**\n\t * Handles a request and returns the relevant endpoints for the environment\n\t */\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {\n\t\tlet requestedUrl = request.url;\n\n\t\t// If we know the original hostname, reinsert it\n\t\tif (this.config && request.url.startsWith(\"/\")) {\n\t\t\trequestedUrl = `http://dummy:3000${request.url}`;\n\t\t}\n\n\t\tconst reqUrl = new URL(requestedUrl);\n\t\tconst server = reqUrl.hostname.toLowerCase();\n\n\t\t// If we don't have a valid server or a prescriptive config, we cannot resolve the URL\n\t\tif (\n\t\t\t!(\n\t\t\t\tr11sServers.includes(server) ||\n\t\t\t\t(server === \"localhost\" && reqUrl.port === \"3000\") ||\n\t\t\t\tthis.config\n\t\t\t)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst path = reqUrl.pathname.split(\"/\");\n\t\tlet tenantId: string;\n\t\tlet documentId: string;\n\t\tlet provider: Provider | undefined;\n\t\tif (this.config) {\n\t\t\ttenantId = this.config.tenantId;\n\t\t\tdocumentId = this.config.documentId;\n\t\t\tprovider = this.config.provider;\n\t\t} else if (path.length >= 4) {\n\t\t\ttenantId = path[2];\n\t\t\tdocumentId = path[3];\n\t\t} else {\n\t\t\ttenantId = \"fluid\";\n\t\t\tdocumentId = path[2];\n\t\t}\n\n\t\tconst token = await this.getToken();\n\n\t\tconst isLocalHost = server === \"localhost\";\n\t\tconst isInternalRequest = server.includes(\"gateway\"); // e.g. gateway:3000 || fierce-dog-gateway:3000\n\n\t\tconst serverSuffix = isLocalHost ? `${server}:3003` : server.substring(4);\n\n\t\tlet fluidUrl =\n\t\t\t\"https://\" +\n\t\t\t`${\n\t\t\t\tthis.config\n\t\t\t\t\t? new URL(this.config.provider.get(\"worker:serverUrl\")).host\n\t\t\t\t\t: serverSuffix\n\t\t\t}/` +\n\t\t\t`${encodeURIComponent(tenantId)}/` +\n\t\t\t`${encodeURIComponent(documentId)}`;\n\n\t\t// In case of any additional parameters add them back to the url\n\t\tif (reqUrl.search) {\n\t\t\tconst searchParams = reqUrl.search;\n\t\t\tif (searchParams) {\n\t\t\t\tfluidUrl += searchParams;\n\t\t\t}\n\t\t}\n\n\t\tlet storageUrl = \"\";\n\t\tlet ordererUrl = \"\";\n\t\tlet deltaStorageUrl = \"\";\n\n\t\t// There is no provider when using debugging tooling\n\t\tif (provider && isInternalRequest) {\n\t\t\tstorageUrl = provider.get(\"worker:internalBlobStorageUrl\");\n\t\t\tordererUrl = provider.get(\"worker:alfredUrl\");\n\t\t\tdeltaStorageUrl = `${provider.get(\"worker:alfredUrl\")}/deltas/${encodeURIComponent(\n\t\t\t\ttenantId,\n\t\t\t)}/${encodeURIComponent(documentId)}`;\n\t\t} else if (provider) {\n\t\t\tstorageUrl = provider\n\t\t\t\t.get(\"worker:blobStorageUrl\")\n\t\t\t\t.replace(\"historian:3000\", \"localhost:3001\");\n\t\t\tordererUrl = provider.get(\"worker:serverUrl\");\n\t\t\tdeltaStorageUrl = `${ordererUrl}/deltas/${encodeURIComponent(\n\t\t\t\ttenantId,\n\t\t\t)}/${encodeURIComponent(documentId)}`;\n\t\t} else if (isLocalHost) {\n\t\t\tstorageUrl = `http://localhost:3001`;\n\t\t\tordererUrl = `http://localhost:3003`;\n\t\t\tdeltaStorageUrl = `http://localhost:3003/deltas/${tenantId}/${documentId}`;\n\t\t} else {\n\t\t\tstorageUrl = `https://historian.${serverSuffix}`;\n\t\t\tordererUrl = `https://alfred.${serverSuffix}`;\n\t\t\tdeltaStorageUrl = `https://alfred.${serverSuffix}/deltas/${tenantId}/${documentId}`;\n\t\t}\n\n\t\tstorageUrl += `/repos/${tenantId}`;\n\t\tordererUrl += ``;\n\t\tdeltaStorageUrl += ``;\n\n\t\tconst resolved: IResolvedUrl = {\n\t\t\tendpoints: {\n\t\t\t\tstorageUrl,\n\t\t\t\tdeltaStorageUrl,\n\t\t\t\tordererUrl,\n\t\t\t},\n\t\t\tid: documentId,\n\t\t\ttokens: { jwt: token },\n\t\t\ttype: \"fluid\",\n\t\t\turl: fluidUrl,\n\t\t};\n\t\treturn resolved;\n\t}\n\n\tpublic async getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string> {\n\t\tconst parsedUrl = new URL(resolvedUrl.url);\n\t\tassert(!!parsedUrl.pathname, 0x0b9 /* \"PathName should exist\" */);\n\t\tconst [, tenantId, documentId] = parsedUrl.pathname.split(\"/\");\n\t\tassert(!!tenantId, 0x0ba /* \"Tenant id should exist\" */);\n\t\tassert(!!documentId, 0x0bb /* \"Document id should exist\" */);\n\n\t\tlet url = relativeUrl;\n\t\tif (url.startsWith(\"/\")) {\n\t\t\turl = url.substr(1);\n\t\t}\n\n\t\treturn `${this.hostUrl}/${encodeURIComponent(tenantId)}/${encodeURIComponent(\n\t\t\tdocumentId,\n\t\t)}/${url}`;\n\t}\n}\n\n/**\n * @internal\n */\nexport interface IAlfredUser extends IUser {\n\tdisplayName: string;\n\tname: string;\n}\n\n/**\n * @internal\n */\nexport interface IConfig {\n\tserverUrl: string;\n\tblobStorageUrl: string;\n\ttenantId: string;\n\tdocumentId: string;\n}\n"]}
@@ -2,5 +2,5 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- export { IAlfredUser, IConfig, RouterliciousUrlResolver } from "./urlResolver.mjs";
6
- //# sourceMappingURL=index.d.mts.map
5
+ export { IAlfredUser, IConfig, RouterliciousUrlResolver } from "./urlResolver.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ export { RouterliciousUrlResolver } from "./urlResolver.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAwB,wBAAwB,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { IAlfredUser, IConfig, RouterliciousUrlResolver } from \"./urlResolver.js\";\n"]}
package/lib/nconf.cjs ADDED
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Provider = void 0;
8
+ // This file serves as an intermediary module to export the 'Provider' named export from the 'nconf' module.
9
+ // It is written using ESM module syntax, making it compatible with both ESM and CJS module.
10
+ // This compatibility allows for flexible usage of the 'Provider' named export from the 'nconf' module across different module systems without modification.
11
+ const nconf_1 = require("nconf");
12
+ Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return nconf_1.Provider; } });
13
+ //# sourceMappingURL=nconf.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nconf.cjs","sourceRoot":"","sources":["../src/nconf.cts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,4GAA4G;AAC5G,4FAA4F;AAC5F,4JAA4J;AAE5J,iCAAiC;AAExB,yFAFA,gBAAQ,OAEA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// This file serves as an intermediary module to export the 'Provider' named export from the 'nconf' module.\n// It is written using ESM module syntax, making it compatible with both ESM and CJS module.\n// This compatibility allows for flexible usage of the 'Provider' named export from the 'nconf' module across different module systems without modification.\n\nimport { Provider } from \"nconf\";\n\nexport { Provider };\n"]}
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { Provider } from "nconf";
6
+ export { Provider };
7
+ //# sourceMappingURL=nconf.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nconf.d.cts","sourceRoot":"","sources":["../src/nconf.cts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,144 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "assert";
6
+ import { Provider } from "../nconf.cjs";
7
+ import { RouterliciousUrlResolver } from "../urlResolver.js";
8
+ describe("Routerlicious Url Resolver", () => {
9
+ const token = "dummy";
10
+ const hostUrl = "https://dummy.com";
11
+ it("Should resolve the Routerlicious urls correctly", async () => {
12
+ const urlResolver = new RouterliciousUrlResolver(undefined, async () => Promise.resolve(token), hostUrl);
13
+ const url = "https://www.wu2.prague.office-int.com/loader/fluid/thinkable-list?chaincode=@fluid-example/shared-text@0.11.14146";
14
+ const resolved = (await urlResolver.resolve({ url }));
15
+ assert.equal(resolved.tokens.jwt, token, "Token does not match");
16
+ assert.equal(resolved.endpoints.storageUrl, "https://historian.wu2.prague.office-int.com/repos/fluid", "Storage url does not match");
17
+ assert.equal(resolved.endpoints.deltaStorageUrl, "https://alfred.wu2.prague.office-int.com/deltas/fluid/thinkable-list", "Delta storage url does not match");
18
+ assert.equal(resolved.endpoints.ordererUrl, "https://alfred.wu2.prague.office-int.com", "Orderer url does not match");
19
+ assert.equal(resolved.url, "https://wu2.prague.office-int.com/fluid/thinkable-list?chaincode=@fluid-example/shared-text@0.11.14146", "FluidUrl does not match");
20
+ });
21
+ it("Should resolve the localhost urls correctly", async () => {
22
+ const urlResolver = new RouterliciousUrlResolver(undefined, async () => Promise.resolve(token), hostUrl);
23
+ const url = "http://localhost:3000/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0";
24
+ const resolved = (await urlResolver.resolve({ url }));
25
+ assert.equal(resolved.tokens.jwt, token, "Token does not match");
26
+ assert.equal(resolved.endpoints.storageUrl, "http://localhost:3001/repos/fluid", "Storage url does not match");
27
+ assert.equal(resolved.endpoints.deltaStorageUrl, "http://localhost:3003/deltas/fluid/damp-competition", "Delta storage url does not match");
28
+ assert.equal(resolved.endpoints.ordererUrl, "http://localhost:3003", "Orderer url does not match");
29
+ assert.equal(resolved.url, "https://localhost:3003/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0", "FluidUrl does not match");
30
+ });
31
+ it("Should handle local External request", async () => {
32
+ const request = {
33
+ url: "/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0",
34
+ };
35
+ const provider = new Provider({})
36
+ .defaults({
37
+ a: "hell",
38
+ worker: {
39
+ serverUrl: "http://localhost:3003",
40
+ alfredUrl: "http://alfred:3000",
41
+ blobStorageUrl: "http://historian:3000",
42
+ internalBlobStorageUrl: "http://historian:3000",
43
+ },
44
+ })
45
+ .use("memory");
46
+ const config = {
47
+ provider,
48
+ tenantId: "fluid",
49
+ documentId: "damp-competition",
50
+ };
51
+ const urlResolver = new RouterliciousUrlResolver(config, async () => Promise.resolve(token), hostUrl);
52
+ const { endpoints, url } = (await urlResolver.resolve(request));
53
+ assert.equal(endpoints.storageUrl, "http://localhost:3001/repos/fluid", "Improperly Formed storageUrl");
54
+ assert.equal(endpoints.deltaStorageUrl, "http://localhost:3003/deltas/fluid/damp-competition", "Improperly Formed deltaStorageUrl");
55
+ assert.equal(endpoints.ordererUrl, "http://localhost:3003", "Improperly Formed OrdererUrl");
56
+ assert.equal(url, "https://localhost:3003/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0", "Improperly formed FluidURL");
57
+ });
58
+ it("Should handle local Internal request", async () => {
59
+ const request = {
60
+ url: "http://gateway:3000/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0",
61
+ };
62
+ const provider = new Provider({})
63
+ .defaults({
64
+ worker: {
65
+ serverUrl: "http://localhost:3003",
66
+ alfredUrl: "http://alfred:3000",
67
+ blobStorageUrl: "http://historian:3000",
68
+ internalBlobStorageUrl: "http://historian:3000",
69
+ },
70
+ })
71
+ .use("memory");
72
+ const config = {
73
+ provider,
74
+ tenantId: "fluid",
75
+ documentId: "damp-competition",
76
+ };
77
+ const urlResolver = new RouterliciousUrlResolver(config, async () => Promise.resolve(token), hostUrl);
78
+ const { endpoints, url } = (await urlResolver.resolve(request));
79
+ assert.equal(endpoints.storageUrl, "http://historian:3000/repos/fluid", "Improperly Formed storageUrl");
80
+ assert.equal(endpoints.deltaStorageUrl, "http://alfred:3000/deltas/fluid/damp-competition", "Improperly Formed deltaStorageUrl");
81
+ assert.equal(endpoints.ordererUrl, "http://alfred:3000", "Improperly Formed OrdererUrl");
82
+ assert.equal(url, "https://localhost:3003/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0", "Improperly formed FluidURL");
83
+ });
84
+ it("Should handle Deployed Internal request", async () => {
85
+ const request = {
86
+ url: "http://angry-dog-gateway:3000/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0",
87
+ };
88
+ const provider = new Provider({})
89
+ .defaults({
90
+ worker: {
91
+ serverUrl: "http://localhost:3003",
92
+ alfredUrl: "http://wiggly-wombat-alfred:3000",
93
+ blobStorageUrl: "http://historian:3000",
94
+ internalBlobStorageUrl: "http://smelly-wolf-historian:3000",
95
+ },
96
+ })
97
+ .use("memory");
98
+ const config = {
99
+ provider,
100
+ tenantId: "fluid",
101
+ documentId: "damp-competition",
102
+ };
103
+ const urlResolver = new RouterliciousUrlResolver(config, async () => Promise.resolve(token), hostUrl);
104
+ const { endpoints, url } = (await urlResolver.resolve(request));
105
+ assert.equal(endpoints.storageUrl, "http://smelly-wolf-historian:3000/repos/fluid", "Improperly Formed storageUrl");
106
+ assert.equal(endpoints.deltaStorageUrl, "http://wiggly-wombat-alfred:3000/deltas/fluid/damp-competition", "Improperly Formed deltaStorageUrl");
107
+ assert.equal(endpoints.ordererUrl, "http://wiggly-wombat-alfred:3000", "Improperly Formed OrdererUrl");
108
+ assert.equal(url, "https://localhost:3003/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0", "Improperly formed FluidURL");
109
+ });
110
+ it("Should handle deployed External request", async () => {
111
+ const request = {
112
+ url: "/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0",
113
+ };
114
+ const provider = new Provider({})
115
+ .defaults({
116
+ worker: {
117
+ serverUrl: "https://alfred.wu2-ppe.prague.office-int.com",
118
+ alfredUrl: "http://wiggly-wombat-alfred",
119
+ blobStorageUrl: "https://historian.wu2-ppe.prague.office-int.com",
120
+ internalBlobStorageUrl: "http://smelly-wolf-historian",
121
+ },
122
+ })
123
+ .use("memory");
124
+ const config = {
125
+ provider,
126
+ tenantId: "fluid",
127
+ documentId: "damp-competition",
128
+ };
129
+ const urlResolver = new RouterliciousUrlResolver(config, async () => Promise.resolve(token), hostUrl);
130
+ const { endpoints, url } = (await urlResolver.resolve(request));
131
+ assert.equal(endpoints.storageUrl, "https://historian.wu2-ppe.prague.office-int.com/repos/fluid", "Storage url does not match");
132
+ assert.equal(endpoints.deltaStorageUrl, "https://alfred.wu2-ppe.prague.office-int.com/deltas/fluid/damp-competition", "Delta storage url does not match");
133
+ assert.equal(endpoints.ordererUrl, "https://alfred.wu2-ppe.prague.office-int.com", "Orderer url does not match");
134
+ assert.equal(url, "https://alfred.wu2-ppe.prague.office-int.com/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0", "FluidUrl does not match");
135
+ });
136
+ it("Should return the absolute url when requested", async () => {
137
+ const urlResolver = new RouterliciousUrlResolver(undefined, async () => Promise.resolve(token), hostUrl);
138
+ const url = "http://localhost:3000/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0";
139
+ const resolved = (await urlResolver.resolve({ url }));
140
+ const absoluteUrl = await urlResolver.getAbsoluteUrl(resolved, "relative");
141
+ assert.strictEqual(absoluteUrl, `${hostUrl}/fluid/damp-competition/relative`, "Absolute url should match");
142
+ });
143
+ });
144
+ //# sourceMappingURL=routerlicious-urlResolver.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routerlicious-urlResolver.spec.js","sourceRoot":"","sources":["../../src/test/routerlicious-urlResolver.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { IResolvedUrl } from \"@fluidframework/driver-definitions\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { Provider } from \"../nconf.cjs\";\nimport { RouterliciousUrlResolver } from \"../urlResolver.js\";\n\ndescribe(\"Routerlicious Url Resolver\", () => {\n\tconst token = \"dummy\";\n\tconst hostUrl = \"https://dummy.com\";\n\tit(\"Should resolve the Routerlicious urls correctly\", async () => {\n\t\tconst urlResolver = new RouterliciousUrlResolver(\n\t\t\tundefined,\n\t\t\tasync () => Promise.resolve(token),\n\t\t\thostUrl,\n\t\t);\n\t\tconst url: string =\n\t\t\t\"https://www.wu2.prague.office-int.com/loader/fluid/thinkable-list?chaincode=@fluid-example/shared-text@0.11.14146\";\n\t\tconst resolved = (await urlResolver.resolve({ url })) as IResolvedUrl;\n\t\tassert.equal(resolved.tokens.jwt, token, \"Token does not match\");\n\t\tassert.equal(\n\t\t\tresolved.endpoints.storageUrl,\n\t\t\t\"https://historian.wu2.prague.office-int.com/repos/fluid\",\n\t\t\t\"Storage url does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tresolved.endpoints.deltaStorageUrl,\n\t\t\t\"https://alfred.wu2.prague.office-int.com/deltas/fluid/thinkable-list\",\n\t\t\t\"Delta storage url does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tresolved.endpoints.ordererUrl,\n\t\t\t\"https://alfred.wu2.prague.office-int.com\",\n\t\t\t\"Orderer url does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tresolved.url,\n\t\t\t\"https://wu2.prague.office-int.com/fluid/thinkable-list?chaincode=@fluid-example/shared-text@0.11.14146\",\n\t\t\t\"FluidUrl does not match\",\n\t\t);\n\t});\n\n\tit(\"Should resolve the localhost urls correctly\", async () => {\n\t\tconst urlResolver = new RouterliciousUrlResolver(\n\t\t\tundefined,\n\t\t\tasync () => Promise.resolve(token),\n\t\t\thostUrl,\n\t\t);\n\t\tconst url: string =\n\t\t\t\"http://localhost:3000/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\";\n\t\tconst resolved = (await urlResolver.resolve({ url })) as IResolvedUrl;\n\t\tassert.equal(resolved.tokens.jwt, token, \"Token does not match\");\n\t\tassert.equal(\n\t\t\tresolved.endpoints.storageUrl,\n\t\t\t\"http://localhost:3001/repos/fluid\",\n\t\t\t\"Storage url does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tresolved.endpoints.deltaStorageUrl,\n\t\t\t\"http://localhost:3003/deltas/fluid/damp-competition\",\n\t\t\t\"Delta storage url does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tresolved.endpoints.ordererUrl,\n\t\t\t\"http://localhost:3003\",\n\t\t\t\"Orderer url does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tresolved.url,\n\t\t\t\"https://localhost:3003/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\",\n\t\t\t\"FluidUrl does not match\",\n\t\t);\n\t});\n\n\tit(\"Should handle local External request\", async () => {\n\t\tconst request: IRequest = {\n\t\t\turl: \"/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\",\n\t\t};\n\n\t\tconst provider = new Provider({})\n\t\t\t.defaults({\n\t\t\t\ta: \"hell\",\n\t\t\t\tworker: {\n\t\t\t\t\tserverUrl: \"http://localhost:3003\",\n\t\t\t\t\talfredUrl: \"http://alfred:3000\",\n\t\t\t\t\tblobStorageUrl: \"http://historian:3000\",\n\t\t\t\t\tinternalBlobStorageUrl: \"http://historian:3000\",\n\t\t\t\t},\n\t\t\t})\n\t\t\t.use(\"memory\");\n\n\t\tconst config = {\n\t\t\tprovider,\n\t\t\ttenantId: \"fluid\",\n\t\t\tdocumentId: \"damp-competition\",\n\t\t};\n\t\tconst urlResolver = new RouterliciousUrlResolver(\n\t\t\tconfig,\n\t\t\tasync () => Promise.resolve(token),\n\t\t\thostUrl,\n\t\t);\n\n\t\tconst { endpoints, url } = (await urlResolver.resolve(request)) as IResolvedUrl;\n\n\t\tassert.equal(\n\t\t\tendpoints.storageUrl,\n\t\t\t\"http://localhost:3001/repos/fluid\",\n\t\t\t\"Improperly Formed storageUrl\",\n\t\t);\n\t\tassert.equal(\n\t\t\tendpoints.deltaStorageUrl,\n\t\t\t\"http://localhost:3003/deltas/fluid/damp-competition\",\n\t\t\t\"Improperly Formed deltaStorageUrl\",\n\t\t);\n\t\tassert.equal(endpoints.ordererUrl, \"http://localhost:3003\", \"Improperly Formed OrdererUrl\");\n\t\tassert.equal(\n\t\t\turl,\n\t\t\t\"https://localhost:3003/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\",\n\t\t\t\"Improperly formed FluidURL\",\n\t\t);\n\t});\n\n\tit(\"Should handle local Internal request\", async () => {\n\t\tconst request: IRequest = {\n\t\t\turl: \"http://gateway:3000/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\",\n\t\t};\n\n\t\tconst provider = new Provider({})\n\t\t\t.defaults({\n\t\t\t\tworker: {\n\t\t\t\t\tserverUrl: \"http://localhost:3003\",\n\t\t\t\t\talfredUrl: \"http://alfred:3000\",\n\t\t\t\t\tblobStorageUrl: \"http://historian:3000\",\n\t\t\t\t\tinternalBlobStorageUrl: \"http://historian:3000\",\n\t\t\t\t},\n\t\t\t})\n\t\t\t.use(\"memory\");\n\n\t\tconst config = {\n\t\t\tprovider,\n\t\t\ttenantId: \"fluid\",\n\t\t\tdocumentId: \"damp-competition\",\n\t\t};\n\n\t\tconst urlResolver = new RouterliciousUrlResolver(\n\t\t\tconfig,\n\t\t\tasync () => Promise.resolve(token),\n\t\t\thostUrl,\n\t\t);\n\t\tconst { endpoints, url } = (await urlResolver.resolve(request)) as IResolvedUrl;\n\n\t\tassert.equal(\n\t\t\tendpoints.storageUrl,\n\t\t\t\"http://historian:3000/repos/fluid\",\n\t\t\t\"Improperly Formed storageUrl\",\n\t\t);\n\t\tassert.equal(\n\t\t\tendpoints.deltaStorageUrl,\n\t\t\t\"http://alfred:3000/deltas/fluid/damp-competition\",\n\t\t\t\"Improperly Formed deltaStorageUrl\",\n\t\t);\n\t\tassert.equal(endpoints.ordererUrl, \"http://alfred:3000\", \"Improperly Formed OrdererUrl\");\n\t\tassert.equal(\n\t\t\turl,\n\t\t\t\"https://localhost:3003/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\",\n\t\t\t\"Improperly formed FluidURL\",\n\t\t);\n\t});\n\n\tit(\"Should handle Deployed Internal request\", async () => {\n\t\tconst request: IRequest = {\n\t\t\turl: \"http://angry-dog-gateway:3000/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\",\n\t\t};\n\t\tconst provider = new Provider({})\n\t\t\t.defaults({\n\t\t\t\tworker: {\n\t\t\t\t\tserverUrl: \"http://localhost:3003\",\n\t\t\t\t\talfredUrl: \"http://wiggly-wombat-alfred:3000\",\n\t\t\t\t\tblobStorageUrl: \"http://historian:3000\",\n\t\t\t\t\tinternalBlobStorageUrl: \"http://smelly-wolf-historian:3000\",\n\t\t\t\t},\n\t\t\t})\n\t\t\t.use(\"memory\");\n\n\t\tconst config = {\n\t\t\tprovider,\n\t\t\ttenantId: \"fluid\",\n\t\t\tdocumentId: \"damp-competition\",\n\t\t};\n\n\t\tconst urlResolver = new RouterliciousUrlResolver(\n\t\t\tconfig,\n\t\t\tasync () => Promise.resolve(token),\n\t\t\thostUrl,\n\t\t);\n\t\tconst { endpoints, url } = (await urlResolver.resolve(request)) as IResolvedUrl;\n\n\t\tassert.equal(\n\t\t\tendpoints.storageUrl,\n\t\t\t\"http://smelly-wolf-historian:3000/repos/fluid\",\n\t\t\t\"Improperly Formed storageUrl\",\n\t\t);\n\t\tassert.equal(\n\t\t\tendpoints.deltaStorageUrl,\n\t\t\t\"http://wiggly-wombat-alfred:3000/deltas/fluid/damp-competition\",\n\t\t\t\"Improperly Formed deltaStorageUrl\",\n\t\t);\n\t\tassert.equal(\n\t\t\tendpoints.ordererUrl,\n\t\t\t\"http://wiggly-wombat-alfred:3000\",\n\t\t\t\"Improperly Formed OrdererUrl\",\n\t\t);\n\t\tassert.equal(\n\t\t\turl,\n\t\t\t\"https://localhost:3003/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\",\n\t\t\t\"Improperly formed FluidURL\",\n\t\t);\n\t});\n\n\tit(\"Should handle deployed External request\", async () => {\n\t\tconst request: IRequest = {\n\t\t\turl: \"/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\",\n\t\t};\n\n\t\tconst provider = new Provider({})\n\t\t\t.defaults({\n\t\t\t\tworker: {\n\t\t\t\t\tserverUrl: \"https://alfred.wu2-ppe.prague.office-int.com\",\n\t\t\t\t\talfredUrl: \"http://wiggly-wombat-alfred\",\n\t\t\t\t\tblobStorageUrl: \"https://historian.wu2-ppe.prague.office-int.com\",\n\t\t\t\t\tinternalBlobStorageUrl: \"http://smelly-wolf-historian\",\n\t\t\t\t},\n\t\t\t})\n\t\t\t.use(\"memory\");\n\n\t\tconst config = {\n\t\t\tprovider,\n\t\t\ttenantId: \"fluid\",\n\t\t\tdocumentId: \"damp-competition\",\n\t\t};\n\n\t\tconst urlResolver = new RouterliciousUrlResolver(\n\t\t\tconfig,\n\t\t\tasync () => Promise.resolve(token),\n\t\t\thostUrl,\n\t\t);\n\t\tconst { endpoints, url } = (await urlResolver.resolve(request)) as IResolvedUrl;\n\n\t\tassert.equal(\n\t\t\tendpoints.storageUrl,\n\t\t\t\"https://historian.wu2-ppe.prague.office-int.com/repos/fluid\",\n\t\t\t\"Storage url does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tendpoints.deltaStorageUrl,\n\t\t\t\"https://alfred.wu2-ppe.prague.office-int.com/deltas/fluid/damp-competition\",\n\t\t\t\"Delta storage url does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tendpoints.ordererUrl,\n\t\t\t\"https://alfred.wu2-ppe.prague.office-int.com\",\n\t\t\t\"Orderer url does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\turl,\n\t\t\t\"https://alfred.wu2-ppe.prague.office-int.com/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\",\n\t\t\t\"FluidUrl does not match\",\n\t\t);\n\t});\n\n\tit(\"Should return the absolute url when requested\", async () => {\n\t\tconst urlResolver = new RouterliciousUrlResolver(\n\t\t\tundefined,\n\t\t\tasync () => Promise.resolve(token),\n\t\t\thostUrl,\n\t\t);\n\t\tconst url: string =\n\t\t\t\"http://localhost:3000/loader/fluid/damp-competition?chaincode=@fluid-example/shared-text@^0.11.0\";\n\t\tconst resolved = (await urlResolver.resolve({ url })) as IResolvedUrl;\n\t\tconst absoluteUrl = await urlResolver.getAbsoluteUrl(resolved, \"relative\");\n\t\tassert.strictEqual(\n\t\t\tabsoluteUrl,\n\t\t\t`${hostUrl}/fluid/damp-competition/relative`,\n\t\t\t\"Absolute url should match\",\n\t\t);\n\t});\n});\n"]}
@@ -0,0 +1,8 @@
1
+ use_current_InterfaceDeclaration_IAlfredUser(get_old_InterfaceDeclaration_IAlfredUser());
2
+ use_old_InterfaceDeclaration_IAlfredUser(get_current_InterfaceDeclaration_IAlfredUser());
3
+ use_current_InterfaceDeclaration_IConfig(get_old_InterfaceDeclaration_IConfig());
4
+ use_old_InterfaceDeclaration_IConfig(get_current_InterfaceDeclaration_IConfig());
5
+ use_current_ClassDeclaration_RouterliciousUrlResolver(get_old_ClassDeclaration_RouterliciousUrlResolver());
6
+ use_old_ClassDeclaration_RouterliciousUrlResolver(get_current_ClassDeclaration_RouterliciousUrlResolver());
7
+ export {};
8
+ //# sourceMappingURL=validateRouterliciousUrlresolverPrevious.generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateRouterliciousUrlresolverPrevious.generated.js","sourceRoot":"","sources":["../../../src/test/types/validateRouterliciousUrlresolverPrevious.generated.ts"],"names":[],"mappings":"AAgCA,4CAA4C,CACxC,wCAAwC,EAAE,CAAC,CAAC;AAWhD,wCAAwC,CACpC,4CAA4C,EAAE,CAAC,CAAC;AAWpD,wCAAwC,CACpC,oCAAoC,EAAE,CAAC,CAAC;AAW5C,oCAAoC,CAChC,wCAAwC,EAAE,CAAC,CAAC;AAWhD,qDAAqD,CACjD,iDAAiD,EAAE,CAAC,CAAC;AAWzD,iDAAiD,CAC7C,qDAAqD,EAAE,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/*\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n * Generated by fluid-type-test-generator in @fluidframework/build-tools.\n */\nimport type * as old from \"@fluidframework/routerlicious-urlresolver-previous\";\nimport type * as current from \"../../index.js\";\n\n\n// See 'build-tools/src/type-test-generator/compatibility.ts' for more information.\ntype TypeOnly<T> = T extends number\n\t? number\n\t: T extends string\n\t? string\n\t: T extends boolean | bigint | symbol\n\t? T\n\t: {\n\t\t\t[P in keyof T]: TypeOnly<T[P]>;\n\t };\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IAlfredUser\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IAlfredUser():\n TypeOnly<old.IAlfredUser>;\ndeclare function use_current_InterfaceDeclaration_IAlfredUser(\n use: TypeOnly<current.IAlfredUser>): void;\nuse_current_InterfaceDeclaration_IAlfredUser(\n get_old_InterfaceDeclaration_IAlfredUser());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IAlfredUser\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IAlfredUser():\n TypeOnly<current.IAlfredUser>;\ndeclare function use_old_InterfaceDeclaration_IAlfredUser(\n use: TypeOnly<old.IAlfredUser>): void;\nuse_old_InterfaceDeclaration_IAlfredUser(\n get_current_InterfaceDeclaration_IAlfredUser());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IConfig\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IConfig():\n TypeOnly<old.IConfig>;\ndeclare function use_current_InterfaceDeclaration_IConfig(\n use: TypeOnly<current.IConfig>): void;\nuse_current_InterfaceDeclaration_IConfig(\n get_old_InterfaceDeclaration_IConfig());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IConfig\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IConfig():\n TypeOnly<current.IConfig>;\ndeclare function use_old_InterfaceDeclaration_IConfig(\n use: TypeOnly<old.IConfig>): void;\nuse_old_InterfaceDeclaration_IConfig(\n get_current_InterfaceDeclaration_IConfig());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"ClassDeclaration_RouterliciousUrlResolver\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_ClassDeclaration_RouterliciousUrlResolver():\n TypeOnly<old.RouterliciousUrlResolver>;\ndeclare function use_current_ClassDeclaration_RouterliciousUrlResolver(\n use: TypeOnly<current.RouterliciousUrlResolver>): void;\nuse_current_ClassDeclaration_RouterliciousUrlResolver(\n get_old_ClassDeclaration_RouterliciousUrlResolver());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"ClassDeclaration_RouterliciousUrlResolver\": {\"backCompat\": false}\n*/\ndeclare function get_current_ClassDeclaration_RouterliciousUrlResolver():\n TypeOnly<current.RouterliciousUrlResolver>;\ndeclare function use_old_ClassDeclaration_RouterliciousUrlResolver(\n use: TypeOnly<old.RouterliciousUrlResolver>): void;\nuse_old_ClassDeclaration_RouterliciousUrlResolver(\n get_current_ClassDeclaration_RouterliciousUrlResolver());\n"]}
@@ -5,7 +5,7 @@
5
5
  import { IRequest } from "@fluidframework/core-interfaces";
6
6
  import { IResolvedUrl, IUrlResolver } from "@fluidframework/driver-definitions";
7
7
  import { IUser } from "@fluidframework/protocol-definitions";
8
- import { Provider } from "nconf";
8
+ import { Provider } from "./nconf.cjs";
9
9
  /**
10
10
  * @internal
11
11
  */
@@ -40,4 +40,4 @@ export interface IConfig {
40
40
  tenantId: string;
41
41
  documentId: string;
42
42
  }
43
- //# sourceMappingURL=urlResolver.d.mts.map
43
+ //# sourceMappingURL=urlResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urlResolver.d.ts","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,sCAAsC,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQvC;;GAEG;AACH,qBAAa,wBAAyB,YAAW,YAAY;IAE3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAGvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJP,MAAM,EACpB;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAC5D,SAAS,EACK,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAC/B,OAAO,EAAE,MAAM;IAGjC;;OAEG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IA8G7D,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgB5F;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,KAAK;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACnB"}
@@ -2,7 +2,6 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { parse } from "url";
6
5
  import { assert } from "@fluidframework/core-utils";
7
6
  const r11sServers = [
8
7
  "www.wu2-ppe.prague.office-int.com",
@@ -56,9 +55,9 @@ export class RouterliciousUrlResolver {
56
55
  const isLocalHost = server === "localhost";
57
56
  const isInternalRequest = server.includes("gateway"); // e.g. gateway:3000 || fierce-dog-gateway:3000
58
57
  const serverSuffix = isLocalHost ? `${server}:3003` : server.substring(4);
59
- let fluidUrl = "fluid://" +
58
+ let fluidUrl = "https://" +
60
59
  `${this.config
61
- ? parse(this.config.provider.get("worker:serverUrl")).host
60
+ ? new URL(this.config.provider.get("worker:serverUrl")).host
62
61
  : serverSuffix}/` +
63
62
  `${encodeURIComponent(tenantId)}/` +
64
63
  `${encodeURIComponent(documentId)}`;
@@ -112,7 +111,7 @@ export class RouterliciousUrlResolver {
112
111
  return resolved;
113
112
  }
114
113
  async getAbsoluteUrl(resolvedUrl, relativeUrl) {
115
- const parsedUrl = parse(resolvedUrl.url);
114
+ const parsedUrl = new URL(resolvedUrl.url);
116
115
  assert(!!parsedUrl.pathname, 0x0b9 /* "PathName should exist" */);
117
116
  const [, tenantId, documentId] = parsedUrl.pathname.split("/");
118
117
  assert(!!tenantId, 0x0ba /* "Tenant id should exist" */);
@@ -124,4 +123,4 @@ export class RouterliciousUrlResolver {
124
123
  return `${this.hostUrl}/${encodeURIComponent(tenantId)}/${encodeURIComponent(documentId)}/${url}`;
125
124
  }
126
125
  }
127
- //# sourceMappingURL=urlResolver.mjs.map
126
+ //# sourceMappingURL=urlResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urlResolver.js","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IResolvedUrl, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport { IUser } from \"@fluidframework/protocol-definitions\";\nimport { Provider } from \"./nconf.cjs\";\n\nconst r11sServers = [\n\t\"www.wu2-ppe.prague.office-int.com\",\n\t\"www.wu2.prague.office-int.com\",\n\t\"www.eu.prague.office-int.com\",\n];\n\n/**\n * @internal\n */\nexport class RouterliciousUrlResolver implements IUrlResolver {\n\tconstructor(\n\t\tprivate readonly config:\n\t\t\t| { provider: Provider; tenantId: string; documentId: string }\n\t\t\t| undefined,\n\t\tprivate readonly getToken: () => Promise<string>,\n\t\tprivate readonly hostUrl: string,\n\t) {}\n\n\t/**\n\t * Handles a request and returns the relevant endpoints for the environment\n\t */\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {\n\t\tlet requestedUrl = request.url;\n\n\t\t// If we know the original hostname, reinsert it\n\t\tif (this.config && request.url.startsWith(\"/\")) {\n\t\t\trequestedUrl = `http://dummy:3000${request.url}`;\n\t\t}\n\n\t\tconst reqUrl = new URL(requestedUrl);\n\t\tconst server = reqUrl.hostname.toLowerCase();\n\n\t\t// If we don't have a valid server or a prescriptive config, we cannot resolve the URL\n\t\tif (\n\t\t\t!(\n\t\t\t\tr11sServers.includes(server) ||\n\t\t\t\t(server === \"localhost\" && reqUrl.port === \"3000\") ||\n\t\t\t\tthis.config\n\t\t\t)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst path = reqUrl.pathname.split(\"/\");\n\t\tlet tenantId: string;\n\t\tlet documentId: string;\n\t\tlet provider: Provider | undefined;\n\t\tif (this.config) {\n\t\t\ttenantId = this.config.tenantId;\n\t\t\tdocumentId = this.config.documentId;\n\t\t\tprovider = this.config.provider;\n\t\t} else if (path.length >= 4) {\n\t\t\ttenantId = path[2];\n\t\t\tdocumentId = path[3];\n\t\t} else {\n\t\t\ttenantId = \"fluid\";\n\t\t\tdocumentId = path[2];\n\t\t}\n\n\t\tconst token = await this.getToken();\n\n\t\tconst isLocalHost = server === \"localhost\";\n\t\tconst isInternalRequest = server.includes(\"gateway\"); // e.g. gateway:3000 || fierce-dog-gateway:3000\n\n\t\tconst serverSuffix = isLocalHost ? `${server}:3003` : server.substring(4);\n\n\t\tlet fluidUrl =\n\t\t\t\"https://\" +\n\t\t\t`${\n\t\t\t\tthis.config\n\t\t\t\t\t? new URL(this.config.provider.get(\"worker:serverUrl\")).host\n\t\t\t\t\t: serverSuffix\n\t\t\t}/` +\n\t\t\t`${encodeURIComponent(tenantId)}/` +\n\t\t\t`${encodeURIComponent(documentId)}`;\n\n\t\t// In case of any additional parameters add them back to the url\n\t\tif (reqUrl.search) {\n\t\t\tconst searchParams = reqUrl.search;\n\t\t\tif (searchParams) {\n\t\t\t\tfluidUrl += searchParams;\n\t\t\t}\n\t\t}\n\n\t\tlet storageUrl = \"\";\n\t\tlet ordererUrl = \"\";\n\t\tlet deltaStorageUrl = \"\";\n\n\t\t// There is no provider when using debugging tooling\n\t\tif (provider && isInternalRequest) {\n\t\t\tstorageUrl = provider.get(\"worker:internalBlobStorageUrl\");\n\t\t\tordererUrl = provider.get(\"worker:alfredUrl\");\n\t\t\tdeltaStorageUrl = `${provider.get(\"worker:alfredUrl\")}/deltas/${encodeURIComponent(\n\t\t\t\ttenantId,\n\t\t\t)}/${encodeURIComponent(documentId)}`;\n\t\t} else if (provider) {\n\t\t\tstorageUrl = provider\n\t\t\t\t.get(\"worker:blobStorageUrl\")\n\t\t\t\t.replace(\"historian:3000\", \"localhost:3001\");\n\t\t\tordererUrl = provider.get(\"worker:serverUrl\");\n\t\t\tdeltaStorageUrl = `${ordererUrl}/deltas/${encodeURIComponent(\n\t\t\t\ttenantId,\n\t\t\t)}/${encodeURIComponent(documentId)}`;\n\t\t} else if (isLocalHost) {\n\t\t\tstorageUrl = `http://localhost:3001`;\n\t\t\tordererUrl = `http://localhost:3003`;\n\t\t\tdeltaStorageUrl = `http://localhost:3003/deltas/${tenantId}/${documentId}`;\n\t\t} else {\n\t\t\tstorageUrl = `https://historian.${serverSuffix}`;\n\t\t\tordererUrl = `https://alfred.${serverSuffix}`;\n\t\t\tdeltaStorageUrl = `https://alfred.${serverSuffix}/deltas/${tenantId}/${documentId}`;\n\t\t}\n\n\t\tstorageUrl += `/repos/${tenantId}`;\n\t\tordererUrl += ``;\n\t\tdeltaStorageUrl += ``;\n\n\t\tconst resolved: IResolvedUrl = {\n\t\t\tendpoints: {\n\t\t\t\tstorageUrl,\n\t\t\t\tdeltaStorageUrl,\n\t\t\t\tordererUrl,\n\t\t\t},\n\t\t\tid: documentId,\n\t\t\ttokens: { jwt: token },\n\t\t\ttype: \"fluid\",\n\t\t\turl: fluidUrl,\n\t\t};\n\t\treturn resolved;\n\t}\n\n\tpublic async getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string> {\n\t\tconst parsedUrl = new URL(resolvedUrl.url);\n\t\tassert(!!parsedUrl.pathname, 0x0b9 /* \"PathName should exist\" */);\n\t\tconst [, tenantId, documentId] = parsedUrl.pathname.split(\"/\");\n\t\tassert(!!tenantId, 0x0ba /* \"Tenant id should exist\" */);\n\t\tassert(!!documentId, 0x0bb /* \"Document id should exist\" */);\n\n\t\tlet url = relativeUrl;\n\t\tif (url.startsWith(\"/\")) {\n\t\t\turl = url.substr(1);\n\t\t}\n\n\t\treturn `${this.hostUrl}/${encodeURIComponent(tenantId)}/${encodeURIComponent(\n\t\t\tdocumentId,\n\t\t)}/${url}`;\n\t}\n}\n\n/**\n * @internal\n */\nexport interface IAlfredUser extends IUser {\n\tdisplayName: string;\n\tname: string;\n}\n\n/**\n * @internal\n */\nexport interface IConfig {\n\tserverUrl: string;\n\tblobStorageUrl: string;\n\ttenantId: string;\n\tdocumentId: string;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/routerlicious-urlresolver",
3
- "version": "2.0.0-rc.1.0.3",
3
+ "version": "2.0.0-rc.2.0.0",
4
4
  "description": "Url Resolver for routerlicious urls.",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -11,92 +11,70 @@
11
11
  "license": "MIT",
12
12
  "author": "Microsoft and contributors",
13
13
  "sideEffects": false,
14
+ "type": "module",
14
15
  "exports": {
15
16
  ".": {
16
17
  "import": {
17
- "types": "./lib/index.d.mts",
18
- "default": "./lib/index.mjs"
18
+ "types": "./lib/index.d.ts",
19
+ "default": "./lib/index.js"
19
20
  },
20
21
  "require": {
21
22
  "types": "./dist/index.d.ts",
22
23
  "default": "./dist/index.js"
23
24
  }
24
25
  },
25
- "./alpha": {
26
- "import": {
27
- "types": "./lib/routerlicious-urlresolver-alpha.d.mts",
28
- "default": "./lib/index.mjs"
29
- },
30
- "require": {
31
- "types": "./dist/routerlicious-urlresolver-alpha.d.ts",
32
- "default": "./dist/index.js"
33
- }
34
- },
35
- "./beta": {
26
+ "./public": {
36
27
  "import": {
37
- "types": "./lib/routerlicious-urlresolver-beta.d.mts",
38
- "default": "./lib/index.mjs"
28
+ "types": "./lib/routerlicious-urlresolver-public.d.ts",
29
+ "default": "./lib/index.js"
39
30
  },
40
31
  "require": {
41
- "types": "./dist/routerlicious-urlresolver-beta.d.ts",
32
+ "types": "./dist/routerlicious-urlresolver-public.d.ts",
42
33
  "default": "./dist/index.js"
43
34
  }
44
35
  },
45
36
  "./internal": {
46
37
  "import": {
47
- "types": "./lib/index.d.mts",
48
- "default": "./lib/index.mjs"
38
+ "types": "./lib/index.d.ts",
39
+ "default": "./lib/index.js"
49
40
  },
50
41
  "require": {
51
42
  "types": "./dist/index.d.ts",
52
43
  "default": "./dist/index.js"
53
44
  }
54
- },
55
- "./public": {
56
- "import": {
57
- "types": "./lib/routerlicious-urlresolver-public.d.mts",
58
- "default": "./lib/index.mjs"
59
- },
60
- "require": {
61
- "types": "./dist/routerlicious-urlresolver-public.d.ts",
62
- "default": "./dist/index.js"
63
- }
64
45
  }
65
46
  },
66
47
  "main": "dist/index.js",
67
- "module": "lib/index.mjs",
68
48
  "types": "dist/index.d.ts",
69
49
  "dependencies": {
70
- "@fluidframework/core-interfaces": ">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0",
71
- "@fluidframework/core-utils": ">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0",
72
- "@fluidframework/driver-definitions": ">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0",
73
- "@fluidframework/protocol-definitions": "^3.1.0",
74
- "nconf": "^0.12.0",
75
- "url": "^0.11.0"
50
+ "@fluidframework/core-interfaces": ">=2.0.0-rc.2.0.0 <2.0.0-rc.2.1.0",
51
+ "@fluidframework/core-utils": ">=2.0.0-rc.2.0.0 <2.0.0-rc.2.1.0",
52
+ "@fluidframework/driver-definitions": ">=2.0.0-rc.2.0.0 <2.0.0-rc.2.1.0",
53
+ "@fluidframework/protocol-definitions": "^3.2.0",
54
+ "nconf": "^0.12.0"
76
55
  },
77
56
  "devDependencies": {
78
57
  "@arethetypeswrong/cli": "^0.13.3",
79
- "@fluid-tools/build-cli": "^0.29.0",
58
+ "@fluid-internal/mocha-test-setup": ">=2.0.0-rc.2.0.0 <2.0.0-rc.2.1.0",
59
+ "@fluid-tools/build-cli": "^0.34.0",
80
60
  "@fluidframework/build-common": "^2.0.3",
81
- "@fluidframework/build-tools": "^0.29.0",
82
- "@fluidframework/eslint-config-fluid": "^3.2.0",
83
- "@fluidframework/mocha-test-setup": ">=2.0.0-rc.1.0.3 <2.0.0-rc.1.1.0",
61
+ "@fluidframework/build-tools": "^0.34.0",
62
+ "@fluidframework/eslint-config-fluid": "^4.0.0",
84
63
  "@fluidframework/routerlicious-urlresolver-previous": "npm:@fluidframework/routerlicious-urlresolver@2.0.0-internal.8.0.0",
85
- "@microsoft/api-extractor": "^7.38.3",
64
+ "@microsoft/api-extractor": "^7.42.3",
86
65
  "@types/mocha": "^9.1.1",
87
66
  "@types/nconf": "^0.10.0",
88
67
  "@types/node": "^18.19.0",
89
68
  "assert": "^2.0.0",
90
69
  "copyfiles": "^2.4.1",
91
70
  "cross-env": "^7.0.3",
92
- "eslint": "~8.50.0",
71
+ "eslint": "~8.55.0",
93
72
  "mocha": "^10.2.0",
94
73
  "mocha-json-output-reporter": "^2.0.1",
95
74
  "mocha-multi-reporters": "^1.5.1",
96
75
  "moment": "^2.21.0",
97
76
  "prettier": "~3.0.3",
98
77
  "rimraf": "^4.4.0",
99
- "tsc-multi": "^1.1.0",
100
78
  "typescript": "~5.1.6"
101
79
  },
102
80
  "fluidBuild": {
@@ -116,14 +94,16 @@
116
94
  },
117
95
  "scripts": {
118
96
  "api": "fluid-build . --task api",
119
- "api-extractor:commonjs": "api-extractor run --local",
120
- "api-extractor:esnext": "api-extractor run --config ./api-extractor-esm.json",
97
+ "api-extractor:commonjs": "api-extractor run --config ./api-extractor-cjs.json",
98
+ "api-extractor:esnext": "api-extractor run --local",
121
99
  "build": "fluid-build . --task build",
122
100
  "build:commonjs": "fluid-build . --task commonjs",
123
101
  "build:compile": "fluid-build . --task compile",
124
102
  "build:docs": "fluid-build . --task api",
125
- "build:esnext": "tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json",
126
- "build:test": "tsc --project ./src/test/tsconfig.json",
103
+ "build:esnext": "tsc --project ./tsconfig.json",
104
+ "build:test": "npm run build:test:esm && npm run build:test:cjs",
105
+ "build:test:cjs": "fluid-tsc commonjs --project ./src/test/tsconfig.cjs.json",
106
+ "build:test:esm": "tsc --project ./src/test/tsconfig.json",
127
107
  "check:are-the-types-wrong": "attw --pack . --entrypoints .",
128
108
  "check:release-tags": "api-extractor run --local --config ./api-extractor-lint.json",
129
109
  "ci:build:docs": "api-extractor run",
@@ -136,9 +116,11 @@
136
116
  "prettier": "prettier --check . --cache --ignore-path ../../../.prettierignore",
137
117
  "prettier:fix": "prettier --write . --cache --ignore-path ../../../.prettierignore",
138
118
  "test": "npm run test:mocha",
139
- "test:mocha": "mocha --ignore \"dist/test/types/*\" --recursive dist/test -r node_modules/@fluidframework/mocha-test-setup",
119
+ "test:mocha": "npm run test:mocha:esm && npm run test:mocha:cjs",
120
+ "test:mocha:cjs": "mocha --recursive \"dist/test/**/*.spec.*js\" --exit",
121
+ "test:mocha:esm": "mocha --recursive \"lib/test/**/*.spec.*js\" --exit",
140
122
  "test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
141
- "tsc": "tsc",
123
+ "tsc": "fluid-tsc commonjs --project ./tsconfig.cjs.json && copyfiles -f ../../../common/build/build-common/src/cjs/package.json ./dist",
142
124
  "typetests:gen": "fluid-type-test-generator",
143
125
  "typetests:prepare": "flub typetests --dir . --reset --previous --normalize"
144
126
  }
package/src/index.ts CHANGED
@@ -3,4 +3,4 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- export { IAlfredUser, IConfig, RouterliciousUrlResolver } from "./urlResolver";
6
+ export { IAlfredUser, IConfig, RouterliciousUrlResolver } from "./urlResolver.js";
package/src/nconf.cts ADDED
@@ -0,0 +1,12 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ // This file serves as an intermediary module to export the 'Provider' named export from the 'nconf' module.
7
+ // It is written using ESM module syntax, making it compatible with both ESM and CJS module.
8
+ // This compatibility allows for flexible usage of the 'Provider' named export from the 'nconf' module across different module systems without modification.
9
+
10
+ import { Provider } from "nconf";
11
+
12
+ export { Provider };
@@ -3,12 +3,11 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { parse } from "url";
7
6
  import { assert } from "@fluidframework/core-utils";
8
7
  import { IRequest } from "@fluidframework/core-interfaces";
9
8
  import { IResolvedUrl, IUrlResolver } from "@fluidframework/driver-definitions";
10
9
  import { IUser } from "@fluidframework/protocol-definitions";
11
- import { Provider } from "nconf";
10
+ import { Provider } from "./nconf.cjs";
12
11
 
13
12
  const r11sServers = [
14
13
  "www.wu2-ppe.prague.office-int.com",
@@ -77,10 +76,10 @@ export class RouterliciousUrlResolver implements IUrlResolver {
77
76
  const serverSuffix = isLocalHost ? `${server}:3003` : server.substring(4);
78
77
 
79
78
  let fluidUrl =
80
- "fluid://" +
79
+ "https://" +
81
80
  `${
82
81
  this.config
83
- ? parse(this.config.provider.get("worker:serverUrl")).host
82
+ ? new URL(this.config.provider.get("worker:serverUrl")).host
84
83
  : serverSuffix
85
84
  }/` +
86
85
  `${encodeURIComponent(tenantId)}/` +
@@ -142,7 +141,7 @@ export class RouterliciousUrlResolver implements IUrlResolver {
142
141
  }
143
142
 
144
143
  public async getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string> {
145
- const parsedUrl = parse(resolvedUrl.url);
144
+ const parsedUrl = new URL(resolvedUrl.url);
146
145
  assert(!!parsedUrl.pathname, 0x0b9 /* "PathName should exist" */);
147
146
  const [, tenantId, documentId] = parsedUrl.pathname.split("/");
148
147
  assert(!!tenantId, 0x0ba /* "Tenant id should exist" */);
@@ -0,0 +1,7 @@
1
+ {
2
+ // This config must be used in a "type": "commonjs" environment. (Use fluid-tsc commonjs.)
3
+ "extends": "./tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "./dist",
6
+ },
7
+ }
package/tsconfig.json CHANGED
@@ -1,13 +1,10 @@
1
1
  {
2
- "extends": [
3
- "../../../common/build/build-common/tsconfig.base.json",
4
- "../../../common/build/build-common/tsconfig.cjs.json",
5
- ],
2
+ "extends": "../../../common/build/build-common/tsconfig.node16.json",
6
3
  "include": ["src/**/*"],
7
4
  "exclude": ["src/test/**/*"],
8
5
  "compilerOptions": {
9
6
  "rootDir": "./src",
10
- "outDir": "./dist",
7
+ "outDir": "./lib",
11
8
  "types": ["node"],
12
9
  },
13
10
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAE,WAAW,EAAE,OAAO,EAAE,wBAAwB,EAAE"}
package/lib/index.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAwB,wBAAwB,EAAE","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { IAlfredUser, IConfig, RouterliciousUrlResolver } from \"./urlResolver\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"urlResolver.d.mts","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAII,EAAE,QAAQ,EAAE,MAAM,iCAAiC;OACnD,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC;OACxE,EAAE,KAAK,EAAE,MAAM,sCAAsC;OACrD,EAAE,QAAQ,EAAE,MAAM,OAAO;AAQhC;;GAEG;AACH,qBAAa,wBAAyB,YAAW,YAAY;IAE3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAGvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJP,MAAM,EACpB;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAC5D,SAAS,EACK,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAC/B,OAAO,EAAE,MAAM;IAGjC;;OAEG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IA8G7D,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgB5F;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,KAAK;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACnB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"urlResolver.mjs","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { parse } from \"url\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IResolvedUrl, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport { IUser } from \"@fluidframework/protocol-definitions\";\nimport { Provider } from \"nconf\";\n\nconst r11sServers = [\n\t\"www.wu2-ppe.prague.office-int.com\",\n\t\"www.wu2.prague.office-int.com\",\n\t\"www.eu.prague.office-int.com\",\n];\n\n/**\n * @internal\n */\nexport class RouterliciousUrlResolver implements IUrlResolver {\n\tconstructor(\n\t\tprivate readonly config:\n\t\t\t| { provider: Provider; tenantId: string; documentId: string }\n\t\t\t| undefined,\n\t\tprivate readonly getToken: () => Promise<string>,\n\t\tprivate readonly hostUrl: string,\n\t) {}\n\n\t/**\n\t * Handles a request and returns the relevant endpoints for the environment\n\t */\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {\n\t\tlet requestedUrl = request.url;\n\n\t\t// If we know the original hostname, reinsert it\n\t\tif (this.config && request.url.startsWith(\"/\")) {\n\t\t\trequestedUrl = `http://dummy:3000${request.url}`;\n\t\t}\n\n\t\tconst reqUrl = new URL(requestedUrl);\n\t\tconst server = reqUrl.hostname.toLowerCase();\n\n\t\t// If we don't have a valid server or a prescriptive config, we cannot resolve the URL\n\t\tif (\n\t\t\t!(\n\t\t\t\tr11sServers.includes(server) ||\n\t\t\t\t(server === \"localhost\" && reqUrl.port === \"3000\") ||\n\t\t\t\tthis.config\n\t\t\t)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst path = reqUrl.pathname.split(\"/\");\n\t\tlet tenantId: string;\n\t\tlet documentId: string;\n\t\tlet provider: Provider | undefined;\n\t\tif (this.config) {\n\t\t\ttenantId = this.config.tenantId;\n\t\t\tdocumentId = this.config.documentId;\n\t\t\tprovider = this.config.provider;\n\t\t} else if (path.length >= 4) {\n\t\t\ttenantId = path[2];\n\t\t\tdocumentId = path[3];\n\t\t} else {\n\t\t\ttenantId = \"fluid\";\n\t\t\tdocumentId = path[2];\n\t\t}\n\n\t\tconst token = await this.getToken();\n\n\t\tconst isLocalHost = server === \"localhost\";\n\t\tconst isInternalRequest = server.includes(\"gateway\"); // e.g. gateway:3000 || fierce-dog-gateway:3000\n\n\t\tconst serverSuffix = isLocalHost ? `${server}:3003` : server.substring(4);\n\n\t\tlet fluidUrl =\n\t\t\t\"fluid://\" +\n\t\t\t`${\n\t\t\t\tthis.config\n\t\t\t\t\t? parse(this.config.provider.get(\"worker:serverUrl\")).host\n\t\t\t\t\t: serverSuffix\n\t\t\t}/` +\n\t\t\t`${encodeURIComponent(tenantId)}/` +\n\t\t\t`${encodeURIComponent(documentId)}`;\n\n\t\t// In case of any additional parameters add them back to the url\n\t\tif (reqUrl.search) {\n\t\t\tconst searchParams = reqUrl.search;\n\t\t\tif (searchParams) {\n\t\t\t\tfluidUrl += searchParams;\n\t\t\t}\n\t\t}\n\n\t\tlet storageUrl = \"\";\n\t\tlet ordererUrl = \"\";\n\t\tlet deltaStorageUrl = \"\";\n\n\t\t// There is no provider when using debugging tooling\n\t\tif (provider && isInternalRequest) {\n\t\t\tstorageUrl = provider.get(\"worker:internalBlobStorageUrl\");\n\t\t\tordererUrl = provider.get(\"worker:alfredUrl\");\n\t\t\tdeltaStorageUrl = `${provider.get(\"worker:alfredUrl\")}/deltas/${encodeURIComponent(\n\t\t\t\ttenantId,\n\t\t\t)}/${encodeURIComponent(documentId)}`;\n\t\t} else if (provider) {\n\t\t\tstorageUrl = provider\n\t\t\t\t.get(\"worker:blobStorageUrl\")\n\t\t\t\t.replace(\"historian:3000\", \"localhost:3001\");\n\t\t\tordererUrl = provider.get(\"worker:serverUrl\");\n\t\t\tdeltaStorageUrl = `${ordererUrl}/deltas/${encodeURIComponent(\n\t\t\t\ttenantId,\n\t\t\t)}/${encodeURIComponent(documentId)}`;\n\t\t} else if (isLocalHost) {\n\t\t\tstorageUrl = `http://localhost:3001`;\n\t\t\tordererUrl = `http://localhost:3003`;\n\t\t\tdeltaStorageUrl = `http://localhost:3003/deltas/${tenantId}/${documentId}`;\n\t\t} else {\n\t\t\tstorageUrl = `https://historian.${serverSuffix}`;\n\t\t\tordererUrl = `https://alfred.${serverSuffix}`;\n\t\t\tdeltaStorageUrl = `https://alfred.${serverSuffix}/deltas/${tenantId}/${documentId}`;\n\t\t}\n\n\t\tstorageUrl += `/repos/${tenantId}`;\n\t\tordererUrl += ``;\n\t\tdeltaStorageUrl += ``;\n\n\t\tconst resolved: IResolvedUrl = {\n\t\t\tendpoints: {\n\t\t\t\tstorageUrl,\n\t\t\t\tdeltaStorageUrl,\n\t\t\t\tordererUrl,\n\t\t\t},\n\t\t\tid: documentId,\n\t\t\ttokens: { jwt: token },\n\t\t\ttype: \"fluid\",\n\t\t\turl: fluidUrl,\n\t\t};\n\t\treturn resolved;\n\t}\n\n\tpublic async getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string> {\n\t\tconst parsedUrl = parse(resolvedUrl.url);\n\t\tassert(!!parsedUrl.pathname, 0x0b9 /* \"PathName should exist\" */);\n\t\tconst [, tenantId, documentId] = parsedUrl.pathname.split(\"/\");\n\t\tassert(!!tenantId, 0x0ba /* \"Tenant id should exist\" */);\n\t\tassert(!!documentId, 0x0bb /* \"Document id should exist\" */);\n\n\t\tlet url = relativeUrl;\n\t\tif (url.startsWith(\"/\")) {\n\t\t\turl = url.substr(1);\n\t\t}\n\n\t\treturn `${this.hostUrl}/${encodeURIComponent(tenantId)}/${encodeURIComponent(\n\t\t\tdocumentId,\n\t\t)}/${url}`;\n\t}\n}\n\n/**\n * @internal\n */\nexport interface IAlfredUser extends IUser {\n\tdisplayName: string;\n\tname: string;\n}\n\n/**\n * @internal\n */\nexport interface IConfig {\n\tserverUrl: string;\n\tblobStorageUrl: string;\n\ttenantId: string;\n\tdocumentId: string;\n}\n"]}