@fluidframework/odsp-urlresolver 2.0.0-rc.1.0.6 → 2.0.0-rc.2.0.1

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 (51) hide show
  1. package/{.mocharc.js → .mocharc.cjs} +1 -1
  2. package/CHANGELOG.md +12 -0
  3. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  4. package/api-extractor.json +1 -1
  5. package/api-report/odsp-urlresolver.api.md +9 -0
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +5 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/odsp-urlresolver-alpha.d.ts +3 -0
  11. package/dist/odsp-urlresolver-beta.d.ts +5 -0
  12. package/dist/odsp-urlresolver-public.d.ts +5 -0
  13. package/dist/odsp-urlresolver-untrimmed.d.ts +10 -0
  14. package/dist/package.json +3 -0
  15. package/dist/tsdoc-metadata.json +1 -1
  16. package/dist/urlResolver.d.ts +9 -1
  17. package/dist/urlResolver.d.ts.map +1 -1
  18. package/dist/urlResolver.js +69 -1
  19. package/dist/urlResolver.js.map +1 -1
  20. package/lib/index.d.ts +6 -0
  21. package/lib/index.d.ts.map +1 -0
  22. package/lib/{index.mjs → index.js} +2 -2
  23. package/lib/index.js.map +1 -0
  24. package/lib/{odsp-urlresolver-public.d.mts → odsp-urlresolver-alpha.d.ts} +2 -3
  25. package/lib/{odsp-urlresolver-beta.d.mts → odsp-urlresolver-beta.d.ts} +5 -0
  26. package/lib/odsp-urlresolver-public.d.ts +18 -0
  27. package/lib/{odsp-urlresolver-untrimmed.d.mts → odsp-urlresolver-untrimmed.d.ts} +10 -0
  28. package/lib/test/fluidAppUrlResolver.spec.js +19 -0
  29. package/lib/test/fluidAppUrlResolver.spec.js.map +1 -0
  30. package/lib/test/spoUrlResolver.spec.js +29 -0
  31. package/lib/test/spoUrlResolver.spec.js.map +1 -0
  32. package/lib/test/types/validateOdspUrlresolverPrevious.generated.js +6 -0
  33. package/lib/test/types/validateOdspUrlresolverPrevious.generated.js.map +1 -0
  34. package/lib/urlResolver.d.ts +28 -0
  35. package/lib/urlResolver.d.ts.map +1 -0
  36. package/lib/urlResolver.js +105 -0
  37. package/lib/urlResolver.js.map +1 -0
  38. package/package.json +32 -47
  39. package/src/index.ts +1 -1
  40. package/src/urlResolver.ts +85 -1
  41. package/tsconfig.cjs.json +7 -0
  42. package/tsconfig.json +2 -5
  43. package/lib/index.d.mts +0 -6
  44. package/lib/index.d.mts.map +0 -1
  45. package/lib/index.mjs.map +0 -1
  46. package/lib/odsp-urlresolver-alpha.d.mts +0 -9
  47. package/lib/urlResolver.d.mts +0 -20
  48. package/lib/urlResolver.d.mts.map +0 -1
  49. package/lib/urlResolver.mjs +0 -38
  50. package/lib/urlResolver.mjs.map +0 -1
  51. /package/{.eslintrc.js → .eslintrc.cjs} +0 -0
@@ -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,17 @@
1
1
  # @fluidframework/odsp-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
+
11
+ - Remove deprecated package @fluid-tools/fluidapp-odsp-urlresolver ([#19262](https://github.com/microsoft/FluidFramework/issues/19262)) [8990be8bbc](https://github.com/microsoft/FluidFramework/commits/8990be8bbc229c6545eb32023f9caa1dcca8568d)
12
+
13
+ The FluidAppOdspUrlResolver class is now incorporated into the @fluidframework/odsp-urlresolver package.
14
+
3
15
  ## 2.0.0-rc.1.0.0
4
16
 
5
17
  Dependency updates only.
@@ -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-base.json"
3
+ "extends": "../../../common/build/build-common/api-extractor-base.esm.primary.json"
4
4
  }
@@ -4,10 +4,19 @@
4
4
 
5
5
  ```ts
6
6
 
7
+ import { IContainerPackageInfo } from '@fluidframework/driver-definitions';
7
8
  import { IRequest } from '@fluidframework/core-interfaces';
8
9
  import { IResolvedUrl } from '@fluidframework/driver-definitions';
9
10
  import { IUrlResolver } from '@fluidframework/driver-definitions';
10
11
 
12
+ // @internal
13
+ export class FluidAppOdspUrlResolver implements IUrlResolver {
14
+ // (undocumented)
15
+ getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string, packageInfoSource?: IContainerPackageInfo): Promise<string>;
16
+ // (undocumented)
17
+ resolve(request: IRequest): Promise<IResolvedUrl | undefined>;
18
+ }
19
+
11
20
  // @internal
12
21
  export const isOdspUrl: (url: string) => boolean;
13
22
 
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 { isOdspUrl, OdspUrlResolver } from "./urlResolver";
5
+ export { isOdspUrl, FluidAppOdspUrlResolver, OdspUrlResolver } 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,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -4,8 +4,9 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.OdspUrlResolver = exports.isOdspUrl = void 0;
8
- var urlResolver_1 = require("./urlResolver");
9
- Object.defineProperty(exports, "isOdspUrl", { enumerable: true, get: function () { return urlResolver_1.isOdspUrl; } });
10
- Object.defineProperty(exports, "OdspUrlResolver", { enumerable: true, get: function () { return urlResolver_1.OdspUrlResolver; } });
7
+ exports.OdspUrlResolver = exports.FluidAppOdspUrlResolver = exports.isOdspUrl = void 0;
8
+ var urlResolver_js_1 = require("./urlResolver.js");
9
+ Object.defineProperty(exports, "isOdspUrl", { enumerable: true, get: function () { return urlResolver_js_1.isOdspUrl; } });
10
+ Object.defineProperty(exports, "FluidAppOdspUrlResolver", { enumerable: true, get: function () { return urlResolver_js_1.FluidAppOdspUrlResolver; } });
11
+ Object.defineProperty(exports, "OdspUrlResolver", { enumerable: true, get: function () { return urlResolver_js_1.OdspUrlResolver; } });
11
12
  //# 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,6CAA2D;AAAlD,wGAAA,SAAS,OAAA;AAAE,8GAAA,eAAe,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { isOdspUrl, OdspUrlResolver } from \"./urlResolver\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,mDAAuF;AAA9E,2GAAA,SAAS,OAAA;AAAE,yHAAA,uBAAuB,OAAA;AAAE,iHAAA,eAAe,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { isOdspUrl, FluidAppOdspUrlResolver, OdspUrlResolver } from \"./urlResolver.js\";\n"]}
@@ -1,7 +1,10 @@
1
+ import { IContainerPackageInfo } from '@fluidframework/driver-definitions';
1
2
  import { IRequest } from '@fluidframework/core-interfaces';
2
3
  import { IResolvedUrl } from '@fluidframework/driver-definitions';
3
4
  import { IUrlResolver } from '@fluidframework/driver-definitions';
4
5
 
6
+ /* Excluded from this release type: FluidAppOdspUrlResolver */
7
+
5
8
  /* Excluded from this release type: isOdspUrl */
6
9
 
7
10
  /* Excluded from this release type: OdspUrlResolver */
@@ -1,7 +1,12 @@
1
+ import { IContainerPackageInfo } from '@fluidframework/driver-definitions';
1
2
  import { IRequest } from '@fluidframework/core-interfaces';
2
3
  import { IResolvedUrl } from '@fluidframework/driver-definitions';
3
4
  import { IUrlResolver } from '@fluidframework/driver-definitions';
4
5
 
6
+ /* Excluded from this release type: FluidAppOdspUrlResolver */
7
+
8
+ /* Excluded from this release type: IContainerPackageInfo */
9
+
5
10
  /* Excluded from this release type: IResolvedUrl */
6
11
 
7
12
  /* Excluded from this release type: isOdspUrl */
@@ -1,7 +1,12 @@
1
+ import { IContainerPackageInfo } from '@fluidframework/driver-definitions';
1
2
  import { IRequest } from '@fluidframework/core-interfaces';
2
3
  import { IResolvedUrl } from '@fluidframework/driver-definitions';
3
4
  import { IUrlResolver } from '@fluidframework/driver-definitions';
4
5
 
6
+ /* Excluded from this release type: FluidAppOdspUrlResolver */
7
+
8
+ /* Excluded from this release type: IContainerPackageInfo */
9
+
5
10
  /* Excluded from this release type: IResolvedUrl */
6
11
 
7
12
  /* Excluded from this release type: isOdspUrl */
@@ -1,7 +1,17 @@
1
+ import { IContainerPackageInfo } from '@fluidframework/driver-definitions';
1
2
  import { IRequest } from '@fluidframework/core-interfaces';
2
3
  import { IResolvedUrl } from '@fluidframework/driver-definitions';
3
4
  import { IUrlResolver } from '@fluidframework/driver-definitions';
4
5
 
6
+ /**
7
+ * This class helps to resolve Fluid URLs from Office and OneNote. Construct the resolver class and invoke its resolve function to retrieve the content parameters.
8
+ * @internal
9
+ */
10
+ export declare class FluidAppOdspUrlResolver implements IUrlResolver {
11
+ resolve(request: IRequest): Promise<IResolvedUrl | undefined>;
12
+ getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string, packageInfoSource?: IContainerPackageInfo): Promise<string>;
13
+ }
14
+
5
15
  /**
6
16
  * Returns true if the given string is a valid SPO/ODB or ODC URL.
7
17
  *
@@ -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
  }
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { IRequest } from "@fluidframework/core-interfaces";
6
- import { IResolvedUrl, IUrlResolver } from "@fluidframework/driver-definitions";
6
+ import { IContainerPackageInfo, IResolvedUrl, IUrlResolver } from "@fluidframework/driver-definitions";
7
7
  /**
8
8
  * @internal
9
9
  */
@@ -17,4 +17,12 @@ export declare class OdspUrlResolver implements IUrlResolver {
17
17
  * @internal
18
18
  */
19
19
  export declare const isOdspUrl: (url: string) => boolean;
20
+ /**
21
+ * This class helps to resolve Fluid URLs from Office and OneNote. Construct the resolver class and invoke its resolve function to retrieve the content parameters.
22
+ * @internal
23
+ */
24
+ export declare class FluidAppOdspUrlResolver implements IUrlResolver {
25
+ resolve(request: IRequest): Promise<IResolvedUrl | undefined>;
26
+ getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string, packageInfoSource?: IContainerPackageInfo): Promise<string>;
27
+ }
20
28
  //# sourceMappingURL=urlResolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"urlResolver.d.ts","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAShF;;GAEG;AACH,qBAAa,eAAgB,YAAW,YAAY;IACtC,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAiB7D,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG5F;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,OAEvC,CAAC"}
1
+ {"version":3,"file":"urlResolver.d.ts","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EACN,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,MAAM,oCAAoC,CAAC;AAkB5C;;GAEG;AACH,qBAAa,eAAgB,YAAW,YAAY;IACtC,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAiB7D,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG5F;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,OAEvC,CAAC;AAEF;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,YAAY;IAC9C,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IA6B7D,cAAc,CAC1B,WAAW,EAAE,YAAY,EACzB,WAAW,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,MAAM,CAAC;CAGlB"}
@@ -4,8 +4,15 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.isOdspUrl = exports.OdspUrlResolver = void 0;
7
+ exports.FluidAppOdspUrlResolver = exports.isOdspUrl = exports.OdspUrlResolver = void 0;
8
8
  const odsp_driver_1 = require("@fluidframework/odsp-driver");
9
+ const client_utils_1 = require("@fluid-internal/client-utils");
10
+ const core_utils_1 = require("@fluidframework/core-utils");
11
+ const fluidOfficeAndOneNoteServers = new Set([
12
+ "dev.fluidpreview.office.net",
13
+ "fluidpreview.office.net",
14
+ "www.onenote.com",
15
+ ]);
9
16
  /**
10
17
  * @internal
11
18
  */
@@ -40,4 +47,65 @@ const isOdspUrl = (url) => {
40
47
  return (0, odsp_driver_1.isSpoUrl)(url) || (0, odsp_driver_1.isOdcUrl)(url);
41
48
  };
42
49
  exports.isOdspUrl = isOdspUrl;
50
+ /**
51
+ * This class helps to resolve Fluid URLs from Office and OneNote. Construct the resolver class and invoke its resolve function to retrieve the content parameters.
52
+ * @internal
53
+ */
54
+ class FluidAppOdspUrlResolver {
55
+ async resolve(request) {
56
+ const reqUrl = new URL(request.url);
57
+ const server = reqUrl.hostname.toLowerCase();
58
+ let contents;
59
+ if (fluidOfficeAndOneNoteServers.has(server)) {
60
+ contents = await initializeFluidOfficeOrOneNote(reqUrl);
61
+ }
62
+ else if (server === "www.office.com") {
63
+ const getRequiredParam = (name) => {
64
+ const value = reqUrl.searchParams.get(name);
65
+ (0, core_utils_1.assert)(!!value, 0x097 /* Missing param from office.com URL parameter */);
66
+ return value;
67
+ };
68
+ contents = {
69
+ driveId: getRequiredParam("drive"),
70
+ itemId: getRequiredParam("item"),
71
+ siteUrl: getRequiredParam("siteUrl"),
72
+ };
73
+ }
74
+ else {
75
+ return undefined;
76
+ }
77
+ if (!contents) {
78
+ return undefined;
79
+ }
80
+ const urlToBeResolved = (0, odsp_driver_1.createOdspUrl)({ ...contents, dataStorePath: "" });
81
+ const odspDriverUrlResolver = new odsp_driver_1.OdspDriverUrlResolver();
82
+ return odspDriverUrlResolver.resolve({ url: urlToBeResolved });
83
+ }
84
+ // TODO: Issue-2109 Implement detach container api or put appropriate comment.
85
+ async getAbsoluteUrl(resolvedUrl, relativeUrl, packageInfoSource) {
86
+ throw new Error("Not implemented");
87
+ }
88
+ }
89
+ exports.FluidAppOdspUrlResolver = FluidAppOdspUrlResolver;
90
+ async function initializeFluidOfficeOrOneNote(urlSource) {
91
+ const pathname = urlSource.pathname;
92
+ const siteDriveItemMatch = pathname.match(/\/(p|preview|meetingnotes|notes)\/([^/]*)\/([^/]*)\/([^/]*)/);
93
+ if (siteDriveItemMatch === null) {
94
+ return undefined;
95
+ }
96
+ const site = decodeURIComponent(siteDriveItemMatch[2]);
97
+ // Path value is base64 encoded so need to decode first
98
+ const decodedSite = (0, client_utils_1.fromBase64ToUtf8)(site);
99
+ // Site value includes storage type
100
+ const storageType = decodedSite.split(":")[0];
101
+ const expectedStorageType = "spo"; // Only support spo for now
102
+ if (storageType !== expectedStorageType) {
103
+ throw new Error(`Unexpected storage type ${storageType}, expected: ${expectedStorageType}`);
104
+ }
105
+ // Since we have the drive and item, only take the host ignore the rest
106
+ const siteUrl = decodedSite.slice(Math.max(0, storageType.length + 1));
107
+ const driveId = decodeURIComponent(siteDriveItemMatch[3]);
108
+ const itemId = decodeURIComponent(siteDriveItemMatch[4]);
109
+ return { siteUrl, driveId, itemId };
110
+ }
43
111
  //# sourceMappingURL=urlResolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"urlResolver.js","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,6DAMqC;AAErC;;GAEG;AACH,MAAa,eAAe;IACpB,KAAK,CAAC,OAAO,CAAC,OAAiB;QACrC,IAAI,IAAA,iBAAS,EAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,IAAA,6BAAe,EAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,EAAE;gBACd,OAAO,SAAS,CAAC;aACjB;YACD,MAAM,eAAe,GAAG,IAAA,2BAAa,EAAC,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM,qBAAqB,GAAiB,IAAI,mCAAqB,EAAE,CAAC;YACxE,OAAO,qBAAqB,CAAC,OAAO,CAAC;gBACpC,GAAG,EAAE,eAAe;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;aACxB,CAAC,CAAC;SACH;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,WAAyB,EAAE,WAAmB;QACzE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;CACD;AArBD,0CAqBC;AAED;;;;GAIG;AACI,MAAM,SAAS,GAAG,CAAC,GAAW,EAAW,EAAE;IACjD,OAAO,IAAA,sBAAQ,EAAC,GAAG,CAAC,IAAI,IAAA,sBAAQ,EAAC,GAAG,CAAC,CAAC;AACvC,CAAC,CAAC;AAFW,QAAA,SAAS,aAEpB","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IResolvedUrl, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport {\n\tcreateOdspUrl,\n\tOdspDriverUrlResolver,\n\tisSpoUrl,\n\tisOdcUrl,\n\tgetOdspUrlParts,\n} from \"@fluidframework/odsp-driver\";\n\n/**\n * @internal\n */\nexport class OdspUrlResolver implements IUrlResolver {\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {\n\t\tif (isOdspUrl(request.url)) {\n\t\t\tconst reqUrl = new URL(request.url);\n\t\t\tconst contents = await getOdspUrlParts(reqUrl);\n\t\t\tif (!contents) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst urlToBeResolved = createOdspUrl({ ...contents, dataStorePath: \"\" });\n\t\t\tconst odspDriverUrlResolver: IUrlResolver = new OdspDriverUrlResolver();\n\t\t\treturn odspDriverUrlResolver.resolve({\n\t\t\t\turl: urlToBeResolved,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic async getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string> {\n\t\tthrow new Error(\"Not implemented\");\n\t}\n}\n\n/**\n * Returns true if the given string is a valid SPO/ODB or ODC URL.\n *\n * @internal\n */\nexport const isOdspUrl = (url: string): boolean => {\n\treturn isSpoUrl(url) || isOdcUrl(url);\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 { IRequest } from \"@fluidframework/core-interfaces\";\nimport {\n\tIContainerPackageInfo,\n\tIResolvedUrl,\n\tIUrlResolver,\n} from \"@fluidframework/driver-definitions\";\nimport {\n\tcreateOdspUrl,\n\tOdspDriverUrlResolver,\n\tisSpoUrl,\n\tisOdcUrl,\n\tgetOdspUrlParts,\n} from \"@fluidframework/odsp-driver\";\nimport { fromBase64ToUtf8 } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IOdspUrlParts } from \"@fluidframework/odsp-driver-definitions\";\n\nconst fluidOfficeAndOneNoteServers = new Set([\n\t\"dev.fluidpreview.office.net\",\n\t\"fluidpreview.office.net\",\n\t\"www.onenote.com\",\n]);\n\n/**\n * @internal\n */\nexport class OdspUrlResolver implements IUrlResolver {\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {\n\t\tif (isOdspUrl(request.url)) {\n\t\t\tconst reqUrl = new URL(request.url);\n\t\t\tconst contents = await getOdspUrlParts(reqUrl);\n\t\t\tif (!contents) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst urlToBeResolved = createOdspUrl({ ...contents, dataStorePath: \"\" });\n\t\t\tconst odspDriverUrlResolver: IUrlResolver = new OdspDriverUrlResolver();\n\t\t\treturn odspDriverUrlResolver.resolve({\n\t\t\t\turl: urlToBeResolved,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic async getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string> {\n\t\tthrow new Error(\"Not implemented\");\n\t}\n}\n\n/**\n * Returns true if the given string is a valid SPO/ODB or ODC URL.\n *\n * @internal\n */\nexport const isOdspUrl = (url: string): boolean => {\n\treturn isSpoUrl(url) || isOdcUrl(url);\n};\n\n/**\n * This class helps to resolve Fluid URLs from Office and OneNote. Construct the resolver class and invoke its resolve function to retrieve the content parameters.\n * @internal\n */\nexport class FluidAppOdspUrlResolver implements IUrlResolver {\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {\n\t\tconst reqUrl = new URL(request.url);\n\t\tconst server = reqUrl.hostname.toLowerCase();\n\t\tlet contents: IOdspUrlParts | undefined;\n\t\tif (fluidOfficeAndOneNoteServers.has(server)) {\n\t\t\tcontents = await initializeFluidOfficeOrOneNote(reqUrl);\n\t\t} else if (server === \"www.office.com\") {\n\t\t\tconst getRequiredParam = (name: string): string => {\n\t\t\t\tconst value = reqUrl.searchParams.get(name);\n\t\t\t\tassert(!!value, 0x097 /* Missing param from office.com URL parameter */);\n\t\t\t\treturn value;\n\t\t\t};\n\t\t\tcontents = {\n\t\t\t\tdriveId: getRequiredParam(\"drive\"),\n\t\t\t\titemId: getRequiredParam(\"item\"),\n\t\t\t\tsiteUrl: getRequiredParam(\"siteUrl\"),\n\t\t\t};\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (!contents) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst urlToBeResolved = createOdspUrl({ ...contents, dataStorePath: \"\" });\n\t\tconst odspDriverUrlResolver: IUrlResolver = new OdspDriverUrlResolver();\n\t\treturn odspDriverUrlResolver.resolve({ url: urlToBeResolved });\n\t}\n\n\t// TODO: Issue-2109 Implement detach container api or put appropriate comment.\n\tpublic async getAbsoluteUrl(\n\t\tresolvedUrl: IResolvedUrl,\n\t\trelativeUrl: string,\n\t\tpackageInfoSource?: IContainerPackageInfo,\n\t): Promise<string> {\n\t\tthrow new Error(\"Not implemented\");\n\t}\n}\n\nasync function initializeFluidOfficeOrOneNote(urlSource: URL): Promise<IOdspUrlParts | undefined> {\n\tconst pathname = urlSource.pathname;\n\tconst siteDriveItemMatch = pathname.match(\n\t\t/\\/(p|preview|meetingnotes|notes)\\/([^/]*)\\/([^/]*)\\/([^/]*)/,\n\t);\n\tif (siteDriveItemMatch === null) {\n\t\treturn undefined;\n\t}\n\n\tconst site = decodeURIComponent(siteDriveItemMatch[2]);\n\n\t// Path value is base64 encoded so need to decode first\n\tconst decodedSite = fromBase64ToUtf8(site);\n\n\t// Site value includes storage type\n\tconst storageType = decodedSite.split(\":\")[0];\n\tconst expectedStorageType = \"spo\"; // Only support spo for now\n\tif (storageType !== expectedStorageType) {\n\t\tthrow new Error(`Unexpected storage type ${storageType}, expected: ${expectedStorageType}`);\n\t}\n\n\t// Since we have the drive and item, only take the host ignore the rest\n\tconst siteUrl = decodedSite.slice(Math.max(0, storageType.length + 1));\n\tconst driveId = decodeURIComponent(siteDriveItemMatch[3]);\n\tconst itemId = decodeURIComponent(siteDriveItemMatch[4]);\n\treturn { siteUrl, driveId, itemId };\n}\n"]}
package/lib/index.d.ts 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 { isOdspUrl, FluidAppOdspUrlResolver, OdspUrlResolver } 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,SAAS,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
@@ -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 { isOdspUrl, OdspUrlResolver } from "./urlResolver.mjs";
6
- //# sourceMappingURL=index.mjs.map
5
+ export { isOdspUrl, FluidAppOdspUrlResolver, OdspUrlResolver } 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,EAAE,SAAS,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { isOdspUrl, FluidAppOdspUrlResolver, OdspUrlResolver } from \"./urlResolver.js\";\n"]}
@@ -1,13 +1,12 @@
1
+ import { IContainerPackageInfo } from '@fluidframework/driver-definitions';
1
2
  import { IRequest } from '@fluidframework/core-interfaces';
2
3
  import { IResolvedUrl } from '@fluidframework/driver-definitions';
3
4
  import { IUrlResolver } from '@fluidframework/driver-definitions';
4
5
 
5
- /* Excluded from this release type: IResolvedUrl */
6
+ /* Excluded from this release type: FluidAppOdspUrlResolver */
6
7
 
7
8
  /* Excluded from this release type: isOdspUrl */
8
9
 
9
- /* Excluded from this release type: IUrlResolver */
10
-
11
10
  /* Excluded from this release type: OdspUrlResolver */
12
11
 
13
12
  export { }
@@ -1,7 +1,12 @@
1
+ import { IContainerPackageInfo } from '@fluidframework/driver-definitions';
1
2
  import { IRequest } from '@fluidframework/core-interfaces';
2
3
  import { IResolvedUrl } from '@fluidframework/driver-definitions';
3
4
  import { IUrlResolver } from '@fluidframework/driver-definitions';
4
5
 
6
+ /* Excluded from this release type: FluidAppOdspUrlResolver */
7
+
8
+ /* Excluded from this release type: IContainerPackageInfo */
9
+
5
10
  /* Excluded from this release type: IResolvedUrl */
6
11
 
7
12
  /* Excluded from this release type: isOdspUrl */
@@ -0,0 +1,18 @@
1
+ import { IContainerPackageInfo } from '@fluidframework/driver-definitions';
2
+ import { IRequest } from '@fluidframework/core-interfaces';
3
+ import { IResolvedUrl } from '@fluidframework/driver-definitions';
4
+ import { IUrlResolver } from '@fluidframework/driver-definitions';
5
+
6
+ /* Excluded from this release type: FluidAppOdspUrlResolver */
7
+
8
+ /* Excluded from this release type: IContainerPackageInfo */
9
+
10
+ /* Excluded from this release type: IResolvedUrl */
11
+
12
+ /* Excluded from this release type: isOdspUrl */
13
+
14
+ /* Excluded from this release type: IUrlResolver */
15
+
16
+ /* Excluded from this release type: OdspUrlResolver */
17
+
18
+ export { }
@@ -1,7 +1,17 @@
1
+ import { IContainerPackageInfo } from '@fluidframework/driver-definitions';
1
2
  import { IRequest } from '@fluidframework/core-interfaces';
2
3
  import { IResolvedUrl } from '@fluidframework/driver-definitions';
3
4
  import { IUrlResolver } from '@fluidframework/driver-definitions';
4
5
 
6
+ /**
7
+ * This class helps to resolve Fluid URLs from Office and OneNote. Construct the resolver class and invoke its resolve function to retrieve the content parameters.
8
+ * @internal
9
+ */
10
+ export declare class FluidAppOdspUrlResolver implements IUrlResolver {
11
+ resolve(request: IRequest): Promise<IResolvedUrl | undefined>;
12
+ getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string, packageInfoSource?: IContainerPackageInfo): Promise<string>;
13
+ }
14
+
5
15
  /**
6
16
  * Returns true if the given string is a valid SPO/ODB or ODC URL.
7
17
  *
@@ -0,0 +1,19 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "node:assert";
6
+ import { FluidAppOdspUrlResolver } from "../urlResolver.js";
7
+ describe("Fluid App Url Resolver", () => {
8
+ it("Should resolve the Fluid app urls correctly", async () => {
9
+ const urlResolver = new FluidAppOdspUrlResolver();
10
+ const resolved = (await urlResolver.resolve({
11
+ url: "https://dev.fluidpreview.office.net/p/c3BvOmh0dHBzOi8vbWljcm9zb2Z0LnNoYXJlcG9pbnQtZGYuY29tL3RlYW1zL09mZmljZU9ubGluZVByYWd1ZQ%3D%3D/randomDrive/randomItem/OXO-Dogfood-remaining-items?nav=&e=_Ha3TtNhQEaX-jy2yOQM3A&at=15&scriptVersion=3016031",
12
+ }));
13
+ assert.equal(resolved.driveId, "randomDrive", "Drive id does not match");
14
+ assert.equal(resolved.itemId, "randomItem", "Item id does not match");
15
+ assert.equal(resolved.siteUrl, "https://microsoft.sharepoint-df.com/teams/OfficeOnlinePrague", "Site id does not match");
16
+ assert.equal(resolved.endpoints.snapshotStorageUrl, "https://microsoft.sharepoint-df.com/_api/v2.1/drives/randomDrive/items/randomItem/opStream/snapshots", "SnashotStorageUrl does not match");
17
+ });
18
+ });
19
+ //# sourceMappingURL=fluidAppUrlResolver.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluidAppUrlResolver.spec.js","sourceRoot":"","sources":["../../src/test/fluidAppUrlResolver.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,WAAW,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC;YAC3C,GAAG,EAAE,iPAAiP;SACtP,CAAC,CAAqB,CAAC;QACxB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,yBAAyB,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,wBAAwB,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CACX,QAAQ,CAAC,OAAO,EAChB,8DAA8D,EAC9D,wBAAwB,CACxB,CAAC;QACF,MAAM,CAAC,KAAK,CACX,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EACrC,sGAAsG,EACtG,kCAAkC,CAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport { FluidAppOdspUrlResolver } from \"../urlResolver.js\";\n\ndescribe(\"Fluid App Url Resolver\", () => {\n\tit(\"Should resolve the Fluid app urls correctly\", async () => {\n\t\tconst urlResolver = new FluidAppOdspUrlResolver();\n\t\tconst resolved = (await urlResolver.resolve({\n\t\t\turl: \"https://dev.fluidpreview.office.net/p/c3BvOmh0dHBzOi8vbWljcm9zb2Z0LnNoYXJlcG9pbnQtZGYuY29tL3RlYW1zL09mZmljZU9ubGluZVByYWd1ZQ%3D%3D/randomDrive/randomItem/OXO-Dogfood-remaining-items?nav=&e=_Ha3TtNhQEaX-jy2yOQM3A&at=15&scriptVersion=3016031\",\n\t\t})) as IOdspResolvedUrl;\n\t\tassert.equal(resolved.driveId, \"randomDrive\", \"Drive id does not match\");\n\t\tassert.equal(resolved.itemId, \"randomItem\", \"Item id does not match\");\n\t\tassert.equal(\n\t\t\tresolved.siteUrl,\n\t\t\t\"https://microsoft.sharepoint-df.com/teams/OfficeOnlinePrague\",\n\t\t\t\"Site id does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tresolved.endpoints.snapshotStorageUrl,\n\t\t\t\"https://microsoft.sharepoint-df.com/_api/v2.1/drives/randomDrive/items/randomItem/opStream/snapshots\",\n\t\t\t\"SnashotStorageUrl does not match\",\n\t\t);\n\t});\n});\n"]}
@@ -0,0 +1,29 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "node:assert";
6
+ import { OdspUrlResolver } from "../urlResolver.js";
7
+ describe("Spo Url Resolver", () => {
8
+ it("Should resolve the spo urls correctly", async () => {
9
+ const urlResolver = new OdspUrlResolver();
10
+ const url = "https://microsoft-my.sharepoint-df.com/_api/v2.1/drives/randomDrive/items/randomItem";
11
+ const resolved = (await urlResolver.resolve({ url }));
12
+ assert.equal(resolved.driveId, "randomDrive", "Drive id does not match");
13
+ assert.equal(resolved.itemId, "randomItem", "Item id does not match");
14
+ assert.equal(resolved.siteUrl, url, "Site id does not match");
15
+ assert.equal(resolved.endpoints.snapshotStorageUrl, `${url}/opStream/snapshots`, "SnashotStorageUrl does not match");
16
+ assert.equal(resolved.url, `https://placeholder/placeholder/${resolved.hashedDocumentId}/`, "fluid url does not match");
17
+ });
18
+ it("Should resolve the other tenant spo url correctly", async () => {
19
+ const urlResolver = new OdspUrlResolver();
20
+ const url = "https://random.sharepoint.com/_api/v2.1/drives/randomDrive/items/randomItem";
21
+ const resolved = (await urlResolver.resolve({ url }));
22
+ assert.equal(resolved.driveId, "randomDrive", "Drive id does not match");
23
+ assert.equal(resolved.itemId, "randomItem", "Item id does not match");
24
+ assert.equal(resolved.siteUrl, url, "Site id does not match");
25
+ assert.equal(resolved.endpoints.snapshotStorageUrl, `${url}/opStream/snapshots`, "SnashotStorageUrl does not match");
26
+ assert.equal(resolved.url, `https://placeholder/placeholder/${resolved.hashedDocumentId}/`, "fluid url does not match");
27
+ });
28
+ });
29
+ //# sourceMappingURL=spoUrlResolver.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spoUrlResolver.spec.js","sourceRoot":"","sources":["../../src/test/spoUrlResolver.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1C,MAAM,GAAG,GACR,sFAAsF,CAAC;QACxF,MAAM,QAAQ,GAAG,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,CAAqB,CAAC;QAC1E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,yBAAyB,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,wBAAwB,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CACX,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EACrC,GAAG,GAAG,qBAAqB,EAC3B,kCAAkC,CAClC,CAAC;QACF,MAAM,CAAC,KAAK,CACX,QAAQ,CAAC,GAAG,EACZ,mCAAmC,QAAQ,CAAC,gBAAgB,GAAG,EAC/D,0BAA0B,CAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1C,MAAM,GAAG,GACR,6EAA6E,CAAC;QAC/E,MAAM,QAAQ,GAAG,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,CAAqB,CAAC;QAC1E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,yBAAyB,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,wBAAwB,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CACX,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EACrC,GAAG,GAAG,qBAAqB,EAC3B,kCAAkC,CAClC,CAAC;QACF,MAAM,CAAC,KAAK,CACX,QAAQ,CAAC,GAAG,EACZ,mCAAmC,QAAQ,CAAC,gBAAgB,GAAG,EAC/D,0BAA0B,CAC1B,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspUrlResolver } from \"../urlResolver.js\";\n\ndescribe(\"Spo Url Resolver\", () => {\n\tit(\"Should resolve the spo urls correctly\", async () => {\n\t\tconst urlResolver = new OdspUrlResolver();\n\t\tconst url: string =\n\t\t\t\"https://microsoft-my.sharepoint-df.com/_api/v2.1/drives/randomDrive/items/randomItem\";\n\t\tconst resolved = (await urlResolver.resolve({ url })) as IOdspResolvedUrl;\n\t\tassert.equal(resolved.driveId, \"randomDrive\", \"Drive id does not match\");\n\t\tassert.equal(resolved.itemId, \"randomItem\", \"Item id does not match\");\n\t\tassert.equal(resolved.siteUrl, url, \"Site id does not match\");\n\t\tassert.equal(\n\t\t\tresolved.endpoints.snapshotStorageUrl,\n\t\t\t`${url}/opStream/snapshots`,\n\t\t\t\"SnashotStorageUrl does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tresolved.url,\n\t\t\t`https://placeholder/placeholder/${resolved.hashedDocumentId}/`,\n\t\t\t\"fluid url does not match\",\n\t\t);\n\t});\n\n\tit(\"Should resolve the other tenant spo url correctly\", async () => {\n\t\tconst urlResolver = new OdspUrlResolver();\n\t\tconst url: string =\n\t\t\t\"https://random.sharepoint.com/_api/v2.1/drives/randomDrive/items/randomItem\";\n\t\tconst resolved = (await urlResolver.resolve({ url })) as IOdspResolvedUrl;\n\t\tassert.equal(resolved.driveId, \"randomDrive\", \"Drive id does not match\");\n\t\tassert.equal(resolved.itemId, \"randomItem\", \"Item id does not match\");\n\t\tassert.equal(resolved.siteUrl, url, \"Site id does not match\");\n\t\tassert.equal(\n\t\t\tresolved.endpoints.snapshotStorageUrl,\n\t\t\t`${url}/opStream/snapshots`,\n\t\t\t\"SnashotStorageUrl does not match\",\n\t\t);\n\t\tassert.equal(\n\t\t\tresolved.url,\n\t\t\t`https://placeholder/placeholder/${resolved.hashedDocumentId}/`,\n\t\t\t\"fluid url does not match\",\n\t\t);\n\t});\n});\n"]}
@@ -0,0 +1,6 @@
1
+ use_current_ClassDeclaration_OdspUrlResolver(get_old_ClassDeclaration_OdspUrlResolver());
2
+ use_old_ClassDeclaration_OdspUrlResolver(get_current_ClassDeclaration_OdspUrlResolver());
3
+ use_current_VariableDeclaration_isOdspUrl(get_old_VariableDeclaration_isOdspUrl());
4
+ use_old_VariableDeclaration_isOdspUrl(get_current_VariableDeclaration_isOdspUrl());
5
+ export {};
6
+ //# sourceMappingURL=validateOdspUrlresolverPrevious.generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateOdspUrlresolverPrevious.generated.js","sourceRoot":"","sources":["../../../src/test/types/validateOdspUrlresolverPrevious.generated.ts"],"names":[],"mappings":"AAgCA,4CAA4C,CACxC,wCAAwC,EAAE,CAAC,CAAC;AAWhD,wCAAwC,CACpC,4CAA4C,EAAE,CAAC,CAAC;AAWpD,yCAAyC,CACrC,qCAAqC,EAAE,CAAC,CAAC;AAW7C,qCAAqC,CACjC,yCAAyC,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/odsp-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* \"ClassDeclaration_OdspUrlResolver\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_ClassDeclaration_OdspUrlResolver():\n TypeOnly<old.OdspUrlResolver>;\ndeclare function use_current_ClassDeclaration_OdspUrlResolver(\n use: TypeOnly<current.OdspUrlResolver>): void;\nuse_current_ClassDeclaration_OdspUrlResolver(\n get_old_ClassDeclaration_OdspUrlResolver());\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_OdspUrlResolver\": {\"backCompat\": false}\n*/\ndeclare function get_current_ClassDeclaration_OdspUrlResolver():\n TypeOnly<current.OdspUrlResolver>;\ndeclare function use_old_ClassDeclaration_OdspUrlResolver(\n use: TypeOnly<old.OdspUrlResolver>): void;\nuse_old_ClassDeclaration_OdspUrlResolver(\n get_current_ClassDeclaration_OdspUrlResolver());\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* \"VariableDeclaration_isOdspUrl\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_VariableDeclaration_isOdspUrl():\n TypeOnly<typeof old.isOdspUrl>;\ndeclare function use_current_VariableDeclaration_isOdspUrl(\n use: TypeOnly<typeof current.isOdspUrl>): void;\nuse_current_VariableDeclaration_isOdspUrl(\n get_old_VariableDeclaration_isOdspUrl());\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* \"VariableDeclaration_isOdspUrl\": {\"backCompat\": false}\n*/\ndeclare function get_current_VariableDeclaration_isOdspUrl():\n TypeOnly<typeof current.isOdspUrl>;\ndeclare function use_old_VariableDeclaration_isOdspUrl(\n use: TypeOnly<typeof old.isOdspUrl>): void;\nuse_old_VariableDeclaration_isOdspUrl(\n get_current_VariableDeclaration_isOdspUrl());\n"]}
@@ -0,0 +1,28 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { IRequest } from "@fluidframework/core-interfaces";
6
+ import { IContainerPackageInfo, IResolvedUrl, IUrlResolver } from "@fluidframework/driver-definitions";
7
+ /**
8
+ * @internal
9
+ */
10
+ export declare class OdspUrlResolver implements IUrlResolver {
11
+ resolve(request: IRequest): Promise<IResolvedUrl | undefined>;
12
+ getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string>;
13
+ }
14
+ /**
15
+ * Returns true if the given string is a valid SPO/ODB or ODC URL.
16
+ *
17
+ * @internal
18
+ */
19
+ export declare const isOdspUrl: (url: string) => boolean;
20
+ /**
21
+ * This class helps to resolve Fluid URLs from Office and OneNote. Construct the resolver class and invoke its resolve function to retrieve the content parameters.
22
+ * @internal
23
+ */
24
+ export declare class FluidAppOdspUrlResolver implements IUrlResolver {
25
+ resolve(request: IRequest): Promise<IResolvedUrl | undefined>;
26
+ getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string, packageInfoSource?: IContainerPackageInfo): Promise<string>;
27
+ }
28
+ //# sourceMappingURL=urlResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urlResolver.d.ts","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EACN,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,MAAM,oCAAoC,CAAC;AAkB5C;;GAEG;AACH,qBAAa,eAAgB,YAAW,YAAY;IACtC,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAiB7D,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG5F;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,OAEvC,CAAC;AAEF;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,YAAY;IAC9C,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IA6B7D,cAAc,CAC1B,WAAW,EAAE,YAAY,EACzB,WAAW,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,MAAM,CAAC;CAGlB"}
@@ -0,0 +1,105 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { createOdspUrl, OdspDriverUrlResolver, isSpoUrl, isOdcUrl, getOdspUrlParts, } from "@fluidframework/odsp-driver";
6
+ import { fromBase64ToUtf8 } from "@fluid-internal/client-utils";
7
+ import { assert } from "@fluidframework/core-utils";
8
+ const fluidOfficeAndOneNoteServers = new Set([
9
+ "dev.fluidpreview.office.net",
10
+ "fluidpreview.office.net",
11
+ "www.onenote.com",
12
+ ]);
13
+ /**
14
+ * @internal
15
+ */
16
+ export class OdspUrlResolver {
17
+ async resolve(request) {
18
+ if (isOdspUrl(request.url)) {
19
+ const reqUrl = new URL(request.url);
20
+ const contents = await getOdspUrlParts(reqUrl);
21
+ if (!contents) {
22
+ return undefined;
23
+ }
24
+ const urlToBeResolved = createOdspUrl({ ...contents, dataStorePath: "" });
25
+ const odspDriverUrlResolver = new OdspDriverUrlResolver();
26
+ return odspDriverUrlResolver.resolve({
27
+ url: urlToBeResolved,
28
+ headers: request.headers,
29
+ });
30
+ }
31
+ return undefined;
32
+ }
33
+ async getAbsoluteUrl(resolvedUrl, relativeUrl) {
34
+ throw new Error("Not implemented");
35
+ }
36
+ }
37
+ /**
38
+ * Returns true if the given string is a valid SPO/ODB or ODC URL.
39
+ *
40
+ * @internal
41
+ */
42
+ export const isOdspUrl = (url) => {
43
+ return isSpoUrl(url) || isOdcUrl(url);
44
+ };
45
+ /**
46
+ * This class helps to resolve Fluid URLs from Office and OneNote. Construct the resolver class and invoke its resolve function to retrieve the content parameters.
47
+ * @internal
48
+ */
49
+ export class FluidAppOdspUrlResolver {
50
+ async resolve(request) {
51
+ const reqUrl = new URL(request.url);
52
+ const server = reqUrl.hostname.toLowerCase();
53
+ let contents;
54
+ if (fluidOfficeAndOneNoteServers.has(server)) {
55
+ contents = await initializeFluidOfficeOrOneNote(reqUrl);
56
+ }
57
+ else if (server === "www.office.com") {
58
+ const getRequiredParam = (name) => {
59
+ const value = reqUrl.searchParams.get(name);
60
+ assert(!!value, 0x097 /* Missing param from office.com URL parameter */);
61
+ return value;
62
+ };
63
+ contents = {
64
+ driveId: getRequiredParam("drive"),
65
+ itemId: getRequiredParam("item"),
66
+ siteUrl: getRequiredParam("siteUrl"),
67
+ };
68
+ }
69
+ else {
70
+ return undefined;
71
+ }
72
+ if (!contents) {
73
+ return undefined;
74
+ }
75
+ const urlToBeResolved = createOdspUrl({ ...contents, dataStorePath: "" });
76
+ const odspDriverUrlResolver = new OdspDriverUrlResolver();
77
+ return odspDriverUrlResolver.resolve({ url: urlToBeResolved });
78
+ }
79
+ // TODO: Issue-2109 Implement detach container api or put appropriate comment.
80
+ async getAbsoluteUrl(resolvedUrl, relativeUrl, packageInfoSource) {
81
+ throw new Error("Not implemented");
82
+ }
83
+ }
84
+ async function initializeFluidOfficeOrOneNote(urlSource) {
85
+ const pathname = urlSource.pathname;
86
+ const siteDriveItemMatch = pathname.match(/\/(p|preview|meetingnotes|notes)\/([^/]*)\/([^/]*)\/([^/]*)/);
87
+ if (siteDriveItemMatch === null) {
88
+ return undefined;
89
+ }
90
+ const site = decodeURIComponent(siteDriveItemMatch[2]);
91
+ // Path value is base64 encoded so need to decode first
92
+ const decodedSite = fromBase64ToUtf8(site);
93
+ // Site value includes storage type
94
+ const storageType = decodedSite.split(":")[0];
95
+ const expectedStorageType = "spo"; // Only support spo for now
96
+ if (storageType !== expectedStorageType) {
97
+ throw new Error(`Unexpected storage type ${storageType}, expected: ${expectedStorageType}`);
98
+ }
99
+ // Since we have the drive and item, only take the host ignore the rest
100
+ const siteUrl = decodedSite.slice(Math.max(0, storageType.length + 1));
101
+ const driveId = decodeURIComponent(siteDriveItemMatch[3]);
102
+ const itemId = decodeURIComponent(siteDriveItemMatch[4]);
103
+ return { siteUrl, driveId, itemId };
104
+ }
105
+ //# 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 { IRequest } from \"@fluidframework/core-interfaces\";\nimport {\n\tIContainerPackageInfo,\n\tIResolvedUrl,\n\tIUrlResolver,\n} from \"@fluidframework/driver-definitions\";\nimport {\n\tcreateOdspUrl,\n\tOdspDriverUrlResolver,\n\tisSpoUrl,\n\tisOdcUrl,\n\tgetOdspUrlParts,\n} from \"@fluidframework/odsp-driver\";\nimport { fromBase64ToUtf8 } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IOdspUrlParts } from \"@fluidframework/odsp-driver-definitions\";\n\nconst fluidOfficeAndOneNoteServers = new Set([\n\t\"dev.fluidpreview.office.net\",\n\t\"fluidpreview.office.net\",\n\t\"www.onenote.com\",\n]);\n\n/**\n * @internal\n */\nexport class OdspUrlResolver implements IUrlResolver {\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {\n\t\tif (isOdspUrl(request.url)) {\n\t\t\tconst reqUrl = new URL(request.url);\n\t\t\tconst contents = await getOdspUrlParts(reqUrl);\n\t\t\tif (!contents) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst urlToBeResolved = createOdspUrl({ ...contents, dataStorePath: \"\" });\n\t\t\tconst odspDriverUrlResolver: IUrlResolver = new OdspDriverUrlResolver();\n\t\t\treturn odspDriverUrlResolver.resolve({\n\t\t\t\turl: urlToBeResolved,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic async getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string> {\n\t\tthrow new Error(\"Not implemented\");\n\t}\n}\n\n/**\n * Returns true if the given string is a valid SPO/ODB or ODC URL.\n *\n * @internal\n */\nexport const isOdspUrl = (url: string): boolean => {\n\treturn isSpoUrl(url) || isOdcUrl(url);\n};\n\n/**\n * This class helps to resolve Fluid URLs from Office and OneNote. Construct the resolver class and invoke its resolve function to retrieve the content parameters.\n * @internal\n */\nexport class FluidAppOdspUrlResolver implements IUrlResolver {\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {\n\t\tconst reqUrl = new URL(request.url);\n\t\tconst server = reqUrl.hostname.toLowerCase();\n\t\tlet contents: IOdspUrlParts | undefined;\n\t\tif (fluidOfficeAndOneNoteServers.has(server)) {\n\t\t\tcontents = await initializeFluidOfficeOrOneNote(reqUrl);\n\t\t} else if (server === \"www.office.com\") {\n\t\t\tconst getRequiredParam = (name: string): string => {\n\t\t\t\tconst value = reqUrl.searchParams.get(name);\n\t\t\t\tassert(!!value, 0x097 /* Missing param from office.com URL parameter */);\n\t\t\t\treturn value;\n\t\t\t};\n\t\t\tcontents = {\n\t\t\t\tdriveId: getRequiredParam(\"drive\"),\n\t\t\t\titemId: getRequiredParam(\"item\"),\n\t\t\t\tsiteUrl: getRequiredParam(\"siteUrl\"),\n\t\t\t};\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (!contents) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst urlToBeResolved = createOdspUrl({ ...contents, dataStorePath: \"\" });\n\t\tconst odspDriverUrlResolver: IUrlResolver = new OdspDriverUrlResolver();\n\t\treturn odspDriverUrlResolver.resolve({ url: urlToBeResolved });\n\t}\n\n\t// TODO: Issue-2109 Implement detach container api or put appropriate comment.\n\tpublic async getAbsoluteUrl(\n\t\tresolvedUrl: IResolvedUrl,\n\t\trelativeUrl: string,\n\t\tpackageInfoSource?: IContainerPackageInfo,\n\t): Promise<string> {\n\t\tthrow new Error(\"Not implemented\");\n\t}\n}\n\nasync function initializeFluidOfficeOrOneNote(urlSource: URL): Promise<IOdspUrlParts | undefined> {\n\tconst pathname = urlSource.pathname;\n\tconst siteDriveItemMatch = pathname.match(\n\t\t/\\/(p|preview|meetingnotes|notes)\\/([^/]*)\\/([^/]*)\\/([^/]*)/,\n\t);\n\tif (siteDriveItemMatch === null) {\n\t\treturn undefined;\n\t}\n\n\tconst site = decodeURIComponent(siteDriveItemMatch[2]);\n\n\t// Path value is base64 encoded so need to decode first\n\tconst decodedSite = fromBase64ToUtf8(site);\n\n\t// Site value includes storage type\n\tconst storageType = decodedSite.split(\":\")[0];\n\tconst expectedStorageType = \"spo\"; // Only support spo for now\n\tif (storageType !== expectedStorageType) {\n\t\tthrow new Error(`Unexpected storage type ${storageType}, expected: ${expectedStorageType}`);\n\t}\n\n\t// Since we have the drive and item, only take the host ignore the rest\n\tconst siteUrl = decodedSite.slice(Math.max(0, storageType.length + 1));\n\tconst driveId = decodeURIComponent(siteDriveItemMatch[3]);\n\tconst itemId = decodeURIComponent(siteDriveItemMatch[4]);\n\treturn { siteUrl, driveId, itemId };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/odsp-urlresolver",
3
- "version": "2.0.0-rc.1.0.6",
3
+ "version": "2.0.0-rc.2.0.1",
4
4
  "description": "Url Resolver for odsp urls.",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -11,88 +11,69 @@
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/odsp-urlresolver-alpha.d.mts",
28
- "default": "./lib/index.mjs"
29
- },
30
- "require": {
31
- "types": "./dist/odsp-urlresolver-alpha.d.ts",
32
- "default": "./dist/index.js"
33
- }
34
- },
35
- "./beta": {
26
+ "./public": {
36
27
  "import": {
37
- "types": "./lib/odsp-urlresolver-beta.d.mts",
38
- "default": "./lib/index.mjs"
28
+ "types": "./lib/odsp-urlresolver-public.d.ts",
29
+ "default": "./lib/index.js"
39
30
  },
40
31
  "require": {
41
- "types": "./dist/odsp-urlresolver-beta.d.ts",
32
+ "types": "./dist/odsp-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/odsp-urlresolver-public.d.mts",
58
- "default": "./lib/index.mjs"
59
- },
60
- "require": {
61
- "types": "./dist/odsp-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.6 <2.0.0-rc.1.1.0",
71
- "@fluidframework/driver-definitions": ">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0",
72
- "@fluidframework/odsp-driver": ">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0",
73
- "@fluidframework/odsp-driver-definitions": ">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0"
50
+ "@fluid-internal/client-utils": ">=2.0.0-rc.2.0.1 <2.0.0-rc.2.1.0",
51
+ "@fluidframework/core-interfaces": ">=2.0.0-rc.2.0.1 <2.0.0-rc.2.1.0",
52
+ "@fluidframework/core-utils": ">=2.0.0-rc.2.0.1 <2.0.0-rc.2.1.0",
53
+ "@fluidframework/driver-definitions": ">=2.0.0-rc.2.0.1 <2.0.0-rc.2.1.0",
54
+ "@fluidframework/odsp-driver": ">=2.0.0-rc.2.0.1 <2.0.0-rc.2.1.0",
55
+ "@fluidframework/odsp-driver-definitions": ">=2.0.0-rc.2.0.1 <2.0.0-rc.2.1.0"
74
56
  },
75
57
  "devDependencies": {
76
58
  "@arethetypeswrong/cli": "^0.13.3",
77
- "@fluid-tools/build-cli": "^0.29.0",
59
+ "@fluid-internal/mocha-test-setup": ">=2.0.0-rc.2.0.1 <2.0.0-rc.2.1.0",
60
+ "@fluid-tools/build-cli": "^0.34.0",
78
61
  "@fluidframework/build-common": "^2.0.3",
79
- "@fluidframework/build-tools": "^0.29.0",
80
- "@fluidframework/eslint-config-fluid": "^3.2.0",
81
- "@fluidframework/mocha-test-setup": ">=2.0.0-rc.1.0.6 <2.0.0-rc.1.1.0",
62
+ "@fluidframework/build-tools": "^0.34.0",
63
+ "@fluidframework/eslint-config-fluid": "^4.0.0",
82
64
  "@fluidframework/odsp-urlresolver-previous": "npm:@fluidframework/odsp-urlresolver@2.0.0-internal.8.0.0",
83
- "@microsoft/api-extractor": "^7.38.3",
65
+ "@microsoft/api-extractor": "^7.42.3",
84
66
  "@types/mocha": "^9.1.1",
85
67
  "@types/node": "^18.19.0",
86
68
  "copyfiles": "^2.4.1",
87
69
  "cross-env": "^7.0.3",
88
- "eslint": "~8.50.0",
70
+ "eslint": "~8.55.0",
89
71
  "mocha": "^10.2.0",
90
72
  "mocha-json-output-reporter": "^2.0.1",
91
73
  "mocha-multi-reporters": "^1.5.1",
92
74
  "moment": "^2.21.0",
93
75
  "prettier": "~3.0.3",
94
76
  "rimraf": "^4.4.0",
95
- "tsc-multi": "^1.1.0",
96
77
  "typescript": "~5.1.6"
97
78
  },
98
79
  "fluidBuild": {
@@ -112,14 +93,16 @@
112
93
  },
113
94
  "scripts": {
114
95
  "api": "fluid-build . --task api",
115
- "api-extractor:commonjs": "api-extractor run --local",
116
- "api-extractor:esnext": "api-extractor run --config ./api-extractor-esm.json",
96
+ "api-extractor:commonjs": "api-extractor run --config ./api-extractor-cjs.json",
97
+ "api-extractor:esnext": "api-extractor run --local",
117
98
  "build": "fluid-build . --task build",
118
99
  "build:commonjs": "fluid-build . --task commonjs",
119
100
  "build:compile": "fluid-build . --task compile",
120
101
  "build:docs": "fluid-build . --task api",
121
- "build:esnext": "tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json",
122
- "build:test": "tsc --project ./src/test/tsconfig.json",
102
+ "build:esnext": "tsc --project ./tsconfig.json",
103
+ "build:test": "npm run build:test:esm && npm run build:test:cjs",
104
+ "build:test:cjs": "fluid-tsc commonjs --project ./src/test/tsconfig.cjs.json",
105
+ "build:test:esm": "tsc --project ./src/test/tsconfig.json",
123
106
  "check:are-the-types-wrong": "attw --pack . --entrypoints .",
124
107
  "check:release-tags": "api-extractor run --local --config ./api-extractor-lint.json",
125
108
  "ci:build:docs": "api-extractor run",
@@ -132,9 +115,11 @@
132
115
  "prettier": "prettier --check . --cache --ignore-path ../../../.prettierignore",
133
116
  "prettier:fix": "prettier --write . --cache --ignore-path ../../../.prettierignore",
134
117
  "test": "npm run test:mocha",
135
- "test:mocha": "mocha --ignore \"dist/test/types/*\" --recursive dist/test -r node_modules/@fluidframework/mocha-test-setup",
118
+ "test:mocha": "npm run test:mocha:esm && echo skipping cjs to avoid overhead - npm run test:mocha:cjs",
119
+ "test:mocha:cjs": "mocha --recursive \"dist/test/**/*.spec.*js\" --exit -r node_modules/@fluid-internal/mocha-test-setup",
120
+ "test:mocha:esm": "mocha --recursive \"lib/test/**/*.spec.*js\" --exit -r node_modules/@fluid-internal/mocha-test-setup",
136
121
  "test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
137
- "tsc": "tsc",
122
+ "tsc": "fluid-tsc commonjs --project ./tsconfig.cjs.json && copyfiles -f ../../../common/build/build-common/src/cjs/package.json ./dist",
138
123
  "typetests:gen": "fluid-type-test-generator",
139
124
  "typetests:prepare": "flub typetests --dir . --reset --previous --normalize"
140
125
  }
package/src/index.ts CHANGED
@@ -3,4 +3,4 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- export { isOdspUrl, OdspUrlResolver } from "./urlResolver";
6
+ export { isOdspUrl, FluidAppOdspUrlResolver, OdspUrlResolver } from "./urlResolver.js";
@@ -4,7 +4,11 @@
4
4
  */
5
5
 
6
6
  import { IRequest } from "@fluidframework/core-interfaces";
7
- import { IResolvedUrl, IUrlResolver } from "@fluidframework/driver-definitions";
7
+ import {
8
+ IContainerPackageInfo,
9
+ IResolvedUrl,
10
+ IUrlResolver,
11
+ } from "@fluidframework/driver-definitions";
8
12
  import {
9
13
  createOdspUrl,
10
14
  OdspDriverUrlResolver,
@@ -12,6 +16,15 @@ import {
12
16
  isOdcUrl,
13
17
  getOdspUrlParts,
14
18
  } from "@fluidframework/odsp-driver";
19
+ import { fromBase64ToUtf8 } from "@fluid-internal/client-utils";
20
+ import { assert } from "@fluidframework/core-utils";
21
+ import { IOdspUrlParts } from "@fluidframework/odsp-driver-definitions";
22
+
23
+ const fluidOfficeAndOneNoteServers = new Set([
24
+ "dev.fluidpreview.office.net",
25
+ "fluidpreview.office.net",
26
+ "www.onenote.com",
27
+ ]);
15
28
 
16
29
  /**
17
30
  * @internal
@@ -47,3 +60,74 @@ export class OdspUrlResolver implements IUrlResolver {
47
60
  export const isOdspUrl = (url: string): boolean => {
48
61
  return isSpoUrl(url) || isOdcUrl(url);
49
62
  };
63
+
64
+ /**
65
+ * This class helps to resolve Fluid URLs from Office and OneNote. Construct the resolver class and invoke its resolve function to retrieve the content parameters.
66
+ * @internal
67
+ */
68
+ export class FluidAppOdspUrlResolver implements IUrlResolver {
69
+ public async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {
70
+ const reqUrl = new URL(request.url);
71
+ const server = reqUrl.hostname.toLowerCase();
72
+ let contents: IOdspUrlParts | undefined;
73
+ if (fluidOfficeAndOneNoteServers.has(server)) {
74
+ contents = await initializeFluidOfficeOrOneNote(reqUrl);
75
+ } else if (server === "www.office.com") {
76
+ const getRequiredParam = (name: string): string => {
77
+ const value = reqUrl.searchParams.get(name);
78
+ assert(!!value, 0x097 /* Missing param from office.com URL parameter */);
79
+ return value;
80
+ };
81
+ contents = {
82
+ driveId: getRequiredParam("drive"),
83
+ itemId: getRequiredParam("item"),
84
+ siteUrl: getRequiredParam("siteUrl"),
85
+ };
86
+ } else {
87
+ return undefined;
88
+ }
89
+ if (!contents) {
90
+ return undefined;
91
+ }
92
+ const urlToBeResolved = createOdspUrl({ ...contents, dataStorePath: "" });
93
+ const odspDriverUrlResolver: IUrlResolver = new OdspDriverUrlResolver();
94
+ return odspDriverUrlResolver.resolve({ url: urlToBeResolved });
95
+ }
96
+
97
+ // TODO: Issue-2109 Implement detach container api or put appropriate comment.
98
+ public async getAbsoluteUrl(
99
+ resolvedUrl: IResolvedUrl,
100
+ relativeUrl: string,
101
+ packageInfoSource?: IContainerPackageInfo,
102
+ ): Promise<string> {
103
+ throw new Error("Not implemented");
104
+ }
105
+ }
106
+
107
+ async function initializeFluidOfficeOrOneNote(urlSource: URL): Promise<IOdspUrlParts | undefined> {
108
+ const pathname = urlSource.pathname;
109
+ const siteDriveItemMatch = pathname.match(
110
+ /\/(p|preview|meetingnotes|notes)\/([^/]*)\/([^/]*)\/([^/]*)/,
111
+ );
112
+ if (siteDriveItemMatch === null) {
113
+ return undefined;
114
+ }
115
+
116
+ const site = decodeURIComponent(siteDriveItemMatch[2]);
117
+
118
+ // Path value is base64 encoded so need to decode first
119
+ const decodedSite = fromBase64ToUtf8(site);
120
+
121
+ // Site value includes storage type
122
+ const storageType = decodedSite.split(":")[0];
123
+ const expectedStorageType = "spo"; // Only support spo for now
124
+ if (storageType !== expectedStorageType) {
125
+ throw new Error(`Unexpected storage type ${storageType}, expected: ${expectedStorageType}`);
126
+ }
127
+
128
+ // Since we have the drive and item, only take the host ignore the rest
129
+ const siteUrl = decodedSite.slice(Math.max(0, storageType.length + 1));
130
+ const driveId = decodeURIComponent(siteDriveItemMatch[3]);
131
+ const itemId = decodeURIComponent(siteDriveItemMatch[4]);
132
+ return { siteUrl, driveId, itemId };
133
+ }
@@ -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,12 +1,9 @@
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
  },
12
9
  }
package/lib/index.d.mts DELETED
@@ -1,6 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- export { isOdspUrl, OdspUrlResolver } from "./urlResolver.mjs";
6
- //# sourceMappingURL=index.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAE,SAAS,EAAE,eAAe,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,EAAE,SAAS,EAAE,eAAe,EAAE","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { isOdspUrl, OdspUrlResolver } from \"./urlResolver\";\n"]}
@@ -1,9 +0,0 @@
1
- import { IRequest } from '@fluidframework/core-interfaces';
2
- import { IResolvedUrl } from '@fluidframework/driver-definitions';
3
- import { IUrlResolver } from '@fluidframework/driver-definitions';
4
-
5
- /* Excluded from this release type: isOdspUrl */
6
-
7
- /* Excluded from this release type: OdspUrlResolver */
8
-
9
- export { }
@@ -1,20 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { IRequest } from "@fluidframework/core-interfaces";
6
- import { IResolvedUrl, IUrlResolver } from "@fluidframework/driver-definitions";
7
- /**
8
- * @internal
9
- */
10
- export declare class OdspUrlResolver implements IUrlResolver {
11
- resolve(request: IRequest): Promise<IResolvedUrl | undefined>;
12
- getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string>;
13
- }
14
- /**
15
- * Returns true if the given string is a valid SPO/ODB or ODC URL.
16
- *
17
- * @internal
18
- */
19
- export declare const isOdspUrl: (url: string) => boolean;
20
- //# sourceMappingURL=urlResolver.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"urlResolver.d.mts","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAE,QAAQ,EAAE,MAAM,iCAAiC;OACnD,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC;AAS/E;;GAEG;AACH,qBAAa,eAAgB,YAAW,YAAY;IACtC,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAiB7D,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG5F;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,OAEvC,CAAC"}
@@ -1,38 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { createOdspUrl, OdspDriverUrlResolver, isSpoUrl, isOdcUrl, getOdspUrlParts, } from "@fluidframework/odsp-driver";
6
- /**
7
- * @internal
8
- */
9
- export class OdspUrlResolver {
10
- async resolve(request) {
11
- if (isOdspUrl(request.url)) {
12
- const reqUrl = new URL(request.url);
13
- const contents = await getOdspUrlParts(reqUrl);
14
- if (!contents) {
15
- return undefined;
16
- }
17
- const urlToBeResolved = createOdspUrl({ ...contents, dataStorePath: "" });
18
- const odspDriverUrlResolver = new OdspDriverUrlResolver();
19
- return odspDriverUrlResolver.resolve({
20
- url: urlToBeResolved,
21
- headers: request.headers,
22
- });
23
- }
24
- return undefined;
25
- }
26
- async getAbsoluteUrl(resolvedUrl, relativeUrl) {
27
- throw new Error("Not implemented");
28
- }
29
- }
30
- /**
31
- * Returns true if the given string is a valid SPO/ODB or ODC URL.
32
- *
33
- * @internal
34
- */
35
- export const isOdspUrl = (url) => {
36
- return isSpoUrl(url) || isOdcUrl(url);
37
- };
38
- //# sourceMappingURL=urlResolver.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"urlResolver.mjs","sourceRoot":"","sources":["../src/urlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAII,EACN,aAAa,EACb,qBAAqB,EACrB,QAAQ,EACR,QAAQ,EACR,eAAe,GACf,MAAM,6BAA6B;AAEpC;;GAEG;AACH,MAAM,OAAO,eAAe;IACpB,KAAK,CAAC,OAAO,CAAC,OAAiB;QACrC,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,EAAE;gBACd,OAAO,SAAS,CAAC;aACjB;YACD,MAAM,eAAe,GAAG,aAAa,CAAC,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM,qBAAqB,GAAiB,IAAI,qBAAqB,EAAE,CAAC;YACxE,OAAO,qBAAqB,CAAC,OAAO,CAAC;gBACpC,GAAG,EAAE,eAAe;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;aACxB,CAAC,CAAC;SACH;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,WAAyB,EAAE,WAAmB;QACzE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAW,EAAE;IACjD,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IResolvedUrl, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport {\n\tcreateOdspUrl,\n\tOdspDriverUrlResolver,\n\tisSpoUrl,\n\tisOdcUrl,\n\tgetOdspUrlParts,\n} from \"@fluidframework/odsp-driver\";\n\n/**\n * @internal\n */\nexport class OdspUrlResolver implements IUrlResolver {\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl | undefined> {\n\t\tif (isOdspUrl(request.url)) {\n\t\t\tconst reqUrl = new URL(request.url);\n\t\t\tconst contents = await getOdspUrlParts(reqUrl);\n\t\t\tif (!contents) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst urlToBeResolved = createOdspUrl({ ...contents, dataStorePath: \"\" });\n\t\t\tconst odspDriverUrlResolver: IUrlResolver = new OdspDriverUrlResolver();\n\t\t\treturn odspDriverUrlResolver.resolve({\n\t\t\t\turl: urlToBeResolved,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic async getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string> {\n\t\tthrow new Error(\"Not implemented\");\n\t}\n}\n\n/**\n * Returns true if the given string is a valid SPO/ODB or ODC URL.\n *\n * @internal\n */\nexport const isOdspUrl = (url: string): boolean => {\n\treturn isSpoUrl(url) || isOdcUrl(url);\n};\n"]}
File without changes